zoukankan      html  css  js  c++  java
  • Splash对接Scrapy

    1. 安装Splash:

    1. 安装docker
    2. docker拉取Splash镜像:docker pull scrapinghub/splash
    3. 启动Splash:docker run -p 8050:8050 scrapinghub/splash

    2. 安装并配置scrapy-splash:https://github.com/scrapy-plugins/scrapy-splash

    在settings.py中增加:

    SPLASH_URL = 'http://【Splash的部署地址】:8050/'
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    SPIDER_MIDDLEWARES = {
        'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
    }
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
    

    3. Spider代码

    ​ 编写Spider代码过程中,使用scrapy_splash调用Splash服务非常简单,scrapy_splash中定义了一个SplashRequest类,用户只需要使用scrapy_splash.SplashRequest(替代scrapy.Request)提交请求即可。下面是SplashRequest构造器方法中的一些常用参数。

    • url:与scrapy.Request中的url相同,也就是待爬取页面的URL(注意,不是Splash服务器地址)
    • headers:与scrapy.Request中的headers相同。
    • cookies:与scrapy.Request中的cookies相同。
    • args:传递给Splash的参数(除URL以外),如wait、timeout、images、js_source等。
    • cache_args:如果args中的某些参数每次调用都重复传递并且数据量较大(例如一段JavaScript代码),此时可以把该参数名填入cache_args列表中,让Splash服务器缓存该参数,如(SplashRequest(url,args={'js_source':js, 'wait':0.5}, cache_args=['js_source']))。
    • endpoint:Splash服务端点,默认为'render.html',即JavaScript页面渲染服务,该参数可以设置为'render.json'、'render.har'、'render.png'、'render.jpeg'、'execute'等,有些服务端点的功能我们没有讲解,详细内容可以查阅文档。
    • splash_url:Splash服务器地址,默认为None,即使用配置文件中的SPLASH_URL的地址。
      ——参考:简书文章-Splash渲染引擎

    SplashRequest代替scrapy.Request,代码示例:

    yield SplashRequest(url, self.parse_result,  # 第一个参数是要请求的url,第二个参数是回调函数
        args={  # 常用于传递Lua脚本
            "lua_source": """
                        splash:set_user_agent("...")
                        splash.images_enabled = false  --关闭图片渲染可以使请求速度加快50%左右
                        assert(splash:go(args.url))
                        assert(splash:wait(args.time))  --注意脚本中可以用args.*来接收外界参数
                        return {html = splash:html()}  --返回html
                        """
            “time”: time  # lua脚本参数从这里传入
        },
        endpoint='run', # 默认为render.html,这里常用’execute’ 或 ‘run’来执行脚本
    )
    

    完整Spider示例:

    import scrapy
    from scrapy_splash import SplashRequest
    
    
    class ExampleSpider(scrapy.Spider):
        name = 'connect_splash'
        
        def start_requests(self):
            url = 'http://www.baidu.com'
            script = """
            assert(splash:go(args.url))
            assert(splash:wait(args.wait))
            return {html = splash:html()}
            """
            yield SplashRequest(url, self.parse, endpoint='run', args={'lua_source':script,'wait':3})
            
        def parse(self, response):
            from scrapy.shell import inspect_response
            inspect_response(response, self)
            pass
    

    如果用execute的话,脚本里要加上mian函数,且args前要加splash.

    script = """
            function main(splash)
                assert(splash:go(splash.args.url))
                assert(splash:wait(splash.args.wait))
                return {html = splash:html()}
            end
            """
            yield SplashRequest(url, self.parse, endpoint='execute', args={'lua_source':script,'wait':3})
    

    可以用这个网址来进行渲染测试http://quotes.toscrape.com/js

  • 相关阅读:
    Unity3D AssetBundle相关
    [转]Unity3D新手引导开发手记
    努力多彩
    js sendBeacon
    js document.activeElement及使用
    js requestAnimationFrame
    js 1+'2' == '1'+'2'
    js scrollIntoViewIfNeeded
    汉字 3个字节
    js 浅拷贝和深拷贝
  • 原文地址:https://www.cnblogs.com/lokvahkoor/p/10800932.html
Copyright © 2011-2022 走看看