Python selenium+browsermobproxy获取request Header or Token

前提:拥有能够登录系统的用户名和密码

问题:网站有验证码验证

因为某些网站有变动的验证码进行验证,一开始使用opencv库想要自动识别,但是发现识别效果不太好(没学过深度=),遂改用selenium进行登录获取request Headers以及页面响应

selenium 进行登录,手动输入登录信息以及验证码后跳转到自己想要的页面

登录
chrome_options = Options()
#添加proxy参数
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
#避免w3c
chrome_options.add_experimental_option('w3c', False)
driver = webdriver.Chrome(options=chrome_options)
# 打开登录页面
driver.get("登陆页面的url")
# 页面缓冲
userHand = input("-----在下面人工输入用户名-----\n:")
passswordHand = input("-----在下面人工输入密码-----\n:")
Seccodeverify = input("-----在下面人工输入验证码-----\n:")
time.sleep(3)
# 填写用户名、密码和验证码
# 获取页面元素
username_input = driver.find_element(By.ID, "form_item_name")
password_input = driver.find_element(By.ID, "form_item_password")
captcha_input = driver.find_element(By.ID, "form_item_captcha")
login_btn = driver.find_element(By.CLASS_NAME, "login-btn")
username_input.send_keys(userHand)
password_input.send_keys(passswordHand)
captcha_input.send_keys(Seccodeverify)
# 登录按钮提交
login_btn.click()
访问页面
# 访问调查页面获取抓包数据 得到访问某接口时需要的内置参数
time.sleep(1)
# 你需要抓取的页面的url
driver.get("url")
time.sleep(10)
page_element = driver.page_source
# 你需要点击的页面按钮位置
waitingCheckNumber = driver.find_element(By.XPATH, "//*[text()='']")
checkedNumber = driver.find_element(By.XPATH, "//*[text()='']")
# SubmitNumber = driver.find_element(By.XPATH, "//*[text()='已提交']")
# 在当前session中更新cookies
sessionId = driver.session_id
cookie = {'sessionid': sessionId}
session.cookies.update(cookie)
waitingCheckNumber.click()
time.sleep(1)
checkedNumber.click()
time.sleep(1)

这边不知道有没有必要更新session中的cookie(获取到的是空的),因为学的比较浅就没深究,感觉还是要看网站请求中有没有cookie,有的话还是有必要更新以下的,没有的话就算了

