一、splash的介绍

Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库。利用它,我们同样可以实现动态渲染页面的抓取

二、splash的安装

1、docker 安装

参考:Dockerapp安装与使用_宠乖仪的博客-CSDN博客_docker安装使用

2、拉取镜像

docker pull scrapinghub/splash

等待安装即可

3、用docker运行scrapinghub/splash

docker run -p 8050:8050 scrapinghub/splash

4、查看效果

 三、Splash对象属性

上图中main()方法的第一个参数是splash,这个对象非常重要,它类似于Selenium中的WebDriver对象

1、scroll_position

控制页面上下或左右滚动

splash.scroll_position = {x=100, y=200}

四、Splash对象的方法

1、go()

该方法用来请求某个链接,而且它可以模拟GET和POST请求,同时支持传入请求头、表单等数据

ok, reason = splash:go{url, baseurl=nil, headers=nil, http_method="GET", body=nil, formdata=nil}

> 返回结果是结果ok和原因reason

> 如果ok为空,代表网页加载出现了错误,此时reason变量中包含了错误的原因

参数 含义
url 请求的URL
baseurl 可选参数,默认为空,表示资源加载相对路径
headers 可选参数,默认为空,表示请求头
http_method 可选参数,默认为GET,同时支持POST
body 可选参数,默认为空,发POST请求时的表单数据,使用的Content-type为application/json
formdata 可选参数,默认为空,POST的时候的表单数据,使用的Content-type为application/x-www-form-urlencoded

2、wait()

控制页面的等待时间

splash:wait{time, cancel_on_redirect=false, cancel_on_error=true}
参数 含义
time 等待的秒数
cancel_on_redirect 可选参数,默认为false,表示如果发生了重定向就停止等待,并返回重定向结果
cancel_on_error 可选参数,默认为false,表示如果发生了加载错误,就停止等待
function main(splash)splash:go("https://www.taobao.com")splash:wait(2)return {html=splash:html()}
end

3、jsfunc()

直接调用JavaScript定义的方法,但是所调用的方法需要用双中括号包围,这相当于实现了JavaScript方法到Lua脚本的转换

function main(splash, args)splash:go("http://www.baidu.com")local scroll_to = splash:jsfunc("window.scrollTo")scroll_to(0, 300)return {png=splash:png()}
end
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(args.url)return ("There are %s DIVs in %s"):format(get_div_count(), args.url)
end

4 、evaljs()与 runjs()

  • evaljs() 以执行JavaScript代码并返回最后一条JavaScript语句的返回结果

  • runjs() 以执行JavaScript代码,它与evaljs()的功能类似,但是更偏向于执行某些动作或声明某些方法

function main(splash, args)splash:go("https://www.baidu.com")splash:runjs("foo = function() { return 'sxt' }")local result = splash:evaljs("foo()")return result
end

5、 html()

获取网页的源代码

function main(splash, args)splash:go("https://www.baidu.com")return splash:html()
end

6、png()

获取PNG格式的网页截图

function main(splash, args)splash:go("https://www.baidu.com")return splash:png()
end

7、har()

获取页面加载过程描述

function main(splash, args)splash:go("https://www.baidu.com")return splash:har()
end

8、url()

获取当前正在访问的URL

function main(splash, args)splash:go("https://www.baidu.com")return splash:url()
end

9、get_cookies()

获取当前页面的Cookies

function main(splash, args)splash:go("https://www.baidu.com")return splash:get_cookies()
end

10、add_cookie()

当前页面添加Cookie

cookies = splash:add_cookie{name, value, path=nil, domain=nil, expires=nil, httpOnly=nil, secure=nil}
function main(splash)splash:add_cookie{"sessionid", "123456abcdef", "/", domain="http://bjsxt.com"}splash:go("http://baidu.com/")return splash:html()
end

11、 clear_cookies()

#     可以清除所有的Cookies
function main(splash)splash:go("https://www.bjsxt.com/")splash:clear_cookies()return splash:get_cookies()
end

12、set_user_agent()

设置浏览器的User-Agent

