admin管理员组

文章数量:1647855

爬虫的概念和作用

  • 概念

    网络爬虫是伪装成客户端与服务端进行数据交互的程序

  • 作用

    1. 数据采集

    2. 搜索引擎

    3. 模拟操作

爬虫原理

伪装成客户端与服务端进行数据交互的程序

网络架构(客户端和服务端)

  1. c/s 即 client server 客户端 服务端

  2. b/s 即 browser server 客户端 服务端

  3. m/s 即 mobile server 客户端 服务端

HTTP协议(数据交互)

HTTP是Hyper Text Transfer Protocol (超文本传输协议) 的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议

目前互联网90%的网络传输都是基于http协议

HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果);ps:使用TCP通信协议的重要原因是基于其面向链接的节点

HTTP请求流程

一次http请求的基本流程是由客户端向服务端发起一次请求(request),而服务器1在接收到以后返回客户端一个响应(response)。所以一次完整的http请求包括请求和响应两部分

URL(网址)

发送http请求时,通过URL对网络资源进行定位。

URL(Uniform Resource Locator): 统一资源定位符。用来标识某一处资源的地址。也即是我们常说的网址,

如果进行数据交互,首先要获取URL去定位所在的资源的位置,然后显示在浏览器上,一个请求一个响应

URL的各个组成部分

HTTP请求格式(请求行,请求头,空行,请求体)

客户端发送一个HTTP请求到服务器的请求消息包括以下部分:请求行,请求头,空行和请求数据

请求行由三部分组成:

  1. 第一部分是请求方法,常见的请求方法有 GET、POST、PUT、DELETE、HEAD

  2. 第二部分是客户端要获取的资源路径

  3. 第三部分是客户端使用的 HTTP 协议版本号

请求方法

虽然HTTP中的请求方法有很多,但是我们主要用到的只有两GET(获取资源)和POST(传输资源)

  1. GET方法

    • 基本介绍:

      • GET是常用的HTTP方法,常用于获取服务器的某个资源,以下几种方式都会触发GET方法的请求

        在浏览器中直接输入URL回车或者点击收藏夹中的链接,此时浏览器就会发送出一个GET请求 HTML中的link、img、script等标签的属性中放一个URL,浏览器也会构造出HTTP GET请求 使用Javascript中带你ajax,也能构造出HTTP GET请求 各种编程语言,只要能够访问网络,就能构造出HTTP GET请求

    • GET请求特点:

      • 首行里面第一部分就是GET URL里面的 query string可以是空,也可以不是空 GET请求的header有若干个键值对结构 GET请求的body一般为空 GET请求示例:搜狗页面请求

  2. POST方法

    • 基本介绍

      • POST方法也是一种常见的方法,用于提交用户输入的数据给服务器(如登陆界面),如以下示例:

        通过HTML中的form标签可以构造POST请求 使用Javascript的ajax可以构造POST请求

    • POST请求特点

      • 首行第一部分就是POST URL里面的query string一般是空的 POST请求的header中有若干个键值对 POST请求的body一般不为空(body的具体数据格式,由header中的Content-Type来描述;body的具体数据长度,由header中的Content-Length来描述)

  3. 其他方法 PUT: 与 POST 相似,但是具有幂等特性,一般用于更新 DELETE: 删除服务器指定资源 OPTIONS: 返回服务器所支持的请求方法 HEAD: 与 GET 类似,只不过响应体不返回,只返回响应头 TRACE: 能显示服务器端收到的请求,测试的时候会用到 CONNECT: 预留,暂无使用

GET和POST本质的区别
  1. GET和POST本质是没有区别的,使用GET的场景完全可以使用POST代替,但是在具体的使用上,还是存在一些细节的区别

  2. GET习惯上会把客户端的数据通过query string来传输(body是空的);POST习惯会把客户端数据通过body来传输(query string 是空的)

  3. GET习惯上用于从服务器获取数据,POST习惯上是客户端给服务器提交数据

  4. 一般情况下,程序员会把GET请求的处理,是现成幂等的;对于POST请求的处理,不要是现成幂等的

  5. GET请求可以被缓存,可以被浏览器保存到收藏夹中;POST请求不能被缓存

什么是幂等?

一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的,换句话说,幂等的方法不应该具有副作用。比如我们去抢购一件物品,如果我们已经抢到了要进行下单,由于很多人都在抢购,所以下单之后,我们发现没有什么反应,因此我们又不断地点击下单,如果最终我们只需要付一件商品的钱,就是幂等的,如果要支付N件商品的钱,就不是幂等的在正确的条件下,GET、HEAD、PUT 和 DELETE 等方法是幂等的;POST 方法不是幂等的

幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同

关于GET请求的URL长度问题的误解

网上有一种错误的解释:GET请求的长度是存在上限的,这个上线有被说成1024k,2048k等等,并且GET请求存在上限的原因是URL的长度存在上线

RFC 2616 标准正确的解释:HTTP协议由RFC 2616 标准定义,该标准中明确说明 "Hypertext Transfer Protocol -- HTTP/1.1," does not specify any requirement for URL length,即没有对 URL 的长度有任何限制

URL长度的取决因素:实际上URL的长度取决于浏览器的实现和HTTP服务器端的实现。在浏览器端,不同的浏览器最大的长度是不同的,但是现在浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的

关于POST比GET更加安全的误解

网上的错误理解:如果实现登录界面,如果使用GET实现登录,GET习惯上把数据放大query string 中,此时就能看到浏览器的URL中显示的当前的用户名和密码,所以就不安全了,而POST习惯上会把数据梵高body中,因此登录就不能直接看到用户名和密码,就会更加安全 正确理解:安全问题取决于是否进行加密以及加密算法的强度,和把数据信息放到query string 和body中无关,因为通过抓包这两部分的数据,我们都可以看见

关于GET只能传输文本数据的误解

网上的错误理解:GET只能传输文本数据,POST传输文本数据,也可以传输二进制数据 正确理解:GET也可以传输二进制数据,虽然不能直接在query string 中传输二进制数据,但是可以针对二进制数据进行urlencode,转码之后就可以放到URL中;GET还可以将二进制数据放到body中

请求头

请求头是客户端向服务器发送请求的补充说明,header整体格式是键值对结构,每一个键值对占一行,键和值之间使用 冒号+空格 进行分割

下面介绍几种常见的报头:

  1. Host Host的值表示服务器主机的地址和端口(地址可以是域名,也可以是IP;端口号可以省略或者手动指定)

  2. Content-Length Content-Length表示body的数据长度,长度单位是字节

  3. Content-Type Content-Type表示body的数据格式,以下介绍三种请求中的数据格式

  4. application/x-www-form-urlencoded:这是form表单提交的数据格式,此时body的格式就类似于 query string (是键值对的结构,键值对之间使用&分割,键与值之间使用=进行分割) multipart/from-data:这是form表单提交的数据格式(需要在from标签上加上 enctyped=“multipart/form-data”),通常用于HTML提交图片或者文件

  5. application/json:此时body数据为json格式,json格式就是源自js的对象格式,用一个{}包含,里面有多个键值对,键值对之间使用逗号进行分割,键和值之间使用冒号分隔

  6. User-Agent User-Agent表示浏览器或者操作系统的属性,简称UA,形如:

    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/91.0.4472.77 Safari/537.36

    Windows NT 10.0; Win64; x64 表示操作系统信息 AppleWebKit/537.36 (KHTML, like Gecko)Chrome/91.0.4472.77 Safari/537.36 表示浏览器信息 UA 在早年是一个非常有用的字段,网站的开发者可以根据它来检测页面的“兼容性”

  7. Referer Referer表示这个页面从哪个页面跳转过来的,这个是一个非常有用的字段

  8. 就比如我们在浏览器中搜素蛋糕,这个时候会跳出很多广告,这些广告是某些厂商投到某个浏览器的,当我们用搜狗点击的,搜狗就会获得这个钱,用百度点击百度就会获得,所以我们就可以根据Referer来判断我们上一个网页是百度还是搜狗我们对点击广告进行抓包,上面Referer就显示是从搜狗跳转过来的

    注意: 如果直接在浏览器中输入 URL 或直接通过收藏夹访问页面时,是没有 Referer 的

  9. Cookie

    Cookie是浏览器提供一种让程序员在本地存储数据的能力

    Cookie中存储的是一个字符串,是键值对结构的,键值对之间使用 ;尽心分割,键和值之间使用=进行分割

    如果没有Cookie直接将要存储的数据保存到客户端浏览器所在的主机的硬盘上,就会出现很大的安全风险,比如当你不小心打开一个不安全的网站,该网站就可能在你的硬盘上写一个病毒程序,那么你的电脑可能就GG了!因此浏览器可能为了保证安全性,就会禁止网页中代码访问主机硬盘(无法在JS中读写文件),因此也就失去持久化存储能力,所以Cookie就是为了解决这个问题

    Cookie这个数据可能是客户端自行通过JS写入的,也可能了来自于服务器在HTTP响应的header中通过Set-Cookie字段给浏览器返回的数据。

    Cookie在浏览器这边是按照域名维度来存储的,例如我们打开搜狗主页,网址左边有一个小锁,就可以找到Cookie

    每次请求都要把该域名下的所有的Cookie通过HTTP请求传给服务器,因此Cookie的储存容量是有限的

请求体

请求体是客户端向服务器提交的数据,比如用户登录时需要提高的账号密码信息。请求头与请求体之间用空行隔开。请求体并不是所有的请求都有的,比如一般的GET都不会带有请求体。

