美文网首页我爱编程
scrapy crawlspider中使用selenium+ph

scrapy crawlspider中使用selenium+ph

作者: 腿长袖子短 | 来源:发表于2018-02-02 11:20 被阅读352次
    • 写在最前边:
      环境: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掉,都会设置延时,但是又一方面嫌弃这种渲染加载效率慢,这件事本身就很矛盾

    相关文章

      网友评论

        本文标题:scrapy crawlspider中使用selenium+ph

        本文链接:https://www.haomeiwen.com/subject/eepszxtx.html