自动化爬虫框架selenium
selenium中文文档: https://selenium-python-zh.readthedocs.io/en/latest/getting-started.html
selenium可以模拟真实浏览器进行自动化测试的工具,支持多种浏览器,主要来解决js渲染的问题。使用selenium也可以很好的应对很多网站的反爬措施,一些网站的跳转url并不会直接放到审查元素中,而是通过js嵌入其他特征来阻止requests类爬虫,而使用selenium可以解决大部分的问题,但是selenium的效率整体来说要比requests低。
前言
今天的实战案例就是通过搜狗微信模块来爬取大学公众号最近文章,本次实战会使用requests+bs4和selenium两种方式来爬取。选择搜狗微信的原因在于搜狗微信的反爬做的比较好,请求时会在计算机中存储cookie以及一些sessionid和token等相关信息,想使用day2学的基础爬虫远远不够,需要了解一些web后端的相关知识,这就给初学者带来了很大的挑战。下边开始分别介绍两个例子。
案例
案例一:使用requests+bs4爬取最近文章
1.问题:首先使用普通爬虫尝试爬取网站(即day2所学的爬虫方法)
人机验证的页面源码
人机验证页面
2.分析:很明显这是一个反爬虫的页面,大概的原因是由于直接对链接发起请求的时候Referer是空的,Referer是标识从哪个网站跳转过来的,如果是空的很明显就被识别为爬虫,当然也有其他的原因,包括一些session或者cookie的原因,session生存周期是浏览器打开到关闭浏览器这个时间,同时也含有一些token和uuid等的拼接。
3.爬取目标分析:我们需要获的是最近文章的真实链接,即红色边框内的内容
审查元素中的链接
但是我们看一下爬取的源码发现,源码中的链接和审查元素中的链接是不一样的。
源码中的链接
4.目标:我们通过爬虫返回的数据是源代码中的内容,因此我们只要在源代码中找到类似审查元素的真实链接,任务就完成了。因此,这次使用requests+bs4爬取的难点就是在于寻找真实的链接。
在浏览器点击最近文章会先跳转到类似a中的href之后再跳转到推文的链接
推理大概是因为js的缘故,有类似点击事件的方法,回到源代码寻找之后发现果然存在一个方法重新构造了url
js中重构url的方法
这个重构的url与href中的url相比较多了一个&k和一个&h,k就是一个随机数字,而h是在href中获取一个字符。通过这个重构便可以得出真正的url。
构造真链接代码
之后再次发起请求测试
1处是构建的新的url;2处出现人机验证,估计是cookie出现了问题。
只要解决cookie的拼接就能完成,下期仔细介绍该部分的拼接问题。
案例二:使用selenium爬取最近文章
通过上述案例一可以看出使用requests+bs4来爬取该类网站非常的麻烦,难点主要在与url的构造和cookie等的拼接,而使用selenium就不会出现类似的问题,下边开始实例操作。
操作步骤就是打开网页,之后点击最近的推文,获取推文的源码。
通过selenium自动打开之后自动点击
定位点击
打开后的内容
推文的源代码
通过Xpath定位以及各种事件的触发就可以比较轻松地获取到数据。
总结
通过以上两个案例可以看出来对于反爬做的比较好的网站使用selenium要比普通的爬虫方便的多,普通爬虫涉及到js的加密以及各种数据url的拼接解决起来比较麻烦,而selenium可以非常轻松地绕过数据加密、网站验证等等。但是在爬取效率上selenium是远不如requests+bs4组合的,并且selenium也并非识别不出来,在自动化下的浏览器中会暴露webdriver的相关特征。因此遇到不同的网站使用不同的工具非常重要。对于效率要求不高、数据量不大、网站反爬做的比较好的网站可以使用selenium,对效率要求中等并且反爬措施做得一般的网站可以使用requests+bs4的方法,对于超大量数据可以使用scrapy框架,对于数据量巨大并且网站做反爬做的比较好的可以使用scrapy+selenium组合的方法来爬取,在之后的文章中将会介绍scrapy框架的使用方法。