Python中Scrapy代理配置问题:为什么代理设置表现异常?
取消代理没问题 能慢慢爬
用上代理后全部超时 超时设 15s
单独把所有代理 ip 测试一遍,没问题(超时设 5s )
有问题的之前找到直接全删了
我怀疑我的检测有问题
就乱编了一个代理 ip
结果
所以到现在我还不明白哪里出了问题
Python中Scrapy代理配置问题:为什么代理设置表现异常?
https 的请求应该不会经过 http 代理的吧
在Scrapy里配代理出问题,最常见的原因是配置方式不对或者代理本身不可用。Scrapy的代理通常通过 Request.meta['proxy'] 或下载器中间件来设置。
如果你直接在 Request 里设置代理但没生效,大概率是中间件优先级冲突。Scrapy内置的 HttpProxyMiddleware 默认就负责处理代理,它的顺序是750。如果你自己写了中间件,顺序得比它高(数字更小)才能覆盖默认设置。
看看这个最基础的配置示例,直接在spider里设置:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://httpbin.org/ip']
def start_requests(self):
for url in self.start_urls:
# 在meta中直接指定代理
yield scrapy.Request(
url,
meta={'proxy': 'http://your-proxy-ip:port'},
callback=self.parse
)
def parse(self, response):
self.logger.info(f'Response IP: {response.text}')
更常见的做法是用自定义下载器中间件,这样能全局应用或者动态切换代理:
# 在middlewares.py中
class ProxyMiddleware:
def process_request(self, request, spider):
# 你的代理逻辑,比如从列表轮询
proxy = 'http://your-proxy-ip:port'
request.meta['proxy'] = proxy
# 在settings.py中激活并设置优先级(数字小于750)
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.ProxyMiddleware': 100,
}
检查几点:1) 代理地址格式必须是 http://IP:PORT;2) 如果需要认证,格式是 http://user:pass@IP:PORT;3) 确保代理服务器本身能连通且支持HTTP/HTTPS。用 curl -x http://proxy:port http://httpbin.org/ip 先测下代理是否工作。
代理不工作就换一个试试。
看到你们也在用 帮我看看呗 谢谢啦
你拿 http 的代理,怎么代理 https 的流量。
#3
#1
所以要用 https 的么
好像是的,http://docs.python-requests.org/en/master/user/advanced/#proxies。要写 https:http://给 proxies
#5 是不是代理设置无效 会用本地的代替? 我随便设的代理 都可以收到响应
说了你随便写的那个代理根本没生效,因为你设置了 http 请求的代理, 发了一个 https 的请求出去。你把 proxies 那个字段的 https 的 key 也配置成 http 的 key 就知道了
#7 恩 我配了 好多失败的 我再试试
proxies = { “http”: “http://x.x.x.x:xx”, “https”: “http://x.x.x.x:xx”, }
就行了
#9 scrapy 那个 proxy 不能是 dict 的 会报错 我试过
你不是在 requests 中用了 proxy 吗?如果是 scrapy 的话不存在 http,https 代理的问题的
#11 你看第一个张图 这里的是 http 然后全部超时
另外明确一下: http 的代理服务器是可以代理 https 的流量的,https 走 http 代理通过的是隧道,对流量本身没有任何影响。
requests 的 proxies = { “http”: “http://x.x.x.x:xx”, “https”: “http://x.x.x.x:xx”, }只是用来说明 http,https 分别走哪个代理服务器,但他们走的都可以是同一个 http 代理。
#12 谢谢你的解惑
get_invalid_proxies 和 test_proxies 两个 def 里面你定义了 requests 的 http 流量走 proxy,就像这样子:{ “http”: “http://x.x.x.x:xx”},但是接下来却去 get 了一个 https 的网站,这个 https 的网站根本没走任何代理…
估计还是你的代理有问题,你还是按照这个格式: proxies = { “http”: “http://x.x.x.x:xx”, “https”: “http://x.x.x.x:xx”, } 来用 requests 测试你的代理吧。
已经改了 跑了两个小时了 还没跑完 绝大部分都是无效的
#15 已经改了 跑了两个小时了 还没跑完 绝大部分都是无效的


