zoukankan      html  css  js  c++  java
  • 利用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

  • 相关阅读:
    Chrome 控制台console的用法[转]
    Page Visibility(页面可见性) API介绍、微拓展[转]
    移动端rem单位用法[转]
    JavaScript继承方式详解[转]
    说说React
    Flex 布局教程:语法篇[转]
    git 常用命令总结
    Supervisor 在ubuntu系统下添加自启动
    Django 通过APNS推送消息
    通过 python-xmp-toolkit 读取图片xmlp信息
  • 原文地址:https://www.cnblogs.com/zhonghuasong/p/5976003.html
Copyright © 2011-2022 走看看