起因
Selenium本身是不支持HTTP請求抓取的,因為其團隊認為這個不是selenium要解決的問題(確實也是),所以推薦使用一個相關聯的專案 – BrowserMobProxy,
具體專案首頁見相關GitHub,
嘗試
因為專案需要,所以就研究了下BrowserMobProxy,它其實是一個java實作的開源代理專案,它與普通的代理不同之處在于:
它支持REST API介面(可以通過http請求來動態創建代理服務)
默認啟動的是一個代理Manager,它會管理N多個代理服務(我們真正使用的就是這個代理服務)
可以支持動態的代理配置
一張圖看懂BrowserMobProxy的業務邏輯,

即在使用代理之前,需要先啟動代理Manager;而這個Manager提供了REST API介面,支持動態創建代理服務,(它會維護一批申請過的代理服務)之后我們使用的其實都是新申請的代理服務,(所以它并不是一個代理實體,而是一個代理管理服務)
在這里向大家推薦一個學習資料群:175317069
使用
要使用BrowserMobProxy首先你需要啟動它的代理Manager,有3種方式:
直接通過bin目錄下的腳本檔案啟動(如:browsermob-proxy.bat)
在程式中動態執行腳本檔案
JAVA專案可以匯入到專案中通過SDK啟動
BrowserMobProxy的代理Manager啟動后,就可以向它申請具體的代理服務了,主要有2種方式:
REST API方式
JAVA的SDK方式
由于這里是講Python相關的,所以后面只講REST API方式,啟動代理Manager和申請代理服務的代碼如下:

上述代碼是在程式中執行了BrowserMobProxy的啟動腳本,然后申請了一個代理服務,當然,你還可以先手動啟動BrowserMobProxy,接著在程式中就可以直接申請代理服務即可,(也可以是遠程服務器上的地址)

光有上面的代碼還不夠,我們需要和Selenium代理整合之后,才能知道是否可以滿足我們的需求,在具體執行代碼之前你需要安裝2個前提庫:

然后就可以執行如下代碼了,

如果一切正常的話,這3個函式都是可以執行的,前提是對應的Webdriver和瀏覽器得先配置好了,如果你是在遠程服務器上啟動的代理Manager,記得關掉防火墻,
填坑
這個是針對Python用戶的,如果你是java用戶則沒有這樣的苦惱,因為這些功能jar包的SDK中都已經支持了,
啟動代理Manager時指定引數
由于支持BrowserMobProxy的Python庫只有一個在pypi上,而該庫雖然可以支持基本的使用,但是如果你希望配置更多的引數,則需要自己動手來解決,因為在Python的browsermobproxy庫中啟動代理Manager時未提供指定啟動引數的選項,所以如果你需要在程式里啟動代理Manager時帶上引數,則有3種方式可以實作:
在啟動腳本中添加固定引數
修改Python庫支持指定引數
提供一個帶引數的命令
接著,就來逐一看下如何去實作,如果是第一種則需修改對應的啟動腳本(linux或windows),并設定固定的引數,

同樣是在最后一行追加了指定的引數內容,如果選擇第二種方式則需要修改Python的browsermobproxy庫(這里不建議),因為第三種方式可以更好的解決這個問題,即把啟動字串修改為一個串列即可,

申請代理服務時指定引數
可以指定代理Manager的啟動引數后,還需要可以指定代理的啟動引數,比如:忽略HTTPS的認證錯誤,而這里就真的需要修改Python庫了,具體的代碼修改如下:

這個可能是作者開發的失誤,因為POST正常是不支持URL引數接收,作者可能是希望能列印出來,所以拼接成url串,只是在POST時忘記轉回了,
完整代碼
from selenium import webdriver
import browsermobproxy
Required:
pip install selenium
pip install browsermob
BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
server = browsermobproxy.Server(BROWSERMOBPROXY, {‘port’: 8080}) # 初始化一個代理Manager服務,并監聽8080埠
server.start() # 啟動代理Manager服務
proxy = server.create_proxy() # 向代理Manager服務申請一個代理服務,會使用默認埠8081
print(proxy.port)
#proxy = browsermobproxy.Client(‘http://localhost:8080’) # 向已有代理Manager服務申請一個代理服務
def set_proxy_for_ff():
profile = webdriver.FirefoxProfile()
driver = webdriver.Firefox(firefox_profile=profile, proxy=proxy.selenium_proxy()) # 配置selenium使用指定的代理服務
proxy.new_har(“test”, options={‘captureContent’: True, ‘captureHeaders’: True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get(“http://www.baidu.cn”) # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
def set_proxy_for_chrome():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.Chrome(desired_capabilities=dc) # 配置selenium使用指定的代理服務
proxy.new_har(“test”, options={‘captureContent’: True, ‘captureHeaders’: True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get(“http://www.baidu.cn”) # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
def set_proxy_for_phantomjs():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.PhantomJS(desired_capabilities=dc) # 配置selenium使用指定的代理服務
proxy.new_har(“test”, options={‘captureContent’: True, ‘captureHeaders’: True}) # 開啟代理監控,如果不監控會拿不到請求內容
driver.get(“http://www.baidu.cn”) # 訪問頁面
# TODO:其它頁面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理監控
print(proxy.har) # 列印請求日志資訊
if ‘main’ == name:
set_proxy_for_ff()
set_proxy_for_chrome()
set_proxy_for_phantomjs()
在這里推薦一個我自己創建的軟體測驗交流群 ,QQ:642830685,群中會不定期的分享軟體測驗資源,測驗面試題以及行業資訊,大家可以在群中積極交流技術,風里雨里我在群中等你,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252500.html
標籤:其他
