Selenium與PhantomJS踩過的坑
Selenium
Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,類型像我們玩游戲用的按鍵精靈,可以按指定的命令自動化操作,不同是Selenium可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器)。
Selenium可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的頁面,甚至頁面截屏,或者判斷網站上某些動作是否發生。
Selenium自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時候需要讓它內嵌在代碼中運行,所有我們需要用一個叫PhantomJS的工具代替真實的瀏覽器。
Selenium的安裝
直接通過pip安裝即可,這里沒什么坑
pip install selenium
PhantomJS
PhantomJS是一個基於Webkit的"無界面"(headless)瀏覽器,它會把網站加載到內存並執行頁面上的JavaScript,因為不會展示圖形界面,所以運行起來比完整的瀏覽器更高效。
如果我們把Selenium和PhantomJS結合在一起,就可以運行一個非常強大的網絡爬蟲了,這個爬蟲可以處理JavaScript、Cookie、headers,以及任何我們真實用戶需要做的事情。
注意:
- PhantomJS只能從它的網站(http://phantomjs.org/download.html)下載。
- 因為PhantomJS是一個功能完善(雖然無界面)的瀏覽器而非一個Python庫,所以它不需要像Python的其它庫一樣安裝,但我們可以通過Selenium調用PhantomJS來直接使用
- PhantomsJS官方才考文檔:http://phantomjs.org/documention
- 這里不能通過pip、apt-get,yum等方式安裝,一開始在自己虛擬機通過apt-get安裝,但是一直報錯。后來又全卸載,重新通過官網下載手動安裝才行。
- 在自己的遠程服務器中運行代碼,報錯:
TypeError: urlopen() got multiple values for keyword argument 'body'
原因是服務器的urllib3版本太低,卸載以后重裝就好了
sudo apt-get remove python-urllib3
sudo pip install -U urllib3
下面是代碼:
#-*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.PhantomJS()
driver.get("www.wangzhi.com") #穿入你的網址
driver.find_element_by_name("email").send_keys("aaa@qq.com") #按F12,查看網頁源代碼中登錄界面的name傳參是什么
# 我的網頁:<input id="loginEmail" class='login_input' type="text" name="email" placeholder="請輸入您的郵箱">
# 所以 find_element_by_name("email")里面穿的是email,pwd一樣,find_element_by_id也一樣
time.sleep(2)
driver.find_element_by_name("pwd").send_keys('111111')
time.sleep(2)
driver.find_element_by_id("loginButton").click()
time.sleep(5)
driver.save_screenshot('broad.png')
服務器沒有中文字體
所有都准備好了,原本以為萬事大吉,但是發現截圖的內容,不能顯示中文。
在網上查了原因是系統沒有裝中文字體。
安裝字體可以參考https://www.jianshu.com/p/e7f12b8c8602
中文字體解決以后,又出現了截圖頁面不完整
最后在網上查了原因 ,是因為分辨率的原因
在代碼上添加
driver.set_window_size(1366, 768)
完整代碼:
#-*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any'])
driver.get("yourwebsite")
driver.set_window_size(1366, 768) #這里必須加在get網頁的后面,加在它之前沒用
driver.find_element_by_name("email").send_keys("你的用戶名")
time.sleep(1)
driver.find_element_by_name("pwd").send_keys('你的密碼')
time.sleep(1)
driver.find_element_by_id("loginButton").click()
time.sleep(5)
driver.save_screenshot('/data/jenkins/broadcastPicture/broad.png')
因為截圖涉及公司數據,就不粘貼到這里了。
實踐過程中,通過參考 Python爬蟲(二十一)_Selenium與PhantomJS實現了自動截圖,
參考Python爬蟲(二十二)_selenium案例:模擬登陸豆瓣實現了自動登錄