Python爬虫使用同一套代码,通过privoxy代理返回404,但使用squid代理却返回200,这是为什么?
抓取使用代理 prioxy
返回 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.
我后面发现这个页面会重定向
重定向的页面是
我用 privoxy 访问重定向页面返回时 200 直接使用浏览器访问 2 个页面都是正常 用 squid 一切正常 返回 200 我已近被折磨几天了
因为我要用 socks5 做上级代理才用 privoxy
Python爬虫使用同一套代码,通过privoxy代理返回404,但使用squid代理却返回200,这是为什么?
这个问题挺有意思的。简单说,这通常是因为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部分里Host、User-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-forwarding、edit-headers这类章节,看看它默认修改了哪些头,或者直接关掉头部修改功能。
总结:问题出在代理对HTTP头的处理策略不同,用对比请求头的方法定位,用显式设置请求头的方法解决。

