使用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()
使用`SeleniumWire`模块可以捕获浏览器请求响应,进而获取页面返回的XHR和响应体等信息。下面是一个简单示例: ```python from seleniumwire import webdriver # 创建一个Selenium WebDriver实例 driver = webdriver.Chrome() # 启动一个新的SeleniumWire请求拦截器 driver.request_interceptor = lambda request: request # 打开登录页面 driver.get("https://example.com/login") # 找到登录表单的用户名和密码输入框,并填入相关信息 username_input = driver.find_element_by_id("username") password_input = driver.find_element_by_id("password") username_input.send_keys("your_username") password_input.send_keys("your_password") # 提交表单 login_button = driver.find_element_by_id("login_button") login_button.click() # 获取XHR和响应体等信息 for request in driver.requests: if request.response: # 获取XHR的URL和响应体 if "/xhr_endpoint" in request.url: print("XHR URL:", request.url) print("XHR Response:", request.response.body) else: # 获取其他请求的URL和响应体 if "https://example.com" in request.url: print("Request URL:", request.url) print("Request Response:", request.response.body) # 关闭浏览器 driver.quit() ``` 在上面的示例,我们使用了`SeleniumWire`模块创建了一个`webdriver.Chrome()`实例,并设置了请求拦截器。然后,我们通过`driver.get()`方法打开登录页面,并找到用户名和密码的输入框,并填入相关信息。接下来,点击登录按钮提交表单。 在循环遍历所有的请求,我们可以通过`request.url`获取请求的URL,通过`request.response.body`获取响应体。如果请求是XHR,我们可以判断URL是否包含XHR的关键字,然后获取对应的URL和响应体。 请注意,上述示例的网站URL和元素选择器需要根据实际情况进行替换。另外,使用`Selenium`模拟登录时需要注意一些网站可能会使用验证码或其他验证机制,需要进行额外的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值