简介
上篇Python爬虫爬取动态页面思路+实例(一)提到,爬取动态页面有两种方法
- 分析页面请求
- selenium模拟浏览器行为(这篇介绍这个)
理论上来讲,这种方法可以应对各种动态加载,因为模拟人的行为嘛,如果人自己用浏览器来看网页都加载不出数据来,这网站吃枣药丸。但是它的显著缺点就是——慢。所以一般情况下,这是一种万不得已的方法。
selenium是一种自动化测试的工具(话说这方面我并不懂),懂自动化测试的同学不用我介绍,不懂的同学,跟着我的思路走就好了,不影响我们写爬虫。
如何安装selenium我就不介绍了,网上很多教程,如果你在调用Firefox的时候出现了问题,那么请留意一下本文参考资料1。
首先说一下整体的思路,我们知道,动态加载的数据都是用户通过鼠标或键盘执行了一定的动作之后加载出来的。所以我们通过selenium提供的webdriver工具调用本地的浏览器,让程序替代人的行为,滚动页面,点击按钮,提交表单等等。从而获取到想要的数据。所以我认为,使用selenium方法爬取动态页面的中心思想是模拟人的行为。
这里举一个例子,爬取自己QQ空间的说说。
说说
在模拟人的行为的中心思想指导下,我们首先来一步一步的分析出,人都需要做什么。这个过程中不放代码了,代码最后贴出来,注释也很详细,不想看分析的直接看代码也OK。
百度qq空间,进入qq空间的登陆页面,发现默认是快速登陆方式,所以得先点击账号密码登陆,检查元素,发现这个按钮有id,好办。得出第一步:点击账号密码登陆。
点过之后,该填写表单了,填完之后点击登陆按钮,这里的帐号密码框和登陆按钮通过检查元素也可以发现都是有id的,获取很方便。第二步:填写表单并点击登陆按钮。
登陆成功后就进入了最近消息的页面,然后找到说说按钮,点进去(你的空间主题可能跟我不一样,不过点进去的url除了qq号部分不同,其它地方应该是相同的)。
可以看到说说页的url格式是
1 | http://user.qq.com/qq号/311 |
第三步:找到说说所在的url
然后我们就下拉滚动条,可以直观的看到说说是动态加载的,大概加载个四五次,就出现了分页的按钮。而且检查元素后发现十分感人,“下一页”按钮也有id。
不过注意了,经过我的分析,这个id会随着你的点击次数逐次加一,不妨试一下,下两张图是没点过和点过一次的id。
得出第四步:拖到页面末尾,点击“下一页”。
当页面到达最后一页,”下一页”按钮的id就消失了,也就是说程序里就查不到这个元素了,所以停止就好了。
第五步:重复第四步,直到“下一页”按钮不可点
根据以上得出的五步,再结合一下selenium的简单语法,就能实现获取动态加载的说说的功能。从下面的代码里可以看出,程序的流程就是再模拟我们上面分析的五步。
代码:
几点说明:
- 注意注释中解释的frame的选择问题
- 注意注释中登陆处的手动处理
- 因为QQ空间里的id实在太好用了,我都是用的通过id查找,元素,其实selenium还可以用其它的方式,比如xpath,css等等
- unittest模块是python的一个内置测试模块,详情参考下面的资料5
- 目前我只实现了孤零零的爬说说(而且还没爬回复),如果你实现了爬别人的说说或者自动留言,自动评论等有趣的功能(有空我会搞搞这些),欢迎pull request
- github地址kongtianyi/QQZoneSpider
1 | #coding:utf-8 |
结语
在测试的时候使用selenium+Firefox,在写好了代码实际运行的时候不妨换成selenium+PhantomJS,后者是一个无界面的浏览器,效率会高些。
本人于selenium初窥门径,如有不正确或不清晰之处,请各位大侠不吝批评指正!