function main(splash)splash:set_user_agent('Splash')splash:go("http://httpbin.org/get")return splash:html()
end

13、set_custom_headers()

设置请求头

function main(splash)splash:set_custom_headers({["User-Agent"] = "Splash",["Site"] = "Splash",})splash:go("http://httpbin.org/get")return splash:html()
end

14、 select()

选中符合条件的第一个节点

如果有多个节点符合条件,则只会返回一个

其参数是CSS选择器

function main(splash)splash:go("https://www.baidu.com/")input = splash:select("#kw")splash:wait(3)return splash:png()
end

15、send_text()

填写文本

function main(splash)splash:go("https://www.baidu.com/")input = splash:select("#kw")input:send_text('Splash')splash:wait(3)return splash:png()
end

16、mouse_click()

模拟鼠标点击操作

function main(splash)splash:go("https://www.baidu.com/")input = splash:select("#kw")input:send_text('Splash')submit = splash:select('#su')submit:mouse_click()splash:wait(3)return splash:png()
end

17、代理Ip

function main(splash)splash:on_request(function(request)request:set_proxy{host='111.111.111.1',port=8080,username='uanme',password='passwrod'}end)-- 设置请求头splash:set_user_agent("Mozilla/5.0")splash:go("https://httpbin.org/get")return splash:html()
end

五、splash与python结合

1、render.html

此接口用于获取JavaScript渲染的页面的HTML代码,接口地址就是Splash的运行地址加此接口名称,例如http://127.0.0.1:8050/render.html

    url = 'https://www.lagou.com/zhaopin/Python/'base_url =f'http://localhost:8050/render.html?url={url}&wait=2'resp = requests.get(base_url)resp.encoding = 'utf-8'print(resp.text)

2、render.png

此接口可以获取网页截图

    url = 'https://www.lagou.com/zhaopin/Python/'base_url =f'http://localhost:8050/render.png?url={url}&wait=2'resp = requests.get(base_url)with open('a.png','wb') as f:f.write(resp.content)

3、 execute

最为强大的接口。前面说了很多Splash Lua脚本的操作,用此接口便可实现与Lua脚本的对接

    url = 'https://www.lagou.com/zhaopin/Python/'lua =f'''function main(splash,args)splash:go("{url}")splash:wait(2)return splash:html()end'''base_url =f'http://localhost:8050/execute?lua_source={lua}'resp = requests.get(base_url)print(resp.text)
    # 如果lua代码中有特殊字符,要通过进行quote转码from urllib.parse import quoteurl = 'https://www.baidu.com'lua =f'''function main(splash,args)splash:go("{url}")input = splash:select("#kw")input : send_text("SXT")splash:wait(0.1)button = splash:select("#su")button : mouse_click()splash : wait(2)return splash:html()end'''base_url =f'http://localhost:8050/execute?lua_source={quote(lua)}'resp = requests.get(base_url)print(resp.text)

六、scrapy与splash结合

1、pip安装scrapy-splash库

pip install scrapy-splash

2、scrapy-splash使用的是Splash HTTP API, 所以使用之前要开启splash

3、配置splash服务(以下操作全部在settings.py):

3.1 使用splash解析,要在配置文件中设置splash服务器地址:

SPLASH_URL = 'http://localhost:8050/' 

3.2 将splash middleware添加到DOWNLOADER_MIDDLEWARE中

DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

3.3 Enable SplashDeduplicateArgsMiddleware

SPIDER_MIDDLEWARES = {'scrapy_splash.SplashDeduplicateArgsMiddleware': 100
}

这个中间件需要支持cache_args功能; 它允许通过不在磁盘请求队列中多次存储重复的Splash参数来节省磁盘空间。如果使用Splash 2.1+,则中间件也可以通过不将这些重复的参数多次发送到Splash服务器来节省网络流量

3.4 配置消息队列所使用的过滤类

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

3.5 配置消息队列需要使用的类

HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

案例

