本文共 3601 字,大约阅读时间需要 12 分钟。
安装selenium3模块
pip3 install selenium 如果上面的命令因为网络问题,重试多次仍失败,可以尝试下面的命令 pip3 install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com配置selenium相关的环境
下载并安装最新的Chrome版本 wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm yum -y install google-chrome-stable_current_x86_64.rpm 检查安装的Chrome版本 which google-chrome-stable /bin/google-chrome-stable 使用下面的命令得到Chrome的版本号 google-chrome-stable -version Google Chrome 81.0.4044.113使用下面的命令查看帮助
/bin/google-chrome-stable --help
下面对应的ChromeDriver版本,从下面的地址
https://sites.google.com/a/chromium.org/chromedriver/downloads 下载 wget https://chromedriver.storage.googleapis.com/81.0.4044.69/chromedriver_linux64.zip unzip chromedriver_linux64.zip cp -f chromedriver /usr/bin/ chmod 755 chromedriver 确保chrome和chromedriver版本一致,并且chromedriver的安装位置,需要在python代码中使用运行测试demo
python3 selenium_demo.py#!/usr/bin/env python3#encoding: utf-8#description: 测试程序控制并驱动Chrome 81#note:需要安装selenium3,chromedriver和Chrome版本兼容#date: 2020-04-21from selenium import webdriverif __name__ == '__main__': options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') url = 'https://www.baidu.com' browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver", options=options) browser.get(url) print(browser.page_source) browser.quit()
这个python脚本,使用selenium去远程获取指定url的网页源码并打印出来。
关于selenium模块中webdriver各API的使用方法,参见下面的链接
遇到的问题
1.chromedriver下载速度非常慢解决方法: 测试发现,需要翻墙才能下载速度快,可以从我的ThinkPad T420的Chrome上翻Q下载该文件,再从虚拟机上下载ThinkPad T420的文件。
2.centos7中Chrome通过selenium截图汉字显示为方框
解决方法:在执行截图任务的虚拟机上安装中文字体,比如这里我选择的是最爱的文泉驿微米黑字体,执行下面的命令wget http://rpmfind.net/linux/centos/7.7.1908/os/x86_64/Packages/wqy-microhei-fonts-0.2.0-0.12.beta.el7.noarch.rpm
rpm -ivh wqy-microhei-fonts-0.2.0-0.12.beta.el7.noarch.rpm 安装完成之后,直接可以看到字体已经安装成功了。 fc-list :lang=zh 然后打开中文网页就不会乱码了。3.采用selenium自带截图工具截取的Grafana看板的图片截取不完全
解决方法:经过网上调研和测试发现,能否成功截取全屏,与网页代码的使用有一定关系。试过各种招儿之后,都未能圆满解决,最后我实在没撤了,硬着头皮研究了Grafana页面的代码,发现里面有个唯一的div具有清晰的width和height,直接获取它的值就能大致确定整个截图的大小,从而巧妙解决了这个问题。
找到这个唯一关键的div,并且有尺寸大小,发现只有这个元素的height是真实的
<div class="react-grid-layout layout" style="height: 1590px;">经过测试,发现下面的方法是可行的, 但是有时候执行不稳定
ele = browser.find_element_by_class_name("react-grid-layout.layout") print(ele.size)对于普通的网页,使用常规思路就可以了。具体问题具体分析吧。下面以豆瓣首页截取全屏为例,给出一个具有普遍意义的代码selenium_douban.py实现如下:
#!/usr/bin/env python3#encoding: utf-8#description: 实现selenium+chromedriver+python实现豆瓣的全文截取,实测有效#date: 2020-04-22from selenium import webdriverimport timeoptions = webdriver.ChromeOptions()options.add_argument('--headless')options.add_argument('--dns-prefetch-disable')options.add_argument('--no-referrers')options.add_argument('--disable-gpu')options.add_argument('--disable-audio')options.add_argument('--no-sandbox')options.add_argument('--ignore-certificate-errors')options.add_argument('--allow-insecure-localhost')driver = webdriver.Chrome(options=options)driver.get('http://www.douban.com')width = driver.execute_script( "return Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);")height = driver.execute_script( "return Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);")print(width, height)driver.set_window_size(width + 100, height + 100)time.sleep(5)driver.save_screenshot('douban.png')driver.close()
得到的效果图如下:
转载地址:http://gwcoi.baihongyu.com/