Python网络爬虫的基本原理
什么是爬虫?
请求网站并提取数据的自动化程序。
爬虫基本流程
1:向服务器发起请求
通过HTTP库向目标站点发起请求,即发送一个Request请求可以包含额外的headers等信息,等待服务器的响应。
2:获取响应内容
如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)。
3:解析内容
得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转成Json对象进行解析,可能是二进制数据,可以保存或者进一步处理
4:保存内容
保存形式多样,可以保存成文本、表格,也可以保存至数据库,或者保存成特定格式的文件。
所以爬虫的过程如下图
那什么是Response和Request呢 ?
-
浏览器就发送消息给该网址所在的服务器,这个过程叫做HTTP Request
-
服务器收到浏览器发送的消息后,能够根据浏览器发送的消息,做对应的处理,然后把消息返回(回传)给浏览器。此过程叫做HTTP Response
-
浏览器收到服务器的Response信息后,对这些信息做对应的处理,然后展示。
Request中包含哪些内容?
1:请求方式主要是GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。2:请求URLURL全称是统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一来确定3:请求头包含请求时的头部信息,如User-Agent、Host、Cookies等信息4:请求体请求时额外携带的数据,如表单提交时的表单数据
Response中包含哪些内容?
1:响应状态
常见响应状态码如下:
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。当我们打开一个网页时,如果网页能够返回数据,也就是说影响成功了,一般状态响应码都是200。当然状态响应码,包括很多内容,下面列举了,状态响应码,及其表示的含义,其中加错的是在爬虫中经常遇到的: 100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。 101:转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。 102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 200:请求成功 处理方式:获得响应的内容,进行处理 201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到 202:请求被接受,但处理尚未完成 处理方式:阻塞等待 204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。处理方式:丢弃 300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL 302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL 304:请求的资源未更新 处理方式:丢弃 400:非法请求 处理方式:丢弃 401:未授权 处理方式:丢弃 403:禁止 处理方式:丢弃 404:没有找到 处理方式:丢弃 500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。 501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
2:响应头
如内容类型、内容长度、服务器信息、设置cookies等等 3:响应体 最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等。
我们来举一个例子:
from fake_useragent import UserAgent
import requests
ua=UserAgent()
#请求的网址
url="http://www.baidu.com"
#请求头
headers={"User-Agent":ua.random}
#请求网址
response=requests.get(url=url,headers=headers)
#响应体内容
print(response.text)
#响应状态信息
print(response.status_code)
#响应头信息
print(response.headers)
网络的抓包
简单的网络爬虫首先是给定一个待爬取的URL队列,然后通过抓包的方式,获取数据的真实请求地址。接着采用httpclient模拟浏览器将相应的数据抓取下来(一般是html文件或者是json数据)。由于网页中的内容很多,很复杂,很多内容并不是我们需要的,所以我们需要对其进行解析。针对html的解析很简单,通过Jsoup(Dom解析工具)、正则表达式便可完成。针对Json数据的解析,这里我建议一款快速解析工具fastjson
阿里开源的比较好用,可以尝试一下。
我们能抓到怎样的数据?
1:网页文本 如HTML文档、JSON格式文本等 2:图片文件 获取的是二进制文件,保存为图片格式 3:视频 同为二进制文件,保存为视频格式即可 4:其他 只要能够请求到的,都能够获取到
解析方式
我们一共有六种解析方式
详情请看下图:
为什么我们抓到的有时候和浏览器看到的不一样?
有时候,网页返回是JS动态加载的,直接用请求库访问获取到的是JS代码,不是渲染后的结果。
怎样保存数据?
我们可以把数据储存在数据库中也可以储存在本地,请看下图: