Python中pyspider模拟请求无法抓包问题如何解决?[求助帖]

请问 pyspider 模拟的 run 请求为什么没办法通过抓包得到呢? 我看代码中貌似是使用了 webdav 协议的一个类? 然后就是正常使用 tornado 的请求了, 不太清楚具体原理。求大佬告知
Python中pyspider模拟请求无法抓包问题如何解决?[求助帖]

1 回复

这个问题通常是请求头或SSL验证导致的。直接上代码,用requests库的Session对象配合正确headers就能解决:

import requests
from requests.adapters import HTTPAdapter
from urllib3.poolmanager import PoolManager
import ssl

class SSLAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        ctx = ssl.create_default_context()
        ctx.set_ciphers('DEFAULT@SECLEVEL=1')  # 降低SSL安全级别
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        kwargs['ssl_context'] = ctx
        return super().init_poolmanager(*args, **kwargs)

# 创建会话并设置适配器
session = requests.Session()
session.mount('https://', SSLAdapter())

# 设置完整的请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

try:
    response = session.get(
        'https://目标网站.com',
        headers=headers,
        timeout=10,
        allow_redirects=True
    )
    print(f"状态码: {response.status_code}")
    print(f"响应内容前500字符: {response.text[:500]}")
    
except requests.exceptions.SSLError as e:
    print(f"SSL错误: {e}")
except requests.exceptions.RequestException as e:
    print(f"请求异常: {e}")

关键点:

  1. 自定义SSLAdapter绕过证书验证
  2. 使用完整的浏览器请求头
  3. Session对象保持连接状态

如果还不行,可能是网站用了JavaScript渲染,得考虑用Selenium或Playwright。

一句话建议:检查请求头和SSL证书设置。

回到顶部