使用python seleniumwire拦截响应接口中的请求头

最近开发一个爬虫小工具,遇到一个问题,网站页面js请求服务端接口是加了自己生成的请求签名,一开始我尝试了各种算法来尝试生成这个签名,但没有成功,然后又分析前端js代码来尝试获取签名算法,但现在前端框架生成的js代码一坨一坨的还有混淆,实在是很难看懂,索性就放弃了。然后尝试浏览器插件Interceptor和postman interceptor确实是可以获取到js发起的请求的响应的全部内容,但毕竟是爬虫,用浏览器插件实在不方便,但interceptor给我提供了思路,然后搜索了一下,seleniumwire这个库确实可以实现interceptor。

直接上代码,关键部分都脱敏了,自己模仿修改适配自己要爬取的网站即可,平时用java比较多不怎么写python,python代码写的不好看不优雅望见谅。

seleniumwire使用了自己的ca.crt证书,浏览器默认是不信任的,可以自己导入到操作系统或浏览器来解决https的小红叉问题。参考:seleniumwrie导入ca.crt

pip3 install selenium-wire
pip3 install pymysql

from seleniumwire import webdriver
import time
import pymysql

#把爬取到的sign写入数据库
def update(data):
    db = pymysql.connect(host="localhost",
                         user="root",
                         password="cheduzi",
                         database="spider",
                         init_command="SET SESSION time_zone='+08:00'"
                         )
    db_curs = db.cursor()
    update_sql = """update config set sign = '{sign}',update_time = now() where platform = 'xxx';""".replace("{sign}", data)
    try:
        print("sql:", update_sql)
        db_curs.execute(update_sql)
        db.commit()
        print("update ok")
    except:
        db.rollback()
        print("update error")
    db.close()


# 请求拦截器
def interceptor_request(request):
    print(
        request.url,
        request.response.headers
    )


# 响应拦截器
def interceptor_response(request, response):
    if request.url.startswith("https://xxx.com/api"):
        # print(request.url, request.headers['sign'], request.body.decode('utf-8'))
        # print(request.url, request.headers['sign'], response.body.decode('utf-8'))
        sign = request.headers['sign']
        print(request.url, sign)
        if len(sign) != 0:
            update(sign)
            driver.quit()


if __name__ == '__main__':
    #option参数来控制不打开浏览器界面,如果在调试阶段可去掉option参数
    option = webdriver.ChromeOptions()
    option.add_argument('headless')
    option.add_argument('no-sandbox')
    option.add_argument('disable-dev-shm-usage')
    driver = webdriver.Chrome(chrome_options=option)
    driver.response_interceptor = interceptor_response
    driver.get('https://xxx.xxx.com/xxx/detail')
    time.sleep(5)
    driver.quit()
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Python 代码拦截 Charles 返回的请求,你可以使用 Charles 提供的远程控制 API 来实现。下面是一个示例: 1. 在 Charles 启用远程控制 API:在 Charles 菜单选择 `Help -> Remote Control Settings`,勾选 `Enable Remote Control` 并设置密码。 2. 安装 `requests` 库:在命令行运行 `pip install requests` 安装 `requests` 库,用于发送 HTTP 请求。 3. 编写拦截脚本:创建一个 Python 脚本,例如 `intercept.py`,并添加以下内容: ```python import requests # Charles 远程控制 API 的地址和端口号 api_url = 'http://localhost:8888' # Charles 远程控制 API 的密码 api_password = 'your_password' # 发送命令到 Charles 远程控制 API def send_command(command): response = requests.get(api_url, params={'password': api_password, 'command': command}) return response.json() # 拦截 Charles 返回的请求 def intercept_requests(): # 启动监听模式 send_command('recording_start') # 处理返回的请求 while True: # 获取最新的请求 response = send_command('recording_last') # 解析请求信息 if 'method' in response: method = response['method'] url = response['URL'] headers = response['requestHeaders'] body = response['requestBody'] # 在这里处理请求信息,可以解析、修改或保存到本地等操作 # 例如打印请求信息 print(f'{method} {url}') print('Headers:', headers) print('Body:', body) # 继续监听新的请求 send_command('recording_continue') # 执行拦截请求 intercept_requests() ``` 在上述示例,我们使用了 `requests` 库来发送 HTTP 请求到 Charles 远程控制 API,并通过解析返回的 JSON 数据来获取请求信息。你可以根据实际需求在 `intercept_requests()` 函数处理请求信息,例如解析、修改或保存到本地等操作。 4. 运行脚本:在命令行运行 `python intercept.py` 来运行拦截脚本。 当 Charles 接收到请求拦截脚本会获取并处理请求信息。你可以根据需要,在处理请求的部分进行相应的操作。 请注意,在使用 Charles 的远程控制 API ,确保你已经启用了远程控制,并设置了密码。另外,这种方式仅适用于拦截 Charles 返回的请求,无法拦截其他应用程序的请求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值