写在最前边:
环境:win10 + python 3.6 + scrapy 1.5 + pycharm最近写一个某平洋汽车网站的数据,在收集页面中的二手车数据时用
xpaht
在页面可是获取到数据,但是在scrapy shell
中测试结果为空,回到页面查看源码,源码中对应的dom节点确实没有数据,此时可以确定这些数据是js动态加载的.确定之后查找此类问题的解决办法,网上的 big god 很多,八仙过海各显神通,列举一下big gods推荐的方法:
1.selenium + phantomJS
这里扩展一下,还有把phantomjs换成chromedriver,firefox,edge…等等的,都是一样的
2.scrapy-splash
这种办法我测试一直没有成功,反正各种报错,报错内容到我写这篇文章的时候已经找不到了,下次再研究这种,到时候做下记录,但是都说这种的效率高
3.ghost
4.spynner
5.webkit
3,4,5方法中英文的资料都特别少,我百度ghost的仅有的一点资料,测试时还有各种各样的坑,个人不推荐开始写爬虫
经过各种尝试之后我选择了selenium + phantomJS,因为资料多,教程多,很详细
最初是用的CrawlSpider
类,在Rule中提取链接,之后callback='parse_item'
,渲染的中间件已经写好了(这个中间件在这里就不展示了,网上有很多非常好的例子,我也是参考的那些),但是测试时发现程序根本不走parse_item
方法里边去后来又查了很多例子,仔细看了写好的JS页面渲染的中间件和一些例子,发现大家都是在
parse
函数中去操作的,然后我也在parse中执行,结果打印的内容显示出来了到这儿问题算是解决了,但是就在思考,那就根本没有必要使用
CrawlSpider
了,因为在parse
也只是提取符合规则的链接,重新发送请求,让PhantomJS渲染页面:
def parse(self, response):
# 提取符合规则的链接,重新发送请求,让PhantomJS渲染页面
for link in self.link_extractor['follow_url'].extract_links(response):
yield scrapy.Request(url=link.url, callback=self.result_handdle)
而且LinkExtractor
也是从scrapy.linkextractors
里边导入的,压根就和CrawlSpider
没有半毛钱关系了(因为之前比较懒,一直喜欢用它的自动提取链接和链接跟进功能)
- 最后,很多网上的 big gods 说抓包,抓json数据,个人觉得这种太麻烦,工作量大,同时对js技术要求也比较高,因为有的复杂的js参数都是加密的,逆向解密什么的也很耗费精力和时间,还有说selenium + phantomJS 效率比较低,这里引用知乎上一位大大的话,大概意思是说: 我们在写爬虫时,为了防止对目标网站造成太大的负担以及防止被目标ban掉,都会设置延时,但是又一方面嫌弃这种渲染加载效率慢,这件事本身就很矛盾