一、介绍
1、简介
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
其实通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据。
爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据。
浏览器打开网页的过程:
当你在浏览器中输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器经过解析后发送给用户浏览器结果,包括html,js,css等文件内容,浏览器解析出来最后呈现给用户在浏览器上看到的结果;
所以用户看到的浏览器的结果就是由HTML代码构成的,我们爬虫就是为了获取这些内容,通过分析和过滤html代码,从中获取我们想要资源(文本,图片,视频.....)。
2、流程
爬虫的基本流程:
发起请求
通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应
获取响应内容
如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型
解析内容
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理
保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
什么是Request,Response:
浏览器发送消息给网址所在的服务器,这个过程就叫做HTPP Request。
服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器,这个过程就是HTTP Response。
浏览器收到服务器的Response信息后,会对信息进行相应的处理,然后展示。
3、Request中包含了什么
(1)请求方式
主要有:GET/POST两种类型常用,另外还有HEAD/PUT/DELETE/OPTIONS。
GET和POST的区别就是:请求的数据GET是在url中,POST则是存放在头部。
GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
PUT:向指定资源位置上传其最新内容。
OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
DELETE:请求服务器删除Request-URI所标识的资源。
(2)请求URL
URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL的格式由三个部分组成:
第一部分是协议(或称为服务方式)。
第二部分是存有该资源的主机IP地址(有时也包括端口号)。
第三部分是主机资源的具体地址,如目录和文件名等。
爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据。
(3)请求头
包含请求时的头部信息,如User-Agent,Host,Cookies等信息,下图是请求请求百度时,所有的请求头部信息参数。
(4)请求体
请求是携带的数据,如提交表单数据时候的表单数据(POST)。
4、Response中包含了什么
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
(1)响应状态
有多种响应状态,如:200代表成功,301跳转,404找不到页面,502服务器错误。
1xx消息——请求已被服务器接收,继续处理。
2xx成功——请求已成功被服务器接收、理解、并接受。
3xx重定向——需要后续操作才能完成这一请求。
4xx请求错误——请求含有词法错误或者无法被执行。
5xx服务器错误——服务器在处理某个正确请求时发生错误 。
常见代码:
200 OK 请求成功
301 目标永久性转移
302 目标暂时性转移
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
(2)响应头
如内容类型,类型的长度,服务器信息,设置Cookie,如下图
(3)响应体
最主要的部分,包含请求资源的内容,如网页HTMl,图片,二进制数据等
5、补充
(1)能爬取什么样的数据
网页文本:如HTML文档,Json格式化文本等
图片:获取到的是二进制文件,保存为图片格式
视频:同样是二进制文件
其他:只要请求到的,都可以获取
(2)如何解析数据
直接处理
Json解析
正则表达式处理
BeautifulSoup解析处理
PyQuery解析处理
XPath解析处理
关于抓取的页面数据和浏览器里看到的不一样的问题
出现这种情况是因为,很多网站中的数据都是通过js,ajax动态加载的,所以直接通过get请求获取的页面和浏览器显示的不同。
(3)如何解决js渲染的问题?
分析ajax
Selenium/webdriver
Splash
PyV8,Ghost.py
(4)怎样保存数据
文本:纯文本,Json,Xml等
关系型数据库:如mysql,oracle,sql server等结构化数据库
非关系型数据库:MongoDB,Redis等key-value形式存储
Python2.x 有这些库名可用: urllib,urllib2,urllib3,httplib,httplib2,requests
Python3.x 有这些库名可用: urllib,urllib3,httplib2,requests
爬虫第三方模块:Scrapy、PySpider、Crawley、Portia、Newspaper、Grab、Cola
模块urllib和urllib2的功能差不多,简单来说urllib2是urllib的增强——urllib2更好一些,但是urllib中有urllib2中所没有的函数。对于简单的下载, urllib绰绰有余。 如果需要实现HTTP身份验证或Cookie亦或编写扩展来处理自己的协议,urllib2可能是更好的选择。
urllib支持设置编码的函数urllib.urlencode,在模拟登陆的时候经常需要传递经过post编码之后的参数,如果不想使用第三方库完成模拟登录,就必须使用到标准库中的urllib。urllib提供一些比较原始基础的方法而urllib2并没有,比如urllib中的urlencode方法用来GET查询字符串的产生。
urllib2比较有优势的地方在于urllib2.openurl中可以接受一个Request类的实例来设置Request参数,来修改/设置Header头从而达到控制HTTP Request的header部分的目的,也可以修改用户代理,设置cookie等,但urllib仅可以接受URL。这就意味着,如果你访问一个网站想更改User Agent(可以伪装你的浏览器),你就需要使用urllib2。urllib2模块没有加入urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能,这个时候就需要urllib的辅助。
在Python2.x中主要为urllib和urllib2,这两个标准库是不可相互替代的,因此都是两者搭配使用。但是在Python3.x中将urllib2合并到了urllib,这一点值得注意。
若只使用Python3.x,记住有个urllib的库就行了。Pyhton2.x和Python3.x都有urllib3和requests, 它们不是标准库。urllib3提供线程安全连接池和文件post等支持,与urllib及urllib2的关系不大。requests 自称HTTP for Humans,使用更简洁方便。
Python3.x中将urllib2合并到了urllib,之后此包分成了以下几个模块:
urllib.request 用于打开和读取URL
urllib.error 用于处理前面request引起的异常
urllib.parse 用于解析URL
urllib.robotparser用于解析robots.txt文件
Python3.x中,随着urllib2合入urllib,一些常用的方法也发生了变化:
在Python2.x中使用import urlparse——在Python3.x中会使用import urllib.parse
在Python2.x中使用urllib2.urlopen或urllib.urlopen(已弃用)——在Python3.x中会使用urllib.request.urlopen
在Python2.x中使用urllib2.Request——在Python3.x中会使用urllib.request.Request
在Python2.x中使用urllib.quote——在Python3.x中会使用urllib.request.quote
在Python2.x中使用urllib.urlencode——在Python3.x中会使用urllib.parse.urlencode
在Python2.x中使用cookielib.CookieJar——在Python3.x中会使用http.CookieJar
异常处理:在Python2.x中使用urllib2.URLError,urllib2.HTTPError——在Python3.x中会使用urllib.error.URLError,urllib.error.HTTPError
注:在Python3.3后urllib2已经不能再用,所有urllib2全部用urllib.request来代替。
二、urllib
三、requests
四、scrapy
五、selenium
六、re
七、bs4
八、lxml
九、反爬虫处理
1、url
2、请求方法
3、登录账户密码
4、设置header:
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
5、设置代理
6、设置session和cookie
7、设置验证码