朋友们,你在使用爬虫获取数据时,是否总会遇到动态页面,而不得不去分析get或post请求包信息、手动构造请求、配置大量的参数信息等,来获取动态加载后的数据?在此过程中,代码量变得庞大而臃肿,小伙伴儿们可谓是饱受困扰。
达康书记心里苦
何以解忧?
唯有“ISEC”!
本期邱老师
送大家一个动态页面应对利器:
selenium模块
助大家轻松解除困扰!
开心到飞起
Selenium原本是一个用于Web应用程序测试的工具,主要测试应用程序与浏览器的兼容性。而我们编写爬虫工程时,利用Selenium,就可以通过代码来控制浏览器、模拟真实用户的操作,将复杂的request请求完全交给浏览器来实现,代码本身只需关注页面解析和数据提取即可。
安仔课堂
1.操作必备
系统: Windows7 64 bit
模块:Py + Scrapy + Selenium
IDE :PyCharm
注意:在使用pip安装scrapy模块时,可能会因为PYPI服务器或网络不给力,在安装依赖库时出现timeout异常。此类问题,大家可尝试使用miniconda或者Anaconda来搭建Python集成开发的环境。Selenium除了安装相应的Python模块外,还需安装Chrome浏览器(本文操作,在Chrome浏览器上进行), 同时需下载对应的c, 并复制到系统盘内system32目录下。
2.操作步骤
本文以爬取知乎网站用户为例,来具体介绍 Scrapy + Selenium的使用方法。Selenium的作用主要在于开启一个浏览器加载网页并获取网页源代码数据,Scrapy使用Pipeline技术实现数据的存储。
1. 首先,新建一个scrapy工程,并在工程目录下的spiders文件夹下生成一个z脚本文件。
在ZhihuUserSpider爬虫类中进行一些简单的初始化设置,在parse() 函数中使用selenium模块启动一个浏览器,并加载知乎登录界面URL。
图1. 程序源代码
图2. 运行效果图
2. 成功驱动浏览器并加载页面后,需要定位账号、密码输入框,登录按钮在网页中的元素标签,并获取标签对应的句柄,从而操作句柄实现输入和点击功能。
图3. 页面源代码定位输入框和按钮
Webdriver提供了一系列元素定位方法, 使用较多的定位方式是通过id 、name 、xpath等,其中xpath比较灵活和强大,甚至支持布尔逻辑运算,建议大家可使用xpath进行元素定位,
图4. 定位输入框和按钮
(只需编写三行代码,可实现自动输入和点击······)
图5. 成功输入了账号和密码
图6. 登录成功
3. 使用Selenium模块成功实现登录功能后,我们来看看如果使用一般的爬虫思路来实现登录功能。通过分析登录过程中浏览器发生的请求信息,我们发现了实现登录操作的post请求信息:
图 7. 登录请求包
其中发现一个 “_xsrf” 参数,通过查看、分析登录界面的源代码,可以找到此参数所在位置:
图8. _xsrf参数位置
图9. 普通爬虫实现登录代码
相比使用Selenium模块,短短两三行代码就可以完成登录功能,而一般的爬虫需要增加近乎一倍的代码量。
4. 登录成功后,就可以开始爬取知乎上的用户信息。这里采用一个简单的爬取策略:选择一个关注者数量比较大的用户,然后每个关注者又有自己的关注列表,就这样一路爬取下去……这里 “Python爱好者”这个公众号为测试起点(URL为: )
图10. 实现跳转到特定页面
图11. 页面数据提取和跳转
5. 爬虫的页面跳转和数据提取就基本完成了。可以使用scrapy框架的pipeline技术实现数据的保存,这里就不细讲。运行一定时间后,查看数据库数据:
图12. 爬取的数据
Selenium爬虫的优势在于,只需要关注页面解析方面,对于如何动态请求、构造参数等均可忽略;而不足点则是它需要一个界面程序来运行浏览器,这对于windows系统用户不是什么问题,而Linux用户、尤其是没有界面程序的用户,会麻烦些,需要安装一个虚拟的桌面程序,将浏览器重定向显示到虚拟桌面中运行。
欢迎关注公众号ISEC安全e站
原来这么简单