Splash学习笔记

简介: Splash学习笔记

Splash动态数据抓取
最近学习爬虫过程中接触到了Splash,下面根据我所学的经历进行整理回放,相关的操作如下。期间遇到一些问题,本人自行解决了。

1.1 简介及安装
Splash是具有JavaScript渲染功能并带有HTTP API的轻量级浏览器,同时还对接了Python的网络引擎框架Twisted和QT库,让服务具有一步处理能力,以发挥webkit的并发能力。其实,Splash就是一个带有API接口的轻量级浏览器,使用它提供的API接口可以简单实现Ajax动态数据抓取。其实它与Selenium所实现的功能都是相同的,只不过实现的过程和原理有所不同。

Splash的安装是基于Docker应用容器引擎,Docker支持三大操作系统:Linux、MacOS和Windows。本人在MacOS环境下进行操作

# 启动Docker之后,输入如下命令,即可安装
root@liuxiaoweideAir liuxiaowei # docker run -d -p 8050:8050 scrapinghub/splash

image.png

# 在浏览器地址栏输入http://本机ip地址:8050即可打开splash 
# 我的本机地址:192.168.68.242,端口8050

image.png

1.2 使用Splash的API接口
Splash的最大好处是可以执行JavaScript代码,将Ajax动态数据直接加载到网页上,无需开发者花费时间和精力分析Ajax请求,从而实现相关数据的抓取。Python可以使用Splash提供的API接口,从而实现Python与Splash之间的交互。Splash提供多种API接口实现不同的功能。

1.2.1 render.html获取JS加载后的网页信息

# render.html获取JS加载后的网页信息
# 启动Pycharm,新建一个python文件,代码如下

