使用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