import scrapy
from scrapy_splash import SplashRequest
class DoubanSpider(scrapy.Spider):name = 'douban'allowed_domains = ['douban.com']def start_requests(self):yield SplashRequest('https://movie.douban.com/typerank?type_name=剧情&type=11&interval_id=100:90', args={'wait': 0.5})def parse(self, response):print(response.text)

Splash安装和使用相关推荐

  1. ubuntu14.04 splash安装

    ubuntu14.04 splash安装 splash 是一个python语言编写的用于配合scrapy解析js的库,本来以为安装比较简单,没想到记录下来以后,发现其实还是很麻烦的,所以发出来共享一下 ...

  2. splash安装和简单使用

    需要:安装docker. 安装: docker pull scrapinghub/splash 运行: docker run -p 8050:8050 scrapinghub/splash 安装完的访 ...

  3. linux splash qt,ubuntu14.04 splash安装

    splash 是一个Python语言编写的用于配合scrapy解析js的库,本来以为安装比较简单,没想到记录下来以后,发现其实还是很麻烦的,所以发出来共享一下. 1.splash运行于python3环 ...

  4. 安装splash与启动

    前提:安装 docker 安装splash 安装命令:sudo docker pull scrapinghub/splash 启动命令:sudo docker run -p 5023:5023 -p ...

  5. 芝麻HTTP:Scrapy-Splash的安装

    2019独角兽企业重金招聘Python工程师标准>>> Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具,本节来介绍它的安装方式. Scrapy-Sp ...

  6. scrapy安装_「从零开始Python爬虫」1.8.3 Scrapy-Splash的安装

    Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具,本节来介绍它的安装方式. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Dock ...

  7. 利用scrapy+splash+redis实现对JS动态生成网页的增量爬取

    文章目录 一.任务内容 二.Scrapy安装.配置.调试 三.splash安装.配置.调试 开启hyper-v 安装Docker Desktop 拉取和开启Splash 安装scrapy-splash ...

  8. Splash的爬虫应用

    Splash的爬虫应用 Splash是一个JavaScript渲染服务,它是一个带有HTTP API的轻型Web浏览器.Python可以通过HTTP API调用Splash中的一些方法实现对页面的渲染 ...

  9. scrapy 动态网页处理——爬取鼠绘海贼王最新漫画

    简介 scrapy是基于python的爬虫框架,易于学习与使用.本篇文章主要介绍如何使用scrapy爬取鼠绘漫画网海贼王最新一集的漫画. 源码参见:https://github.com/liudaol ...

最新文章

  1. 10条PyTorch避坑指南
  2. 滑动窗口与拥塞窗口_流云哭翠-ChinaUnix博客
  3. 中国@代码生成技术@国产
  4. 【python】关于python的链表结构实现
  5. cocos2d-x 3.0 常见问题及解决
  6. html5和css3的新特性
  7. WEB数据透视表Pivot Table
  8. ROS 中的camera支持
  9. 2021方便速食行业洞察报告
  10. Linux下使用wc命令快速统计所有文件的行数
  11. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
  12. B树、B-树、B+树、B*树都是什么
  13. gitlab主备同步_gitlab实现主备切换集群
  14. Xcode6无法安装VVDocumenter插件的解决方法
  15. UnixVi命令详解
  16. PCB设计敷铜时的天线效应
  17. AD使用总结4——PCB天线知识
  18. textField使用合集(附字体设置合集)
  19. EasyAPI基于电子发票API接口二维码小票对接方案
  20. deepin入坑前必读(懊悔篇)

热门文章

  1. 美和易思与临沂职业学院校企合作项目启动揭牌仪式成功举行
  2. 211安徽大学大数据与统计学院成立!安徽省属高校首家!
  3. oracle服务器双ip,LINUX系统的双网卡双IP(双链路)实现方式
  4. 标准英语写作——从中式英语到地道英语——读书笔记3(句子分析思考)
  5. 《Effective Modern C++》学习总结(条款11- 15)
  6. php 柱状 折线 组合,柱状图和折线图组合怎么用
  7. 基于PYNQ的深度学习模型设计与实现
  8. 我和我的摄友们(合影)
  9. vue3中使用$refs
  10. 免费SSL证书(自己网站申请教程)