给只用于网页测试的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。