博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python下的selenium和PhantomJS
阅读量:5134 次
发布时间:2019-06-13

本文共 4947 字,大约阅读时间需要 16 分钟。

一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览器PhantomJS来抓取javascript渲染的页面, 但是新版本的Selenium不再支持PhantomJS了,请使用Chrome或Firefox的无头版本来替代。

如下图:

这里有2中解决方案, 我采用第一种, 第二种搞了很久也没有成功

一:降级selenium使用

pip uninstall selenium #先卸载selenium
pip install selenium==3.4.3 #指定版本安装selenium

防止以后官网没得下载,先备份个selenium3.4.3和PhantomJS

二:使用Headless Chrome和Headless Firefox

使用Headless Chrome
Headless模式是Chrome 59中的新特征。
要使用Chrome需要安装 chromedriver。

from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options = Options()chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')br = webdriver.Chrome(chrome_options=chrome_options)br.get('https://www.baidu.com/')baidu = br.find_element_by_id('su').get_attribute('value')print(baidu)

使用Headless Firefox

要使用Firebox需要安装 geckodriver。

from selenium import webdriverfrom selenium.webdriver.firefox.options import Optionsfirefox_options = Options()firefox_options.add_argument('--headless')br = webdriver.Firefox(firefox_options=firefox_options)br.get('https://www.baidu.com/')baidu = br.find_element_by_id('su').get_attribute('value')print(baidu)

以上代码我在测试的时候没有成功, 遇到如下错误:

说的是chrome的版本不一致,当然前人也遇到过了, 只是我按照网上说的 没有解决

最后我找了一个老版本解决了问题 

Python的模块pywin32中的win32gui.SystemParametersInfo()函数,在使用win32con.SPI_SETDESKWALLPAPER设置Wallpaper时,其第二个参数为图片路径,图片必须是BMP格式。如下:

win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,  imagepath,  1+2)

否则将报错如下:pywintypes.error: (0, 'SystemParametersInfo', 'No error message is available') 关于 

在设置壁纸的时候发现img_path = "D://Users//Gavin//PythonDemo//Bing.bmp"失败,但是把路径改为img_path = "D:\\Users\\Gavin\\PythonDemo\\Bing.bmp" 就可以了或者img_path = "D:/Users/Gavin/PythonDemo/Bing.bmp"

 

​​​​​​​

我的demo是参考 

具体代码:

# -*- coding: utf-8 -*-"""   此程序用于提取Bing搜索的背景图片并设置为Windows的电脑桌面"""from urllib.request import urlretrievefrom selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionimport win32api,win32con,win32guifrom selenium.webdriver.chrome.options import Options# 利用PhantomJS加载网页chrome_options = Options()chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')browser = webdriver.Chrome(chrome_options=chrome_options)# 设置最大等待时间为30sbrowser.set_page_load_timeout(30)url = 'https://cn.bing.com/'try:    browser.get(url)except TimeoutException:    # 当加载时间超过30秒后,自动停止加载该页面    browser.execute_script('window.stop()')# 从id为bgDiv的标签中获取背景图片的信息t = browser.find_element_by_id('bgDiv')bg = t.get_attribute('style')# 从字符串中提取背景图片的下载网址start_index = bg.index('(')end_index = bg.index(')')img_url = bg[start_index+1: end_index]img_url = img_url.replace('"', '')# 下载该图片到本地img_path = "D:\\Users\\Gavin\\PythonDemo\\Bing.bmp"urlretrieve(img_url, img_path)# 将下载后的图片设置为Windows系统的桌面# 打开指定注册表路径reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)# 最后的参数:2拉伸,0居中,6适应,10填充,0平铺win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "2")# 最后的参数:1表示平铺,拉伸居中等都是0win32api.RegSetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, "0")# 刷新桌面try:    win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE)except Exception as e:    print(e)

 以上代码 确实是可以跑起来的(win10 python3.7), 但是晚上 回家后再win7 就跑不起来,典型的就是 图片问题,需要安装 pip install Pillow  于是 code 变成如下:

# -*- coding: utf-8 -*-"""   此程序用于提取Bing搜索的背景图片并设置为Windows的电脑桌面"""from urllib.request import urlretrievefrom selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionimport win32api, win32con, win32guifrom PIL import Imagefrom selenium.webdriver.chrome.options import Options# 利用PhantomJS加载网页chrome_options = Options()chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')browser = webdriver.Chrome(options=chrome_options)# 设置最大等待时间为30sbrowser.set_page_load_timeout(30)url = 'https://cn.bing.com/'try:    browser.get(url)except TimeoutException:    # 当加载时间超过30秒后,自动停止加载该页面    browser.execute_script('window.stop()')# 从id为bgDiv的标签中获取背景图片的信息t = browser.find_element_by_id('bgDiv')bg = t.get_attribute('style')# 从字符串中提取背景图片的下载网址start_index = bg.index('(')end_index = bg.index(')')img_url = bg[start_index + 1: end_index]img_url = img_url.replace('"', '')# 下载该图片到本地img_path = "D:\\Python\\demoBing.jpg"urlretrieve(img_url, img_path)bmpImage = Image.open(img_path)img_path = img_path.replace('.jpg', '.bmp')bmpImage.save(img_path, "BMP")# 将下载后的图片设置为Windows系统的桌面# 打开指定注册表路径reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)# 最后的参数:2拉伸,0居中,6适应,10填充,0平铺win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "2")# 最后的参数:1表示平铺,拉伸居中等都是0win32api.RegSetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, "0")# 刷新桌面try:    win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE)except Exception as e:    print(e)

 

转载于:https://www.cnblogs.com/majiang/p/9857371.html

你可能感兴趣的文章
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>
linux history
查看>>
jQuery on(),live(),trigger()
查看>>
Python2.7 urlparse
查看>>
sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>