记录一下
背景:
有个同事想要获取项目产品上的一些数据,但是产品并没有提供相应的获取数据的接口。所以这个同事想要抓取请求链接进行数据获取,但是从F12中抓取的请求中需要有一个Authorization的header数据,但是F12上没有获取到生成这个Authorization的接口,猜想这个数据可能直接在代码中生成的。所以现在的问题是如何获取Authorization的值。
在经过一系列考虑后,最后决定最开始使用selenium+browsermob-proxy的方式获取到一个请求接口的Authorization值,之后就可以直接使用接口进行请求获取想要的数据了。
browsermob-proxy
BrowserMob Proxy是一个用户操作浏览器代理的工具,它可以用于记录和分析HTTP请求和响应。主要用途之一是用于自动化测试,例如本文所写。
browsermob-proxy的安装
1. 下载browsermob-proxy.bat
2.安装python模块browsermob-proxy
pip install browsermob-proxy
具体使用
第一步:开启代理
第二步:
第三步:关闭BrowserMob Proxy和selenium
完整代码
from browsermobproxyimport Server
from seleniumimport webdriver
from selenium.webdriver.chrome.optionsimport Options
bmp_path =r"browsermob-proxy.bat的路径"
server = Server(bmp_path)
server.start()
proxy = server.create_proxy()
# 配置Selenium使用BrowserMob Proxy
chrome_options = Options()
chrome_options.add_argument("--proxy-server={0}".format(proxy.proxy))
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument("--ignore-certificate-errors")#解决:您的连接不是私密连接
# 初始化WebDriver
driver = webdriver.Chrome(executable_path=r'chromedriver.exe的路径', options=chrome_options)
# 设置一个新的Har来捕获请求
proxy.new_har("test", options={'captureHeaders':True, 'captureContent':True})
driver.get("****网站链接****")
#重要:此处操作为对目标页面的一些操作
#例如我这边需要使用selenium到对应要获取数据的网站上,然后打开一个可以获取到Authorization的页面
driver.find_element_by_id("username").send_keys("****")
driver.find_element_by_id("password").send_keys("*****")
driver.find_element_by_id("submit_psd").click()
driver.get("*****/productManage")
# 获取HAR数据
har = proxy.har
# 遍历HAR中的请求并查找Auth字段
for entryin har['log']['entries']:
request = entry['request']
url = request['url']
if "pageList" in url:
headers = request['headers']
for hin headers:
if h.get("name")=="Authorization":
auth = h["value"]#这个是Authorization
print(auth)
# 关闭BrowserMob Proxy和Selenium
server.stop()
driver.quit()