一、说明:
网络爬虫,又名网页蜘蛛或网络机器人,是请求网站并提取数据的自动化程序,爬虫程序只提取网页代码中对我们有用的数据。
二、爬虫基本流程一般分四步
1、发起请求:用程序模拟浏览器通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应。
2、获取响应内容:如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML,Json字符串,二进制数据(如图片视频)等类型。
3、解析内容:得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是Json,可以直接转为Json对象解析,可能是图片或视频等二进制数据,可以做保存或者进一步的处理。
4、保存数据:保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式(图片、视频)的文件。
三、Request(请求)和Response(响应)
浏览器访问一个网站(域名:www.baidu.com)这个站点其实也是运行在一台一直运行着的电脑上的(这个就叫做服务器)
如果一点击回车的话,实际上我的浏览器就向这个服务器发送了一个请求,这个请求里面就包含了一些信息,比如我要请求某某某页面,那么这个流程就是向服务器发送了一个请求,这个服务器收到这个请求就会看你是什么浏览器发过来的,然后服务器经过解析之后呢向浏览器返回一个响应这就是一个Response。这Response里面内容呢就包含一些HTML代码,那么浏览器解析这些代码就是呈现出网页内容了。这个流程就是Request和Response(请求和相应)的一个过程。
Request详解
请求,由客户端向服务端发出,可以分为4部分内容:请求方式(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)
请求方式:主要有GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。
GET请求中的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
GET请求提交的数据最多只有1024字节,而POST方式没有限制。
一般来说,登录时,需要提交用户名和密码,其中包含了敏感信息,使用GET 方法请求的话,密码就会暴露在URL中,造成密码泄露,所以这里最好以POST方式发送。上传文件时,由于文件内容比较大,也会选用POST方式。
请求方法图表总结
方法 | 描述 |
---|---|
GET | 请求页面,并返回页面内容 |
HEAD | 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 大多数用于提交表单或上传文件,数据包含在请求体中 |
PUT | 从客户端向服务器传送的数据取代指定文档中的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | 把服务器当做跳板,让服务器代替客户端访问其他网页 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
请求URL:URL全称统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL唯一来确定。
请求头(键值对的形式):请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie,Referer,User-Agent等。
键 | 值 |
---|---|
Accept | 请求报头域,用于指定客户端可接受哪些类型的信息 |
Accept - Language | 指定客户端可接受的语言类型 |
Accept-Encoding | 指定客户端可接受的内容编码 |
Host | 用于指定请求支援的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP1.1版本开始,请求必须包含此内容 |
Cookie | 也常用复数形式Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是Cookies的功劳。Cookies里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头加上Cookies 并将其返回给服务器,服务器通过Cookies识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登陆之后才能看到的网页内容 |
Referer | 此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应处理,如做来源统计、防盗链处理等 |
User-Agent | 简称UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。再做爬虫时加上此信息,可以伪装为浏览器:如果不加,很容易可能被识别出为爬虫 |
Content-Type | 也叫互联网媒体类型(Internet Media Type)或者MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。例如,text/html 代表HTML格式,image/gif 代表GIF图片,application/json 代表JSON类型 |
更多对应关系可以查看此对照表 | http://tool.oschina.net/commons |
请求体:请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。
常用案例为用户登录,登录之前,我们填写了用户名和密码信息,提交时这些内容就会以表单数据的形式提交给服务器,此时需要注意 Requsest Headers 中指定的Content-Type 为 application/x-www-form-urlencoded。只有设置Content-Type为application/x-www-form-urlencoded,才会以表单数据的形式提交。另外,我们也可以将Content-Type 设置为application/json来提交JSON数据,或者设置为multipart/from-data来上传文件。
以下表列出了Content-Type 与 POST提交数据方式的关系
Content-Type | 提交数据的方式 |
---|---|
application/x-www-form-urlencoded | 表单数据 |
multipart/from-data | 表单文件上传 |
application/json | 序列化JSON数据 |
text/xml | XML数据 |
在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并了解各种请求库的各个参数设置时使用的是那种Content-Type,不然可能会导致POST提交后无法正常响应
Response详解
响应,由服务端返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)、响应体(Response Body)
响应状态:有多种响应状态,如200代表成功、301跳转、404找不到页面、502服务器错误
响应头:如Content-Type、Server、Set-Cookie等。
下面是一些常用的头信息。
应答标识 | 说明 |
---|---|
Date | 标识响应产生的时间 |
Last-Modified | 指定资源的最后修改时间 |
Content-Encoding | 指定响应内容的编码 |
Server | 包含服务器的信息,比如名称、版本号等 |
Content-Type | 文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档,application/x-javascript则代表返回JavaScript文件,image/jpeg则代表返回图片 |
Set-Cookie | 设置Cookies。响应头中的Set-Cookie 告诉浏览器需要将此内容放在Cookies中,下次请求携带Cookies请求 |
Expires | 指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间 |
响应体:最主要的部分,响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据。爬虫请求网页后,要解析的内容就是响应体。
四、能抓取哪些数据
网页文本:如HTML文档、Json格式文本等。
图片:获取到的是二进制文件,保存为图片格式。
视频:同为二进制文件,保存为视频格式即可。
And so on:只要是能请求到的,都能获取。
五、解析方式
直接处理
Json解析
正则表达式
BeautifulSoup
PyQuery
XPath
六、抓取中出现的问题
网页通过浏览器的解析,加载CSS与JS等文件对网页进行解析渲染,达到我们看到绚丽的网页,而我们抓到的文件只是一些代码,css文件无法调用,使得样式不能表现出来,那么网页就会出现错位等等问题。
解决JavaScript渲染的问题
分析Ajax请求、Selenium/WebDriver、Splash、PyV8、Ghost.py等库
七、保存数据
文本:纯文本、Json、Xml等。
关系型数据库:如MySQL、Oracle、SQL Server等具有结构化表结构形式存储。
非关系型数据库:如MongoDB、Redis等Key-Value形式存储。
二进制文件:
如图片、视频、音频等等直接保存成特定格式即可。