在学习完基本的Python基础以后就可以开始学习如何爬取网络数据了。首先应该知道简单的浏览器http请求机制和网页源代码。
在接触了基本的urllib请求以后基本掌握如何用cookies、proxy、正则表达式;我们利用这些标准库发现比较麻烦和构造复杂,逐想到第三方库,如requests(请求库)beautifulsoup(选择器库)这样我们可以减少很多像标准库那样繁琐的构造,而且代理直接可以加入,headers、cookies也一样可以,非常方便。(headers要随机更换)
那么在爬取的时候发现选择网页标签的时候bs4太慢了而且很不好控制tag,会发现大家都是用lxml比较多,因为其速度很快,lxml是直接调用c的函数;scrapy的选择器也是优先使用lxml,当然也有css选择器。本人习惯了lxml,而且自由度很高。在爬取一般的网页到达这里基本上够用,那么碰到一些js渲染的网页上述方法行不通,那么我们会另辟蹊径去寻找selenuim、phantomjs来解决。
基本上我们都会先获取页面然后用一个for循环来控制滚动条上下来滑动(执行js的document),以获取更多的网页数据,再获取源码,下一步就是像上述正常来获取数据。(对于翻页也是用for循环控制)
我们在这个基础上可以写一个自己使用的类,上面很多相同操作都写好,放入自己电脑里,以后就像第三方库一样直接给出url和xpath、css就可以获取数据。
在成熟以后还是发现存在很多问题,比如走一段时间就会被服务器中断,或是其他异常原因,我们就会选择框架来爬取,比如本人喜欢的scrapy。当然scrapy还是要花些心思才能学好,而在学习scrapy其实就是综合了上述的大部分基础知识。以上都是可以加入多线程和多进程,本身scrapy是默认16个线程,可以用subprocess来控制多进程,有要求的可以维护一个代理池来爬取。
最后一种爬取那就是换语言,很多人是采用Java,本人想说的不是它,而是另外的,那就是Go,这里不细聊go,但是它的速度真的可以和c媲美,想象爬虫用c一样的速度在跑,是什么感觉。我们说go语言以后是趋势,最少在Android时代是,俗话说go语言是网络时代的c。
今天就聊这么多,晚安,各位爬虫爱好者……