import requests
headers = {
   
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
target_url = 'https://y.qq.com/portal/singer_list.html'    # 以QQ音乐为例
url = 'http://192.168.68.242:8050/render.html?url='+target_url+'&wait=5'

response = requests.get(url, headers=headers)
print(response.text)

image.png

1.2.2 render.png 获取网页截图

# render.png获取网页截图
import requests
headers = {
   
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}

target_url = 'https://y.qq.com/n/ryqq/singer_list'  # 此处不能加.html否则不会显示正常的网页截图
# #render.png 获取网页截图
url = 'http://192.168.68.242:8050/render.png?url=' + target_url + '&width=500&height=500'
response = requests.get(url, headers=headers)
with open('image.png', 'wb') as f:
     f.write(response.content)

image.png

1.2.3 render.json返回请求数据

# render.json返回请求数据
import requests
headers = {
   
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Cookie': 'pgv_pvid=3132771352; fqm_pvqid=880b3190-fa83-4efb-b454-91a8cfe5c88d; fqm_sessionid=d52acd91-a6e5-4724-b7d3-f640aa025aa9; pgv_info=ssid=s3303935717; ts_last=y.qq.com/n/ryqq/singer_list; ts_uid=5845062856; wxuin=1152921504679782202; psrf_qqopenid=; qqmusic_key=W_X_38mxV760na8eft79NlCqzAiOA-estYOQG-llR7bUbAUqZgKJXWhi-ZPtFoKHl9G0Snr-HfXYhO01O0; tmeLoginType=1; qm_keyst=W_X_38mxV760na8eft79NlCqzAiOA-estYOQG-llR7bUbAUqZgKJXWhi-ZPtFoKHl9G0Snr-HfXYhO01O0; psrf_qqunionid=; qm_keyst=W_X_38mxV760na8eft79NlCqzAiOA-estYOQG-llR7bUbAUqZgKJXWhi-ZPtFoKHl9G0Snr-HfXYhO01O0; euin=oK6kowEAoK4z7eClNKSFow-zoc**; wxopenid=opCFJwxfrEY9ZpgGrLGlFPdtA3I4; psrf_qqrefresh_token=; wxunionid=oqFLxslDReh71Tgsv2ag3if60zXM; psrf_qqaccess_token=; wxuin=1152921504679782202; wxrefresh_token=52_y1zSccbY7AxkZi958ZW7phLaZTtiNRgOyy5WbnCdYoedlU9Hn6xTTYPrWZO-lPuxFPyxX6E1t4uFGxKPkHMlAzXeXK_WS6tokw9DtYNZ9QY; login_type=2'
    }

target_url = 'https://y.qq.com/portal/singer_list.html'

# render.html 获取JS加载后的网页信息
url = 'http://192.168.68.242:8050/render.json?url='+target_url+'&wait=5'
response = requests.get(url, headers= headers)
print(response.text, )

image.png

1.2.4 execute执行Lua脚本

# execute执行Lua脚本
# 因为Splash 支持Lua脚本操作
# 获取cookies
import requests
from urllib.parse import quote
# Lua脚本
luaScript = '''
function main(splash)
    splash:go("https://y.qq.com/portal/singer_list")
    # 返回cookies
    return {
   
        splash:get_cookies()
    }
end
'''
# Lua脚本转码处理
url = 'http://192.168.68.242:8050/execute?lua_source= ' + quote(luaScript)
response = requests.get(url)
print(response.text)

image.png

从API接口的使用方法可以看到,爬取的网站是从Splash进行加载,然后再使用Requests模块对Splash发出请求,从而获取网站的网页内容。这里涉及到的API接口render.html和execute的使用频率相对较高, 特别是execute,能满足复杂点网站的多方面需求,编写Lua脚本获取网站的Cookies和设置请求头等操作。其实Splash的对象方法比较多,本人只练习了常用的对象方法。希望对您有所帮助!欢迎点赞转发。

相关文章
|
2月前
|
数据采集 JavaScript 前端开发
Splash的爬虫应用(二)
Splash的爬虫应用(二)
41 0
Splash的爬虫应用(二)
|
2月前
|
数据采集 JavaScript API
Splash的爬虫应用(一)
Splash的爬虫应用(一)
41 0
|
7月前
|
JavaScript 前端开发 Go
Python爬虫之Splash详解#7
Splash 基本使用、Splash Lua脚本、Splash对象属性、Splash对象方法、Splash API调用等。【2月更文挑战第27天】
152 0
|
7月前
wxPython4.0.4加载splash图片
wxPython4.0.4加载splash图片
48 0
andorid 修改字体一文搞定
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 替换字体也是一个比较常见的需求,一般分几种情况。实现起来也不麻烦,这里简单记录下 全局替换字体 步骤1 assets目录下拷贝字体文件 步骤2 application中替换默认字...
1485 0
screen 配置与使用笔记
screen 多人使用的时候经常遇到 屏幕大小不一致导致无法正常显示,只需要 ctrl+a shift+; fill 即可解决. 可以通过下面#把ctrl +a 替换成ctrl+z(ctrl+a 经常会用此组合键实现光标移动) The resultsing command give you a s.
654 0
Meego touch基本控件介绍—Button篇
前面我们也写过关于meegotouch的两个小程序,相信大家对meegotouch的界面风格都有一定的感观认识,今天写了一个关于button的小程序,一起了解下button的性质。至于button的分类和基本概念,可以点击这里查看。
774 0
|
XML Android开发 数据格式
Toolbar的简单使用
Toolbar(android.support.v7.widget.Toolbar)是Android5.0之后出现的用来取代ActionBar的一个控件。
1282 0
|
C#
WPF应用程序的启动画面[Splash Screen本质分析]
原文:WPF应用程序的启动画面[Splash Screen本质分析]   不经意间发现了wpf的这个小玩意,感觉蛮有意思的。我在项目中添加了一张图片 如图: wpf-1.JPG(10.73 K)2010-6-6 17:04:47 然后再这张图片的属性中设置它的生成操作为SplashScreen 如图: wpf-2.JPG(13.51 K)2010-6-6 17:04:47 之后f5启动程序,你会发现在你主程序启动之前会出现一个0.5秒的动画,当然这个是默认的,您可以通过程序来进行对它的控制。
1283 0
下一篇
DataWorks