Browsermob-Proxy(Selenium)爬取瀏覽器獲取Har資訊(含例項)
阿新 • • 發佈:2021-02-05
技術標籤:爬蟲
使用Selenium 爬取網頁內容時,非同步載入、js加密、動態Cookie等問題都非常簡單的能夠獲取或提交表單。
很多網站資料都是通過json 結構來互動,直接分析json 結構資料不但全而且很好解析,這比解析 html 網頁簡單很多。而且很多時候一些介面返回的關鍵資訊不在 html 網頁上顯示,直接通過 selenium 獲得的這些網頁就沒有這些資訊。
selenium + webdriver雖然能夠定位DOM元素、操作網頁、獲取網頁等,但是 Selenium 只能處理“結果”,它無法得知瀏覽器請求的資料介面資訊。若是能夠像瀏覽器 Network 那樣獲取所有介面的請求和返回資訊,就能夠獲取一些關鍵資訊。
本文使用BrowserMob-Proxy 來解決這個問題。 使用 webdriver 通過 proxy 訪問網路,再收集 proxy 端的請求和返回內容,從而獲取到資料,而這個 proxy 就類似於 fiddler 抓包軟體。
1、安裝Browsermob-Proxy
(1)、 pip3 install BrowserMob-Proxy
(2)、 下載java端BrowserMob-Proxy包:http://bmp.lightbody.net/
(3)、 安裝java8環境
2、實戰
這裡以 百度 為例。使用 Selenium + Webdriver + Browsermob-Proxy
from browsermobproxy import Server
from selenium import webdriver
import time
import pprint
class ProxyManger:
__BMP = "D:/AzRjN/browsermob_proxy/browsermob-proxy-2.1.4/bin/browsermob-proxy.bat"
def __init__(self):
self.__server = Server(ProxyManger.__BMP)
self. __client = None
def start_server(self):
self.__server.start()
return self.__server
def start_client(self):
self.__client = self.__server.create_proxy(params={"trustAllServers": "true"})
return self.__client
@property
def client(self):
return self.__client
@property
def server(self):
return self.__server
if __name__=="__main__":
# 開啟Proxy
proxy = ProxyManger()
server = proxy.start_server()
client = proxy.start_client()
# 配置Proxy啟動WebDriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server={}".format(client.proxy))
options.add_argument('--ignore-certificate-errors')
chromePath = r"D:\AzRjN\anaconda3_7\envs\demo36\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"
driver = webdriver.Chrome(executable_path=chromePath, chrome_options=options)
# 獲取返回的內容
client.new_har("baidu.com")
driver.get("https://www.baidu.com/")
time.sleep(3)
newHar = client.har
pprint.pprint(newHar)
server.stop()
通過 Har 就能獲取瀏覽器所有的請求,然後過濾出資料介面就OK,而且拿到的結構和在瀏覽器開發者模式 Network中看到的是一樣的。