browsermobproxy获取request Headers以及payload等一系列参数
# 创建proxy请求
server = Server(r'E:\pythonProject\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
server.start()
proxy = server.create_proxy()
proxy.new_har("turangsanpuadmin", options={'captureHeaders': True, 'captureContent': True})
result = proxy.har
for entry in result['log']['entries']:
    _url = entry['request']['url']
    payload = urlToDict(_url)
    payload['pageSize'] = 50
    if '你需要请求的接口api(如果不知道的话可以先看一下result里面有什么)' in _url:
        # 修改request Headers
        _headers = entry['request']['headers']
        for header in _headers:
            headers[header['name']] = header['value']
        #     post请求专用
        # _postDatas = json.loads(entry['request']['postData']['text'])
        # for postData in _postDatas:
        #     # 修改pageSize最大化
        #     postData_value = _postDatas[postData]
        #     payload[postData] = postData_value
        #     payload['pageSize'] = 50
        # _response = entry['response']
        # _content = _response['content']['text']
        # # 获取接口返回内容
        # # print(_postDatas)
        # print(_response)
        # print(_content)
        break

然后就可以快乐去请求接口数据啦
#这是get请求的
response = session.get(url=target_url, params=payload, headers=headers)
#这是post
#需要注意的是post请求中的参数必须转化成json格式
response = session.post(target_url, json.dumps(payload), headers=headers)

完整代码如图

import base64
import json
import pandas as pd
from selenium.webdriver.common.by import By
import time
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from browsermobproxy import Server
# 分离url
from urllib.parse import urlparse, parse_qs, urlencode
# 创建proxy请求
server = Server(r'E:\pythonProject\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
server.start()
proxy = server.create_proxy()
proxy.new_har("turangsanpuadmin", options={'captureHeaders': True, 'captureContent': True})
# 创建session会话
session = requests.Session()
# 创建浏览器驱动程序实例
chrome_options = Options()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
chrome_options.add_experimental_option('w3c', False)
driver = webdriver.Chrome(options=chrome_options)
# 打开登录页面
driver.get("url")
# 页面缓冲
userHand = input("-----在下面人工输入用户名-----\n:")
passswordHand = input("-----在下面人工输入密码-----\n:")
Seccodeverify = input("-----在下面人工输入验证码-----\n:")
time.sleep(3)
# 填写用户名、密码和验证码
# 获取页面元素
username_input = driver.find_element(By.ID, "")
password_input = driver.find_element(By.ID, "")
captcha_input = driver.find_element(By.ID, "")
login_btn = driver.find_element(By.CLASS_NAME, "")
username_input.send_keys(userHand)
password_input.send_keys(passswordHand)
captcha_input.send_keys(Seccodeverify)
# 登录按钮提交
login_btn.click()
# 访问接口数据需要用到的初始参数
headers = {}

# 访问调查页面获取抓包数据 得到访问某接口时需要的内置参数
time.sleep(1)
# 你需要抓取的页面的url
driver.get("url")
time.sleep(10)
page_element = driver.page_source
# 你需要点击的页面按钮位置
waitingCheckNumber = driver.find_element(By.XPATH, "//*[text()='']")
checkedNumber = driver.find_element(By.XPATH, "//*[text()='']")
# SubmitNumber = driver.find_element(By.XPATH, "//*[text()='已提交']")
# 在当前session中更新cookies
sessionId = driver.session_id
cookie = {'sessionid': sessionId}
session.cookies.update(cookie)
waitingCheckNumber.click()
time.sleep(1)
checkedNumber.click()
time.sleep(1)

# 配置获取抓包数据,匹配接口
result = proxy.har
for entry in result['log']['entries']:
    _url = entry['request']['url']
    payload = urlToDict(_url)
    payload['pageSize'] = 50
    if '/api/ssp/dcyd/xj/yzjsh/page' in _url:
        # 修改request Headers
        _headers = entry['request']['headers']
        for header in _headers:
            headers[header['name']] = header['value']
        #     post请求专用
        # _postDatas = json.loads(entry['request']['postData']['text'])
        # for postData in _postDatas:
        #     # 修改pageSize最大化
        #     postData_value = _postDatas[postData]
        #     payload[postData] = postData_value
        #     payload['pageSize'] = 50
        # _response = entry['response']
        # _content = _response['content']['text']
        # # 获取接口返回内容
        # # print(_postDatas)
        # print(_response)
        # print(_content)
        break

target_url = 'api'


# 定义拿数据的方法 post
# def getData(target_url, payload, headers):
#     records_list_number = 0
#     records_list_total = 0
#     response = session.post(target_url, json.dumps(payload), headers=headers)
#     while response.status_code == 200:
#         response_text_dict = json.loads(response.text)
#         records_list_number += len(response_text_dict['result']['records'])
#         records_list_total = response_text_dict['result']['total']
#         print(response_text_dict)
#         while records_list_number < records_list_total:
#             payload['pageNum'] += 1
#             response = session.post(target_url, json.dumps(payload), headers=headers)
#             break
#         if records_list_number == records_list_total:
#             break
# 定义拿数据的方法 get
def getDataGet(target_url, payload, headers):
    records_list_number = 0
    records_list_total = 0
    response = session.get(url=target_url, params=payload, headers=headers)
    while response.status_code == 200:
        response_text_dict = json.loads(response.text)
        records_list_number += len(response_text_dict['result']['records'])
        records_list_total = response_text_dict['result']['total']
        if records_list_number != 0:
            records_list = response_text_dict['result']['records']
            for record in records_list:
                #具体处理
        while records_list_number < records_list_total:
            payload['pageNum'] = str(int(payload['pageNum']) + 1)
            response = session.get(url=target_url, params=payload, headers=headers)
            break
        if records_list_number == records_list_total:
            driver.quit()
            break
getDataGet(target_url, payload, headers)




<think>我们正在使用Selenium(不是SeleniumWire)在Windows7下用Python3.8添加请求头(headers)。注意,原生的SeleniumWebDriver并没有直接的方法来设置请求头,但我们可以通过以下两种方法实现:###方法一:使用浏览器扩展(适用于Chrome/Firefox)通过加载一个修改请求头的扩展(如ModHeader)来实现。这种方法需要提前下载扩展文件(.crx或.xpi)。###方法二:使用`webdriver.Remote`(需要启动远程WebDriver)通过启动一个自定义的远程WebDriver,并在其配置中设置请求头。但这种方法较为复杂。###方法三:使用SeleniumWire(推荐)虽然用户之前使用了Selenium,但如果需要添加请求头,使用SeleniumWire库是最直接的方式。因为SeleniumWire可以拦截和修改请求。鉴于用户的环境是Windows7+Python3.8,并且之前的问题是关于SeleniumWire的,但这次明确要求使用Selenium(没有Wire),我们提供两种方案:**方案A:使用SeleniumWire(简单,推荐)**如果用户愿意使用SeleniumWire,则可以直接使用拦截器(interceptor)来添加请求头。**方案B:纯Selenium(使用浏览器扩展)**如果用户坚持使用纯Selenium,则采用加载扩展的方式。---##方案A:使用SeleniumWire添加请求头(推荐)###步骤1.**安装SeleniumWire**(注意兼容性,Windows7可能需要安装特定版本的库)```bashpipinstallselenium-wire==5.1.0```2.**代码示例**(以Chrome为例)```pythonfromseleniumwireimportwebdriverfromwebdriver_manager.chromeimportChromeDriverManager#创建请求拦截器函数definterceptor(request):#添加自定义请求头request.headers['Authorization']='Bearertoken123'request.headers['User-Agent']='Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'#可以添加其他需要的请求头#配置浏览器选项options=webdriver.ChromeOptions()options.add_argument('--ignore-certificate-errors')#忽略证书错误(针对Windows7的SSL问题)#初始化WebDriver(使用SeleniumWire的webdriver)driver=webdriver.Chrome(executable_path=ChromeDriverManager().install(),options=options,seleniumwire_options={'request_interceptor':interceptor,#设置拦截器'disable_capture':True#不捕获请求内容,提升性能})try:driver.get("https://example.com")#...其他操作finally:driver.quit()```###说明-通过`request_interceptor`函数,我们可以修改请求的headers。-在Windows7下,可能需要处理SSL证书问题,通过添加`--ignore-certificate-errors`选项解决。---##方案B:纯Selenium(使用ModHeader扩展)###步骤1.**下载ModHeader扩展**-Chrome:从Chrome网上应用店下载ModHeader.crx(若无法下载,可搜索第三方资源,注意安全)-Firefox:下载ModHeader.xpi(同样注意安全)2.**将扩展添加到浏览器选项中**-对于Chrome,需要指定扩展文件路径(.crx文件)-对于Firefox,指定.xpi文件路径3.**设置自定义请求头**###代码示例(Chrome)```pythonfromseleniumimportwebdriverfromwebdriver_manager.chromeimportChromeDriverManager#配置扩展options=webdriver.ChromeOptions()options.add_extension('path/to/ModHeader.crx')#替换为实际路径#启动浏览器driver=webdriver.Chrome(ChromeDriverManager().install(),options=options)#通过扩展设置请求头(需要打开扩展的配置页面)driver.get("chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/icon.png")#打开扩展页面(id是ModHeader的ID)#注意:上述URL中的id是固定的,但不同版本可能不同,需要检查#通过JavaScript设置请求头(需要知道扩展的存储方式)driver.execute_script("""localStorage.setItem('modheader-headers',JSON.stringify([{name:'Authorization',value:'Bearertoken123'},{name:'User-Agent',value:'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}]));""")#刷新使设置生效driver.refresh()#访问目标网站driver.get("https://example.com")```>**注意**:这种方法较为复杂,因为需要操作扩展的本地存储。而且扩展的ID可能变化,需要根据实际情况调整。---##Windows7下的注意事项1.**浏览器版本**:Windows7最高支持Chrome109(已停止更新),因此需下载旧版ChromeDriver。2.**SSL问题**:添加`--ignore-certificate-errors`选项可忽略SSL错误。3.**驱动路径**:使用`webdriver_manager`可能无法自动下载旧版驱动,需手动下载并指定路径。###手动指定驱动路径示例```python#使用纯Selenium(无Wire)且手动指定驱动路径driver=webdriver.Chrome(executable_path=r'I:\python\myProjects\crawler\chromedriver.exe',#手动指定路径options=options)```---##相关问题1.如何在Windows7下解决Selenium的SSL证书错误?2.如何为SeleniumWebDriver添加多个请求头?3.使用ModHeader扩展时如何确保扩展ID正确?4.如何为Firefox浏览器添加请求头?5.如何在不使用扩展的情况下为Selenium请求添加自定义头?[^1]:引用[1][^2]:引用[2][^3]:引用[3]</think>### Windows 7下Python 3.8 Selenium添加请求头(headers)方法 在Windows 7系统中使用Python 3.8的Selenium添加请求头,主要有以下三种方法: --- #### 方法一:使用`webdriver.ChromeOptions`添加固定请求头(简单) ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service # 配置浏览器选项 options = webdriver.ChromeOptions() options.add_argument("--ignore-certificate-errors") # Windows 7证书兼容 options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64)") # UA头 options.add_argument("--lang=zh-CN") # 语言头 options.add_argument("--headless") # 可选:无头模式 # 添加自定义请求头 options.add_argument("Authorization: Bearer YOUR_TOKEN") options.add_argument("X-Custom-Header: custom_value") # 启动浏览器(需替换为你的chromedriver路径) service = Service(r"I:\python\myProjects\crawler\chromedriver.exe") driver = webdriver.Chrome(service=service, options=options) driver.get("https://example.com") ``` > **优点**:简单直接,适用于固定头信息 > **局限**:只能添加部分简单头信息,无法添加Cookie等复杂头[^1] --- #### 方法二:使用`execute_cdp_cmd`添加动态头(推荐) ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service(r"I:\python\myProjects\crawler\chromedriver.exe") driver = webdriver.Chrome(service=service) # 定义请求头 headers = { "Authorization": "Bearer YOUR_TOKEN", "User-Agent": "Custom-Agent/1.0", "X-Requested-With": "XMLHttpRequest", "Cookie": "session_id=abc123; user=test" } # 通过Chrome DevTools添加头 driver.execute_cdp_cmd("Network.enable", {}) driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers}) driver.get("https://example.com") ``` > **优点**:支持所有标准头字段,可动态修改 > **注意**:需在页面加载前调用[^2] --- #### 方法三:使用Selenium Wire库(功能最全) ```python from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager def interceptor(request): # 添加/修改请求头 request.headers["Authorization"] = "Bearer YOUR_TOKEN" request.headers["Custom-Header"] = "value" # 删除不需要的头 del request.headers["Sec-Fetch-Dest"] # 配置驱动 driver = webdriver.Chrome( executable_path=ChromeDriverManager().install(), seleniumwire_options={"request_interceptor": interceptor} ) driver.get("https://example.com") ``` > **优点**:完整控制请求/响应,支持HTTPS > **安装**:`pip install selenium-wire`[^2] --- ### Windows 7特别注意事项 1. **证书问题处理**: ```python options.add_argument("--ignore-certificate-errors") options.add_argument("--allow-running-insecure-content") ``` 2. **驱动兼容性**: - 使用Chrome v108以下版本 - 下载匹配的[chromedriver 108](https://chromedriver.storage.googleapis.com/index.html?path=108.0.5359.71/) 3. **依赖库安装**: ```bash pip install cryptography==38.0.4 # Windows 7兼容版本 ``` 4. **TLS 1.2强制启用**(解决安全连接问题): ```python options.add_argument("--ssl-protocol=tls1.2") ``` --- ### 验证请求头是否生效 ```python # 打印实际发送的请求头 print(driver.execute_script("return performance.getEntries()[0].requestHeaders;")) # 或使用Selenium Wire查看 for request in driver.requests: if request.url == "https://example.com": print(request.headers) break ``` --- ### 相关问题 1. 如何在Selenium中动态管理Cookie? 2. 如何解决Windows 7下Selenium的SSL/TLS证书错误? 3. 除了请求头,还有哪些方法可以模拟用户身份验证? 4. 如何为不同域名设置不同的请求头? 5. Selenium Wire和普通Selenium有哪些功能区别? [^1]:引用[1] [^2]:引用[2] [^3]:引用[3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值