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() :出发鼠标单击事件

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值