python下的selenium和PhantomJS

通常咱們使用python的第三方庫requests及框架scrapy來爬取網上的資源,可是設計javascript渲染的頁面卻不能抓取,此時,咱們使用web自動化測試化工具Selenium+無界面瀏覽器PhantomJS來抓取javascript渲染的頁面, 可是新版本的Selenium再也不支持PhantomJS了,請使用Chrome或Firefox的無頭版原本替代。javascript

以下圖:html

這裏有2中解決方案, 我採用第一種, 第二種搞了好久也沒有成功java

一:降級selenium使用
pip uninstall selenium #先卸載selenium
pip install selenium==3.4.3 #指定版本安裝seleniumpython

防止之後官網沒得下載,先備份個selenium3.4.3和PhantomJS 下載地址git

二:使用Headless Chrome和Headless Firefox
使用Headless Chrome
Headless模式是Chrome 59中的新特徵。
要使用Chrome須要安裝 chromedriver。
chromedriver驅動大全github

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_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 Firefoxweb

要使用Firebox須要安裝 geckodriver。
geckodriver.exe驅動大全chrome

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

firefox_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)

以上代碼我在測試的時候沒有成功, 遇到以下錯誤:windows

說的是chrome的版本不一致,固然前人也遇到過了, 只是我按照網上說的 沒有解決api

Python爬蟲Selenium安裝
使用python selenium時關於chromedriver的小問題

Selenium support for PhantomJS has been deprecated, please use headless

最後我找了一個老版本解決了問題 2.33​​​​​​​

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') 關於 SystemParametersInfo

在設置壁紙的時候發現img_path = "D://Users//Gavin//PythonDemo//Bing.bmp"失敗,可是把路徑改成img_path = "D:\\Users\\Gavin\\PythonDemo\\Bing.bmp" 就能夠了或者img_path = "D:/Users/Gavin/PythonDemo/Bing.bmp"

 

Python更換Windows壁紙,問題與解決方案
使用pythonwin設置windows的桌面背景 ​​​​​​​

個人demo是參考 Python爬蟲之提取Bing搜索的背景圖片並設置爲Windows的電腦桌面

具體代碼:

# -*- coding: utf-8 -*-
"""
   此程序用於提取Bing搜索的背景圖片並設置爲Windows的電腦桌面
"""
from urllib.request import urlretrieve
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
import win32api,win32con,win32gui
from 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)
# 設置最大等待時間爲30s
browser.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表示平鋪,拉伸居中等都是0
win32api.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 urlretrieve
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
import win32api, win32con, win32gui
from PIL import Image
from 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)
# 設置最大等待時間爲30s
browser.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表示平鋪,拉伸居中等都是0
win32api.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)
相關文章
相關標籤/搜索