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