scrapy crawlspider中使用selenium+phantomJS的收获总结

  • 写在最前边:
    环境: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掉,都会设置延时,但是又一方面嫌弃这种渲染加载效率慢,这件事本身就很矛盾
    原文作者:腿长袖子短
    原文地址: https://www.jianshu.com/p/84aaf284bb30
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