网站内容抓取工具(SeleniumWeb的自动化测试工具方式启动(汇百家之长,))
优采云 发布时间: 2022-01-03 04:14网站内容抓取工具(SeleniumWeb的自动化测试工具方式启动(汇百家之长,))
© zebra(汇百家掌门人,一人之声)
1.硒介绍
Selenium 是一个网络自动化测试工具。它最初是为 网站 自动化测试而开发的。它还可以广泛用于动态网络爬虫,尤其是具有严格反作弊做法的网站。动态渲染后的爬虫技术往往可以达到久经考验的效果。
类似于我们用来玩游戏的按钮精灵,它可以根据指定的命令自动执行。不同的是Selenium可以直接在浏览器上运行,并且支持所有主流浏览器(包括PhantomJS等非接口浏览器)。
Selenium 可以让浏览器根据我们的指令自动加载页面以获取所需的网页。 Selenium 没有浏览器,不支持浏览器的功能。需要配合第三方浏览器使用。但是我们有时需要让它嵌入到代码中运行,而这些工具如 PhantomJS、Chrome、Firefox。
PhantomJS 是一个基于 Webkit 的“无头”浏览器。它将 网站 加载到内存中并在页面上执行 JavaScript。因为它不显示图形界面,所以运行起来比一个完整的浏览器效率更高。新版 selenium 不再支持 phantomJS。
browser = webdriver.PhantomJS()
Chrome 已经支持 headless”(无头)
browser = webdriver.Chrome()
browser = webdriver.Firefox()
2.安装2.1 安装chrome浏览器
yum install chromium
查看chrome版本信息
yum list installed | grep chro
chromium.x86_64 85.0.4183.121-1.el7 @epel
chromium-common.x86_64 85.0.4183.121-1.el7 @epel
chrony.x86_64 3.2-2.el7 @anaconda
2.2 安装chrome驱动
此时必须与chrome版本一致。下载地址如下
wget http://chromedriver.storage.googleapis.com/85.0.4183.83/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin
cd /usr/local/bin
sudo chmod a+x chromedriver
chromedriver --version
ChromeDriver 85.0.4183.83 (94abc2237ae0c9a4cb5f035431c8adfb94324633-refs/branch-heads/4183@{#1658})
2.3 安装硒
pip3 install selenium
2.4 测试代码
from selenium import webdriver
opt = webdriver.ChromeOptions()
# 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数
opt.set_headless()
#browser = webdriver.Chrome('/usr/local/bin/chromedriver',chrome_options=opt)
browser = webdriver.Chrome(chrome_options=opt)
browser.get('http://www.baidu.com/')
print(browser.title)
browser.quit()
选项说明
opt.add_argument('--no-sandbox')#解决DevToolsActivePort文件不存在的报错
opt.add_argument('window-size=1920x3000') #指定浏览器分辨率
opt.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
opt.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
opt.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
opt.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
opt.binary_location = r"C:\Application\chrome.exe" #手动指定使用的浏览器位置
3.其他操作3.1 渲染加速3.1.1不加载图片
options = webdriver.ChromeOptions()
prefs = {
"profile.managed_default_content_settings.images": 2
}
options.add_experimental_option('prefs', prefs)
3.1.2 Headless模式启动
Headless Chrome 是 Chrome 浏览器的非接口形式。您无需打开浏览器即可使用 Chrome 支持的所有功能来运行您的程序。与现代浏览器相比,Headless Chrome 更方便测试网页应用、获取网站 的截图、做爬虫抓取信息等。相比早期的 PhantomJS、SlimerJS 等,Headless Chrome 更接近浏览器环境。
options = webdriver.ChromeOptions()
options.headless = True
3.2 发起异步请求
url='http://....'
js = """
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET",'%s',false);
xmlhttp.send();
return xmlhttp.responseText;
""" % (url)
resp = self.browser.execute_script(js)
# 需要退出浏览器不然进程依然存在
3.3 配置等待
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(self.browser, 10, 0.2)
searchipt = wait.until(lambda x: x.find_element_by_id("searchipt"))
# searchipt.send_keys('潇湘府')
# print(searchipt.text)
3.1 使用代理3.1.1 无密码代理
from selenium import webdriver
proxy = '127.0.0.1:9743'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
chrome = webdriver.Chrome(chrome_options=chrome_options)
chrome.get('http://httpbin.org/get')
3.1.2 带密码的代理
如果是认证代理的话,设置方法比较麻烦。需要在本地创建 manifest.json 配置文件和 background.js 脚本来设置认证代理,本质上是浏览器代理扩展。
参考:
def create_proxy_auth_extension(proxy_host, proxy_port, username, password)
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js_template = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%s",
port: parseInt(%s)
},
bypassList: ["localhost"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%s",
password: "%s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: [""]},
['blocking']
);
"""% (proxy_host, proxy_port, username, password)
with zipfile.ZipFile(plugin_path, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
plugin_path = './authProxy@http-dyn.abuyun.9020.zip'
# 添加插件及必要的配置
option = webdriver.ChromeOptions()
option.add_argument('--no-sandbox')
option.add_extension(plugin_path)
# 测试查看效果
driver = webdriver.Chrome(chrome_options=option)
driver.get("https://httpbin.org/ip")
print(driver.page_source)
3.1.3 认证代理插件运行在非接口环境
chromedriver在添加认证代理(使用扩展)时无法使用headless的问题。安装插件后,不能直接使用无界面模式运行,可以通过虚拟桌面技术间接实现pyvirtualdisplay。
yum install Xvfb
pip3 install PyVirtualDisplay
from pyvirtualdisplay import Display
def __init__(self):
self.display = Display(visible=0, size=(1024, 768))
self.display.start()
.....
def __del__(self):
self.display.stop()
4.参考手册: