Selenium_获取响应数据

给只用于网页测试的selenium加一些小扩展。


#

使用 Selenium 模拟真实用户打开目标网页,进行数据输入并点击某个按钮发送请求,使用 BrowserMob Proxy 获取响应的内容。

# BrowserMob Proxy

 BrowserMob Proxy 是一款开源工具,用于以HAR格式捕获web应用程序的性能数据。它还允许操纵浏览器行为和流量,比如模拟网络流量、重写HTTP请求和响应。使用 BrowserMob Proxy 之前,需要在Github将打包好的压缩包下载到本地并解压(用于在本地打开某个端口进行流量捕捉),再使用 pip 安装在虚拟环境(venv/Scripts)中安装相关的库(用于与Python集成)。

pip install browsermob-proxy

有关 Selenium 的使用在Python_Crawling学习记录中有介绍。

# 实例

from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from browsermobproxy import Server

# 开启browserproxy
browser_server = Server(r'browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
browser_server.start()
browser_server_proxy = browser_server.create_proxy()

# 配置chromedriver的proxy
chrome_options = Options()
chrome_options.add_argument('--proxy-server={0}'.format(browser_server_proxy.proxy))
# 允许非安全
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-urlfetcher-cert-requests')

# 指定chromedriver的路径
chrome_driver_path = 'chromedriver.exe'
# 生成Service对象
chrome_service = Service(executable_path=chrome_driver_path)
# 生成带proxy参数的Chrome对象
chrome_browser = webdriver.Chrome(service=chrome_service, options=chrome_options)

base_url = 'https://baidu.com'

# 在模拟浏览器之前,打开proxy
browser_server_proxy.new_har('polygon_search', options={'captureHeaders': True, 'captureContent': True})

...
...
...

# 给一个等待时间确保响应被获取到
time.sleep(3)
# 分析在以上过程中的所有网络请求和响应
all_result = browser_server_proxy.har
for entry in all_result['log']['entries']:
    entry_url = entry['request']['url']
    # 根据url找到想要的数据内容
    if 'baidu.com/aaa/api/bbb?' in entry_url:
        response = entry['response']
        content = response['content']['text']
        print(content)

# 关闭代理和chromedriver
# browser_server.stop()
# chrome_browser.quit()

如果在 PyCharm 直接点右上角的三角形运行程序,则执行完代码后浏览器会自动关闭。若不想其关闭,则右键点击代码窗口,选择 Run File in Python Console

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments