• 利用scrapy-splash爬取JS生成的动态页面


    目前,为了加速页面的加载速度,页面的很多部分都是用JS生成的,而对于用scrapy爬虫来说就是一个很大的问题,因为scrapy没有JS engine,所以爬取的都是静态页面,对于JS生成的动态页面都无法获得。

    解决方案:

    • 利用第三方中间件来提供JS渲染服务: scrapy-splash 等。
    • 利用webkit或者基于webkit库

    Splash是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。


    下面就来讲一下如何使用scrapy-splash:

    1. 利用pip安装scrapy-splash库:
      $ pip install scrapy-splash

    2. scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker

    3. 安装docker, 安装好后运行docker。

    4. 拉取镜像(pull the image):
      $ docker pull scrapinghub/splash

    5. 用docker运行scrapinghub/splash:
      $ docker run -p 8050:8050 scrapinghub/splash

    6. 配置splash服务(以下操作全部在settings.py):

      1)添加splash服务器地址:

      SPLASH_URL = 'http://localhost:8050'  
      

      2)将splash middleware添加到DOWNLOADER_MIDDLEWARE中:

      DOWNLOADER_MIDDLEWARES = {
      'scrapy_splash.SplashCookiesMiddleware': 723,
      'scrapy_splash.SplashMiddleware': 725,
      'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
      }
      

      3)Enable SplashDeduplicateArgsMiddleware:

      SPIDER_MIDDLEWARES = {
      'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
      }
      

      4)Set a custom DUPEFILTER_CLASS:

      DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
      

      5)a custom cache storage backend:

      HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
      
    7. 例子
      获取HTML内容:

    import scrapy
    from scrapy_splash import SplashRequest
    
    class MySpider(scrapy.Spider):
        start_urls = ["http://example.com", "http://example.com/foo"]
    
        def start_requests(self):
            for url in self.start_urls:
                yield SplashRequest(url, self.parse, args={'wait': 0.5})
    
        def parse(self, response):
            # response.body is a result of render.html call; it
            # contains HTML processed by a browser.
            # ...        
    

    参考链接:
    scrapy_splash教程
    Scrapy爬虫中使用Splash处理页面JS

  • 相关阅读:
    缓存雪崩与缓存穿透
    读取表中最大值
    使用vscode在谷歌上运行代码
    elment 中tree组件展开所有和收缩所有节点
    深度系统商店提示无法安装软件依赖错误
    诗词,理解,品论
    《45个十分钟读懂资本论》原文、适合朗读版和个人见解
    《论持久战》全文
    OSError: [WinError 126] 找不到指定的模块。
    C++ 获取序列最大(或最小)的 N 个元素
  • 原文地址:https://www.cnblogs.com/zhonghuasong/p/5976003.html
Copyright © 2020-2023  润新知