Python-玩转数据-爬虫的基本原理

Python-玩转数据-爬虫基本原理

一、说明:
网络爬虫,又名网页蜘蛛或网络机器人,是请求网站并提取数据的自动化程序,爬虫程序只提取网页代码中对我们有用的数据。

二、爬虫基本流程一般分四步

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形式存储。
二进制文件:
如图片、视频、音频等等直接保存成特定格式即可。

你可能感兴趣的:(爬虫,python,http)