写爬虫,是一个非常考验综合实力的活儿。有时候,你轻而易举地就抓取到了想要的数据;有时候,你费尽心思却毫无所获。
好多Python爬虫的入门教程都是一行代码就把你骗上了“贼船”,等上了贼船才发现,水好深~
比如爬取一个网页可以是很简单的一行代码:
r = requests.get('http://news.baidu.com')
非常的简单,但它的作用也仅仅是爬取一个网页,而一个有用的爬虫远远不止于爬取一个网页。
一个有用的爬虫,只需两个词来衡量:
数量:能否抓全所有该类数据
效率:抓完所有数据需要多久一天还是一个月
但要做到这两个词,却是要下很多功夫。自己下功夫是一方面爬虫程序,也很重要的是你要抓全的目标网站给你出了多少难题。综合起来,就写一个爬虫有多少难度。
抓取难度一:只需爬取网页但要上规模
这里我们举个新闻爬虫的例子。大家都用过百度的新闻搜索吧,我就拿它的爬虫来讲讲实现上的难度。
新闻网站基本上不设防,新闻内容都在网页的html代码里了,抓全一个网页基本上就是一行的事情。似乎听上去很简单,但对于一个搜索引擎级的爬虫,就不那么简单了,要把几千几万家新闻网站的新闻都及时抓取到也不是一件容易的事情。
我们先看看新闻爬虫的简单流程图:
从一些种子网页开始,种子网页往往是一些新闻网站的首页爬虫程序,爬虫抓取网页,从中提取网站URL放到网址池再进行抓取。这样就从几个网页开始,不断扩展到其它网页。爬虫抓取的网页也越来越多,提取出的新网网址也会成几何级数增长。
如何能在最短时间抓取更多网址?
这就是其中一个难度,这不是目标网址带来的,而是对我们自身资源的考验:
我们的带宽够吗
我们的服务器够吗,单台不够就要分布式
如何能及时抓取到最新的新闻?
这是效率之外的另一个难度,如何保证及时性?几千家新闻网站,时刻都在发布最新新闻,爬虫在织网式抓取“旧”新闻的同时,如何兼顾获取“新”新闻呢?
如何存储抓取到的海量新闻?
爬虫织网式的爬取,会把每个网站几年前几十年前的新闻网页都给翻出来,从而获得海量的网页需要存储。就是存储上的难度。
如何清理提取网页内容?
从新闻网页的html里面快速、准确提取想要的信息数据,比如标题、发布时间、正文内容等,这又带来内容提取上的难度。
抓取难度二:需要登录才能抓到数据
人是贪婪的,想要的数据无穷尽,但是很多数据不是你轻易就可以获得的。有一大类数据就是需要账户登录后才能看到,也就是说,爬虫请求时必须是登录状态才能抓取数据。
如何获取登录状态?