HTTP响应格式(状态行,响应头部,空行和响应正文)

响应行也包含三部分,分别是服务端的 HTTP 版本号、响应状态码、状态说明,

  1. 响应状态码常见有 200、400、404、500、502、304 等等,一般以 2 开头的表示服务器正常响应了客户端请求,4 开头表示客户端的请求有问题,5 开头表示服务器出错了,没法正确处理客户端请求。状态码说明就是对该状态码的一个简短描述。

  2. 第二部分就是响应头,响应头与请求头对应,是服务器对该响应的一些附加说明,比如响应内容的格式是什么,响应内容的长度有多少、什么时间返回给客户端的、甚至还有一些 Cookie 信息也会放在响应头里面。

  3. 第三部分是响应体,它才是真正的响应数据,这些数据其实就是网页的 HTML 源代码。

状态码

状态码表示访问一个页面的结果(如访问成功、失败,还是其他的一些情况),它是一个3位的整数,从 1xx、2xx、3xx、4xx、5xx,分为五个大类,每个大类的含义都不同。以下介绍一些常见的状态码及它的状态码解释

  • 200 OK

    表示访问成功

  • 404 Not Found

    表示没有找到资源:当你发送的请求的URL在服务器中找不到该资源,就会出现404

  • 403 Forbidden

    表示访问被拒绝:有些页面通常需要用户有一定的缺陷才可以访问,如未登录

  • 405 Method Not Allowed

    表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法

  • 500 Internal Not Allowed

    表示服务器出现内部错误:一般是服务器的代码执行过程中遇到一些特殊的情况,造成服务器崩溃可能会产生这个状态码

  • 504 Gateway Timeout

    表示当前服务器负载比较大,服务器处理单挑请求的时耗比较长,就会出现超时的情况

  • 302 Move Temporarily

    表示临时重定向:重定向相当于手机呼号转移功能,如果我们换一个手机号,就可以去办理该呼叫转移业务,让朋友拨打你的旧号码的时候会自动跳转到新的号码

  • 301 Moved Permanently

    表示永久重定向,当浏览器收到这种响应时,后序的请求都会自动改成新的地址

响应报头

响应报头的基本格式和请求报头的格式基本一致,下面介绍下响应报头的Content-Type参数

  1. Content-Type

    Content-Type 表示body的数据格式,以下介绍三种响应中的数据格式

  2. text/html:表示数据格式是 HTML

  3. text/css:表示数据格式是 CSS

  4. application/javascript:表示数据各式是 JavaScript

  5. application/json:表示数据格式是 JSON

爬虫工具和技能

在开发爬虫时,我们需要掌握一些常用的工具和技能来提高效率和质量。

  1. Python编程语言 Python是爬虫开发中常用的编程语言之一,它具有简洁易读、高效快速、丰富的第三方库等优点,非常适合进行数据处理和科学计算。

  2. Beautiful Soup库 Beautiful Soup是Python中的一个HTML解析库,它可以方便地处理HTML标签和属性,支持XPath和CSS Selector等常用的查找方式,提供了灵活易用的API。

  3. Scrapy框架 Scrapy是Python中的一个爬虫框架,它提供了完整的爬虫流程和分布式架构,并支持编写爬虫中间件和管道,方便数据的处理和保存。

  4. 防火墙代理 有些网站可能会对爬虫进行限制或封禁,此时可以使用防火墙代理来隐藏真实IP地址,以免被封禁。

  5. 数据库操作 爬虫获取到的数据可以保存到各种关系型或非关系型数据库中,常用的有MySQL、MongoDB等,需要掌握相应的数据库操作技能。

  6. Requests库 Requests是Python中的一个HTTP库,它非常方便地实现HTTP请求和响应的处理,可以进行GET、POST、Cookie、Session等操作。

爬虫伦理问题

在进行爬虫开发时,需要考虑一些伦理和法律问题。爬虫的滥用可能会对网站造成损害,甚至可能触犯法律。以下是一些爬虫应遵守的基本规范。

  1. 遵守网站协议和规定 在爬取一个网站时,爬虫应遵守该网站的协议和规定,如不得以过度频繁的方式访问网站,不得大量下载网站内容等。

  2. 尊重个人隐私和版权 爬虫应尊重个人隐私和版权,如不得爬取含有个人隐私信息的网页和非公开的版权内容。

  3. 维护数据准确性和安全性 爬虫应维护数据的准确性和安全性,如不得篡改网页内容、盗取用户数据等。

  4. 不损害网站正常运行 爬虫应不损害网站的正常运行,如不得进行DDOS攻击、爬取网站资源过多等。

总之,爬虫开发需要遵守伦理规范和法律法规,尊重网站的权利和用户的隐私,以合法、合理、负责的方式进行数据抓取和处理。

本文标签: 爬虫原理概念