写爬虫,是一个很是考验综合实力的活儿。有时候,你垂手可得地就抓取到了想要的数据;有时候,你费尽心思却毫无所获。html
好多Python爬虫的入门教程都是一行代码就把你骗上了“贼船”,等上了贼船才发现,水好深~
好比爬取一个网页能够是很简单的一行代码:ajax
r = requests.get('http://news.baidu.com')
很是的简单,但它的做用也仅仅是爬取一个网页,而一个有用的爬虫远远不止于爬取一个网页。服务器
一个有用的爬虫,只需两个词来衡量:cookie
但要作到这两个词,倒是要下不少功夫。本身下功夫是一方面,也很重要的是你要抓全的目标网站给你出了多少难题。综合起来,就写一个爬虫有多少难度。网络
这里咱们举个新闻爬虫的例子。你们都用过百度的新闻搜索吧,我就拿它的爬虫来说讲实现上的难度。异步
新闻网站基本上不设防,新闻内容都在网页的html代码里了,抓全一个网页基本上就是一行的事情。彷佛听上去很简单,但对于一个搜索引擎级的爬虫,就不那么简单了,要把几千几万家新闻网站的新闻都及时抓取到也不是一件容易的事情。分布式
咱们先看看新闻爬虫的简单流程图:学习
从一些种子网页开始,种子网页每每是一些新闻网站的首页,爬虫抓取网页,从中提取网站URL放到网址池再进行抓取。这样就从几个网页开始,不断扩展到其它网页。爬虫抓取的网页也愈来愈多,提取出的新网网址也会成几何级数增加。网站
如何能在最短期抓取更多网址?搜索引擎
这就是其中一个难度,这不是目标网址带来的,而是对咱们自身自愿的考验:
如何能及时抓取到最新的新闻?
这是效率以外的另外一个难度,如何保证及时性?几千家新闻网站,时刻都在发布最新新闻,爬虫在织网式抓取“旧”新闻的同时,如何兼顾获取“新”新闻呢?
如何存储抓取到的海量新闻?
爬虫织网式的爬取,会把每一个网站几年前几十年前的新闻网页都给翻出来,从而得到海量的网页须要存储。就是存储上的难度。
如何清理提取网内容?
重新闻网页的html里面快速、准确提取想要的信息数据,好比标题、发布时间、正文内容等,这又带来内容提取上的难度。
人是贪婪的,想要的数据无穷尽,可是不少数据不是你轻易就能够得到的。有一大类数据就是须要帐户登陆后才能看到,也就是说,爬虫请求时必须是登陆状态才能抓取数据。
如何获取登陆状态?
前面已经说过了,http协议的性质决定了登陆状态就是一些cookies,那么如何得到登陆状态就是一个很是有难度的问题。
有些网站登陆过程很简单,把帐户、密码发给服务器,服务器验证经过返回表示已登陆的cookies。这样的网站,比较容易实现自动登陆,爬虫运行过程全程无需人工干预,你就有更多时间喝茶、聊天
如何处理验证码?
然而,网站们既然要求你登陆了,他们就不会这么轻易放过你,要作的更绝才能让小猿们善罢甘休,那就是上验证码!
没错,就是变态的验证码!!做为见多识广的老猿,我仍是常常识别不出验证码,惭愧惭愧。
听说,有人雇了一批大妈,进行人工识别验证码;也有,经过图像处理技术,尤为现在火热的深度学习、人工智能的技术,来自动识别验证码。
那么,当你写爬虫时遇到验证码该怎么办?
前面的两个难度,都是靠咱们研究数据加载过程,而后用Python代码能够重现出来,进行抓取的。
而遇到达第三个难度时,研究数据加载过程会让你十分痛苦、近乎崩溃。异步加载流程和服务器来来回回好屡次,最后获得的数据还要经过JavaScript解密才能看到,这都是压垮爬虫者的最后一根稻草。