Splash的爬虫应用
Splash是一个JavaScript渲染服务,它是一个带有HTTP API的轻型Web浏览器。Python可以通过HTTP API调用Splash中的一些方法实现对页面的渲染工作,同时它还可以使用Lua语言实现页面的渲染,所以使用Splash同样可以实现动态渲染页面的爬取。其实它与selenium所实现的功能都相同的,只不过实现的过程和原理有所不同。
搭建Splash环境(Mac系统)
搭建Splash环境需要docker命令进行安装,所以要先安装Docker,然后通过Docker 命令安装Splash,再启动Splash服务,才可以正常使用Splash。搭建Splash环境的具体步骤如下:
1、安装Docker
在浏览器中打开Docker的官网地址(https://www.docker.com/),注册并登录账号,然后根据自己需求下载对应系统版本的Docker,本人电脑系统是macOS,如下图:
所以登录官网下载。如下图:
下载之后,正常安装即可。
或许第二种方法,进入mac命令行,但不是root身份,用brew install 安装也可以。
Last login: Thu Feb 10 15:59:45 on ttys000
liuxiaowei@MacBookAir ~ % brew install docker
说 明
第二种方法的前提需要先安装brew,这里不再赘述,仅供参考。
2、安装及启动Splash
安装和启动Splash非常简单,直接执行如下命令:
# 启动Docker后
MacBookAir:~ root# docker run -d -p 8050:8050 scrapinghub/splash
服务启动成功以后,在浏览器中输入"http://localhost:8050",本人利用的是selenium自动启动Splash服务。代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :2/10/22 4:32 PM
# 文件 :使用selenium启动Splash服务.py
# IDE :PyCharm
# 导入模块
from selenium import webdriver
import time
# 指定url
url = 'http://localhost:8050/'
# 设定driver路径
execute_path = '../使用selenium爬取动态加载的信息/chromedriver'
# 创建browser
browser = webdriver.Chrome(executable_path=execute_path)
# 打开splash测试页面
browser.get(url)
time.sleep(10)
browser.quit()
程序运行结果如下:
在Splash测试页面中,右侧的代码是默认生成的Lua脚本,就像所有编程语言中的"Hello World"一样。接下来可以在右侧上方的输入框内输入一个网址,本例使用百度网址(https://www.baidu.com)为例,然后单击render me!按钮。将显示结果,如下图:
**注 意:**本人用的是selenium修改Splash测试页的输入框缺省值,修改为百度网页。同样得到如上图结果,代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :2/10/22 4:32 PM
# 文件 :使用selenium启动Splash服务.py
# IDE :PyCharm
# 导入模块
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入显式等待模块
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# 指定url
url = 'http://localhost:8050/'
# 设定driver路径
execute_path = '../使用selenium爬取动态加载的信息/chromedriver'
# 创建browser
browser = webdriver.Chrome(executable_path=execute_path)
# 打开splash测试页面
browser.get(url)
# 找到splash测试页面的input框和render按钮
inputTag = browser.find_element_by_xpath('//input[@name="url"]')
render_Btn = browser.find_element_by_xpath('//button[@type="submit"]')
# 最关键是如下修改输入框属性值,我查了很多资料才搞定,也稍有点成就感
# 就是利用下面的脚本"argugments[0].value='https://www.baidu.com';"
# 因为Splash测试页的输入框的缺省值是http://google.com/,不能用send_key赋值,只能修改
browser.execute_script("arguments[0].value='https://www.baidu.com';", inputTag)
render_Btn.click()
# 下面利用显示等待实现网页彻底刷新
try:
element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.title, '百度一下,你就知道'))
)
finally:
browser.quit()
说 明:上图的内容是通过Lua代码生成的,其中包含渲染截图、HAR加载统计数据、网页源代码。
注 意:
如果电脑 关机或重启后,再次使用Splash时需要重新执行“docker run -p 8050:8050 scrapinghub/splsh“命令启动Splash服务。
接下文: Splash的爬虫应用(二)https://developer.aliyun.com/article/1617945