1. 程式人生 > >使用selenium操作PhantomJS的常用操作

使用selenium操作PhantomJS的常用操作

採集淘寶商品資料的時候,主要用到了Selenium+PhantomJS。在這個過程中對淘寶的嚴厲反爬措施佩服至極,個人也得到了很多成長。雖然歷經曲折,最終還是能正常執行自己的指令碼採集資料。

這裡總結一下Selenium+PhantomJS使用中常用的操作。

設定等待時間隱式等待,等同於time.sleep()

driver.implicitly_wait(40)


設定PhantomJS傳送和接收請求的相關引數

# 構造一個PHANTOMJS物件
phan = dict(DesiredCapabilities.PHANTOMJS)
 
# 在執行前修改物件引數
 
#設定user-agent請求頭
UserAgent = "..."
phan["phantomjs.page.settings.userAgent"] = (UserAgent)
 
# 禁止載入圖片
phan["phantomjs.page.settings.loadImages"] = False 
 
# 設定請求cookie
phan["phantomjs.page.customHeaders.Cookie"] = 'SINAGLOBAL=3955422793326.2764.1451802953297; 
'
# 禁用快取
phan["phantomjs.page.settings.disk-cache"] = True 
 
#  設定代理
service_args = ['--proxy=127.0.0.1:9999','--proxy-type=socks5']
 
# 載入自定義配置
driver = webdriver.PhantomJS(r"D:\phantomjs-2.1.1-windows\bin\phantomjs.exe",desired_capabilities=phan,service_args=service_args)
 
# 設定get url最大等待時間,規定時間內沒有響應就會報錯
#  類似於requests.get()的timeout選項,但driver.get()沒有timeout選項
driver.set_page_load_timeout(40)
 
# 設定指令碼超時時間
driver.set_script_timeout(10)


關於PhantomJS物件的settings 引數 

phan["phantomjs.page.settings.xxxx"] = xxxx
該屬性儲存請求/接收的各種設定:

javascriptEnabled定義是否在頁面中執行指令碼(預設為true)。

loadImages定義是否載入內聯影象(預設為true)。

localToRemoteUrlAccessEnabled定義本地資源(例如從檔案)是否可以訪問遠端URL(預設為false)。

userAgent 定義當網頁請求資源時傳送到伺服器的使用者代理。

userName 設定用於HTTP身份驗證的使用者名稱。

password 設定用於HTTP身份驗證的密碼。

XSSAuditingEnabled定義是否應監視載入請求以進行跨站點指令碼嘗試(預設為false)。

webSecurityEnabled定義是否啟用Web安全性(預設為true)。

resourceTimeout(以毫秒為單位)定義超時時間,所請求的資源將停止嘗試並繼續執行頁面的其他部分。onResourceTimeout回撥將在超時時呼叫。

切換到操作iframe

flag = driver.find_element_by_tag_name('iframe')
driver.switch_to.frame(flag)
切換回操作主視窗

driver.switch_to.default_content()


獲得session_id  page_source  get_cookies()

browser.session_id
browser.page_source
browser.get_cookies()


另外使用phantomjs多執行緒會有異常卡死的情況,儘量使用多程序。

from multiprocessing import Pool
pool = Pool(8)
data_list = pool.map(func, url_list)
pool.close()
pool.join()


對於有可能異常退出情況,最好加一句driver.quit(),否則程式退出了但是phantomjs沒有退出,一直佔用資源。

driver.quit()


使用chrome時,可以隱藏chrome的介面執行

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800,800))
display.start()


設定代理,清空快取重新開啟

利用DesiredCapabilities(代理設定)引數值,重新開啟一個sessionId,我看意思就相當於瀏覽器清空快取後,加上代理重新訪問一次url

proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.MANUAL
proxy.http_proxy='1.9.171.51:800'
# 將代理設定新增到webdriver.DesiredCapabilities.PHANTOMJS中
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')


還原到系統(自己的ip)代理

proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.DIRECT
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')

 


原文:https://blog.csdn.net/weixin_39198406/article/details/78231439