Python爬虫使用同一套代码,通过privoxy代理返回404,但使用squid代理却返回200,这是为什么?

抓取使用代理 prioxy

抓取 http://wzt.5858.com/t/u45954445875985/p1001?adtype=1&adact=5&psid=161184908198727136044633930&entinfo=30212838807500_q

返回 404

返回的错误是 No such domain Your request for http://t5845955432021771.5858.com?adtype=1&adact=5&psid=161184908198727136044633930&entinfo=30212838807500_q/ could not be fulfilled, because the domain name t5845955432021771.5858.com?adtype=1&adact=5&psid=161184908198727136044633930&entinfo=30212838807500_q could not be resolved.

我后面发现这个页面会重定向

重定向的页面是

http://t5845955432021771.5858.com?adtype=1&adact=5&psid=161184908198727136044633930&entinfo=30212838807500_q

我用 privoxy 访问重定向页面返回时 200 直接使用浏览器访问 2 个页面都是正常 用 squid 一切正常 返回 200 我已近被折磨几天了

因为我要用 socks5 做上级代理才用 privoxy


Python爬虫使用同一套代码,通过privoxy代理返回404,但使用squid代理却返回200,这是为什么?

1 回复

这个问题挺有意思的。简单说,这通常是因为Privoxy和Squid在HTTP请求头的处理上存在差异,尤其是Host头和一些隐私相关的头部。

核心原因在于,Privoxy默认是一个“增强隐私”的代理,它会主动修改或删除一些它认为可能泄露用户信息的HTTP请求头。而Squid作为一个缓存/转发代理,默认行为是相对“透明”地转发请求。

最可能“撞上”的就是Host头。有些网站的反爬机制或配置,如果检测到Host头异常(比如被Privoxy修改了),就可能返回404。另一个常见嫌疑是User-Agent头,Privoxy也可能对它动手脚。

给你写段代码验证一下,分别通过两个代理发送完全相同的请求,然后对比发出的实际请求头,一看就明白了:

import requests

# 配置你的代理地址
PROXIES = {
    'privoxy': {'http': 'http://127.0.0.1:8118', 'https': 'http://127.0.0.1:8118'},
    'squid': {'http': 'http://127.0.0.1:3128', 'https': 'http://127.0.0.1:3128'}
}

# 一个能显示请求头的测试网站
url = 'http://httpbin.org/headers'

for proxy_name, proxy in PROXIES.items():
    try:
        print(f"\n=== 通过 {proxy_name.upper()} 代理发送请求 ===")
        resp = requests.get(url, proxies=proxy, timeout=10)
        print(f"状态码: {resp.status_code}")
        print("服务器看到的请求头:")
        print(resp.text)
    except Exception as e:
        print(f"请求失败: {e}")

跑一下这个,重点看headers部分里HostUser-Agent这些字段在两个代理下的区别。如果发现不同,问题就找到了。

解决办法是强制指定请求头,覆盖Privoxy的修改:

headers = {
    'Host': '你要访问的目标域名',
    'User-Agent': '明确的浏览器标识',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
}

resp = requests.get(url, headers=headers, proxies=PROXIES['privoxy'])

如果还不行,可以查Privoxy的配置文件(默认在/etc/privoxy/config或安装目录下),找disable-forwardingedit-headers这类章节,看看它默认修改了哪些头,或者直接关掉头部修改功能。

总结:问题出在代理对HTTP头的处理策略不同,用对比请求头的方法定位,用显式设置请求头的方法解决。

回到顶部