Python 使用BrowserMob Proxy + Selenium 獲取Ajax加密數據


BrowserMob Proxy,簡稱 BMP,它是一個 HTTP 代理服務,我們可以利用它截獲 HTTP 請求和響應內容。

第一步:先安裝 BrowserMob Proxy 的包。

pip install browsermob-proxy

 第二步:下載 browsermob-proxy 的二進制文件,用於啟動 BrowserMob Proxy。

下載地址:https://github.com/lightbody/browsermob-proxy/releases

第三步:測試。

from browsermobproxy import Server


# 啟動代理, 修改下載的文件路徑
server = Server(r'F:\BrowserMobProxy\browsermob-proxy-2.1.4\bin\browser-mob-proxy.bat') 
server.start()
proxy
= server.create_proxy()
print('proxy', proxy.proxy)

注意:若報錯,可查看server.log中的信息。如果沒有裝java,自行百度安裝java,配置java環境,cmd輸入java和javac測試是否配置成功。

第四步:找個網站試試。

# _*_ coding:utf-8 _*_
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from browsermobproxy import Server
import time
import json


# 啟動代理
server = Server(r'C:\Program Files\browser-mob-proxy-2.1.4\bin\browser-mob-proxy.bat')
server.start()
proxy = server.create_proxy()

# 啟動瀏覽器
chrome_options = Options()
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
# chrome_options.add_argument('--headless')  # 無頭模式
browser = webdriver.Chrome(options=chrome_options)

# 監聽結果
url = '*********************'
proxy.new_har(options={
        'captureContent': True,
        'captureHeaders': True
    })
browser.get(url)
time.sleep(2)
for i in range(3):
    print(f'正在點擊第{i+1}頁')
    browser.find_element_by_id('nextPage').click()
    time.sleep(0.2)
    # 讀取結果
    result = proxy.har
    for entry in result['log']['entries']:
        request = entry['request']
        response = entry['response']
        # 判斷數據所在url並解析數據
        if '/****/****' in request['url']:
            text = response['content']['text']
            text_dict = json.loads(text)
            content_list = text_dict['list']
            for content in content_list:
                name = content['mc']
                print(name)
time.sleep(1)
# 關閉代理和瀏覽器
proxy.close()
browser.close()

也可以封裝一下,代碼走起:

# _*_ coding:utf-8 _*_
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from browsermobproxy import Server
import time
import json


class BaseFramework(object):

def __init__(self):
# 修改下載的文件路徑
self.server = Server(r'F:\BrowserMobProxy\browsermob-proxy-2.1.4\bin\browser-mob-proxy.bat')
        self.server.start()
self.proxy = self.server.create_proxy()
chrome_options = Options()
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--proxy-server={0}'.format(self.proxy.proxy))
chrome_options.add_argument('--headless') # 無頭模式
self.browser = webdriver.Chrome(options=chrome_options)

def process_request(self, request, response):
pass

def process_response(self, response, request):
pass

def run(self, func, *args):
self.proxy.new_har(options={
'captureContent': True,
'captureHeaders': True
})
func(*args)
result = self.proxy.har
for entry in result['log']['entries']:
request = entry['request']
response = entry['response']
self.process_request(request, response)
self.process_response(response, request)

def __del__(self):
self.proxy.close()
self.browser.close()


class Framework(BaseFramework):

def load(self, url):
self.browser.get(url)
time.sleep(3)

def process_request(self, request, response):
pass

def process_response(self, response, request):
# print(request['url'])
# 找到你所需數據的url即可快樂的解析數據了
if '/item/timemap/cn/' in request['url']:
try:
text = response['content']['text']
text_dict = json.loads(text)
data_result = text_dict['data']
except KeyError:
print('----KeyError: text----')
return
name = data_result['name'] # 姓名
id_name = name_id + '_' + name
print(id_name)
time_map_list = data_result['timeMap']
if time_map_list:
time_map_dict = {}
for i in range(len(time_map_list)):
time_map = time_map_list[i]
time_map_dict[str(i)] = time_map
else:
return
path = f'./****/{id_name}.json'
if os.path.exists(path):
print(f'------{id_name}--已存在------')
return
with open(path, 'w', encoding='utf-8') as f:
f.write(json.dumps(time_map_dict, ensure_ascii=False, indent=4))


if __name__ == '__main__':
Framework = Framework()
id_list = ['********']
for name_id in id_list:
url = "************************"
Framework.run(Framework.load, url)

結果如下:

 

解釋解釋:

代碼一共分了四步:

•第一步便是啟動 BrowserMob Proxy,它會在本地啟動一個代理服務,這里注意 Server 的第一個參數需要指定 BrowserMob Proxy 的可執行文件路徑,這里我就指定了下載下來的 BrowserMob Proxy 的 bin 目錄的 browsermob-proxy 的路徑。
•第二步便是啟動 Selenium 了,它可以設置 Proxy Server 為 BrowserMob Proxy 的地址。
•第三步便是訪問頁面同時監聽結果,這里我們需要調用 new_har 方法,同時指定捕獲 Resopnse Body 和 Headers 信息,緊接着調用 Selenium 的 get 方法訪問一個頁面,這時候瀏覽器便會加載這個頁面,同時所有的請求和響應信息都會被記錄到 HAR 中。
•第四步便是讀取 HAR 到內容了,我們調用 log 到 entries 字段,里面便包含了請求和響應的具體結果,這樣所有的請求和響應信息我們便能獲取到了,Ajax 的內容也不在話下。

有了這個我們就不需要非得等頁面加載出來之后再根據頁面渲染結果提取信息了,Ajax 請求直接拿原始數據,爽歪歪!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM