Windows 安装与使用splash

@什么是Splash
    #Splash是一个JavaScript渲染服务,带有HTTP API 的轻量级Web浏览器。能够并行地处理多个页面请求。
 
@Splash与Selenium对比
    #Selenium在单台机器上运行Spider,如果是分布式Spider就要每台机器上都要安装Selenium,不支持异步,效率低
    #Splash支持异步,分布式Spider可以使用一台Splash就可以了,效率高。
 
@安装Splash
    #安装docker
        ##从这个页面下载 https://hub.docker.com/editions/community/docker-ce-desktop-windows
        ##控制面板-程序和功能-启用或关闭Windows功能,勾选Hyper-V,然后点击确认即可
 
@安装splash服务
    #docker pull scrapinghub/splash
    #docker run -d -p 8050:8050 scrapinghub/splash
    #访问web页面 http://localhost:8050
 
@安装Scrapy-Splash安装
    #pip install scrapy-splash
 
@在scrapy中使用Splash
    #在setting.py中配置
        SPLASH_URL = ' http://0.0.0.100:8050'  
        DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'  
        # 修改下载中间件
        DOWNLOADER_MIDDLEWARES = {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 723,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        }
        # 修改爬虫中间件
        SPIDER_MIDDLEWARES = {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        }
    
    #重写Spider中的start_requests函数
        例:
    def start_requests(self):
        # splash lua script
        lua_script = """
                    function main(splash, args)
                        local num_scrolls = 20  -- 翻页数
                        local scroll_delay = 0.5  -- 翻页等待时间
                        local scroll_to = splash:jsfunc("window.scrollTo")
                        local get_body_height = splash:jsfunc(
                            "function() {return document.body.scrollHeight;}"
                        )
                        splash:set_user_agent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
                        splash.images_enabled = false
                        assert(splash:go(splash.args.url))
                        splash:wait(0.5)
                        for _ = 1, num_scrolls do
                            scroll_to(0, get_body_height())
                            splash:wait(scroll_delay)
                        end
                        return splash:html()
                    end
        """
        for url in self.start_urls:
            yield SplashRequest(url, endpoint='execute', args={'lua_source':lua_script}, callback=self.parse)
 
@Splash对象的属性与方法
    #在main方法的第一参数是splash,这个对象它类似于selenium中的WebDriver对象,可以调用它的属性和方法来控制加载规程
    #splash.args:该属性可以获取加载时陪在的参数,如URL,如果为GET请求,可以获取GET参数,POSt获取表单提交的数据。
    #splash.js_enabled:启用或者禁用页面中嵌入的JavaScript代码的执行,默认为true
    #splash.resource_enabled:启用或禁用图片加载,默认情况是加载的:true
    #splash.plugins_enabled:启用或禁用浏览器插件,默认禁止
    #splash.scroll_position:获取和设置主窗口的当前位置: splash.scroll_position={x=50,y=600}
    #splash.html5_media_enabled:启用或禁用HTML5媒体,包括HTML5视频和音频
    #splash.go():该方法用来请求某个链接,而且它可以模拟GET和POST请求,同时支持传入请求头,表单等数据
        例ok, reason = splash:go{url, baseurl=nil, headers=nil, http_method="GET", body=nil, formdata=nil}
 
    #splash.wait()控制页面的等待时间
    #splash:jsfunc()调用JavaScript定义的函数,但所调用的函数需要用双中括号包围,它相当于实现JavaScript方法到Lua脚本的转换,全局的JavaScript函数可以直接包装
    例:
    function main(splash, args)
      local get_div_count = splash:jsfunc([[
      function () {
        var body = document.body;
        var divs = body.getElementsByTagName('div');
        return divs.length;
      }
      ]])
      splash:go(" https://www.baidu.com")
      return ("There are %s DIVs"):format(
        get_div_count())
    end
 
    #splash.evaljs()  :在页面上下文中执行JavaScript代码段并返回最后一个语句的结果
    #splash:autoload()  :将JavaScript设置为在每个页面加载时自动加载
    #splash:call_later :通过设置定时任务和延迟时间来实现任务延时执行
    #splash:http_get() :发送HTTP GET请求并返回相应
    #splash:http_post() :发送POST请求
    #splash:set_content()  :设置当前页面的内容
    #splash:html() :获取网页的源代码,结果为字符串
    #splash:png() :获取PNG格式的网页截图
    #splash:jpeg() :获取JPEG格式的网页截图
    #splash:har() :获取页面加载过程描述
    #splash:url() :获取当前正在访问的URL
    #splash:get_cookies() :获取当前页面的cookies
    #splash:add_cookie() :为当前页面添加cookie
    #splash:clear_cookies() :清除所有的cookies
    #splash:delete_cookies{name=nil,url=nil}  删除指定的cookie
    #splash:get_viewport_size() :获取当前浏览器页面的大小,即宽高
    #splash:set_viewport_size(width,height) :设置当前浏览器页面的大小,即宽高
    #splash:set_viewport_full() :设置浏览器全屏显示
    #splash:set_user_agent()  :覆盖设置请求头的User-Agent
    #splash:get_custom_headers(headers) :设置请求头
    #splash:on_request(callback) :在HTTP请求之前注册要调用的函数
    #splash:get_version() :获取splash版本信息
    #splash:mouse_press() :触发鼠标按下事件
    #splash:mouse_release() :触发鼠标释放事件
    #splash:send_keys() :发送键盘事件到页面上下文,如发送回车键:           #splash:send_keys("key_Enter")
    #splash:send_text() :将文本内容发送到页面上下文
    #splash:select() :选中符合条件的第一个节点,如果有多个节点符合条件,则只会返回一个,其参数是CSS选择器
    #splash:mouse_click() :出发鼠标单击事件
 

你可能感兴趣的:(Scpay,web,python,splash,scrapy)