为什么在Scrapy中代理会失败,而在python-requests库下却能成功请求

Why would proxies fail in Scrapy, but make succesful requests under the python-requests library

我有一个包含 100 个代理的列表,为了测试它们,我向 google 发出请求并检查响应。 当 运行 这些请求通过 python-requests 时,每个请求 returns 都成功,但是当在 Scrapy 下尝试同样的事情时,99% 的时间代理失败。我是不是遗漏了什么或者在 Scrapy 中使用了错误的代理?

代理以

格式存储在文件中
http://123.123.123.123:8080
https://234.234.234.234:8080
http://321.321.321.321:8080
...

这是我用来通过 python-requests

测试它们的脚本
import requests

proxyPool = []
with open("proxy_pool.txt", "r") as f:
    proxyPool = f.readlines()

proxyPool = [x.strip() for x in proxyPool]

for proxyItem in proxyPool:
    # Strip the http/s from the ip
    proxy = proxyItem.rsplit("/")[-1].split(":")
    proxy = "{proxy}:{port}".format(proxy=proxy[0], port=proxy[1])
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", }

    proxySession = requests.Session()
    proxySession.proxies = {"http://": proxy, "https://": proxy}
    proxySession.headers.update(headers)
    resp = proxySession.get("https://www.google.com/")

    if resp.status_code == 200:
        print(f"Requests with proxies: {proxySession.proxies} - Successful")
    else:
        print(f"Requests with proxies: {proxySession.proxies} - Unsuccessful")
    time.sleep(3)

和 Scrapy 的蜘蛛

class ProxySpider(scrapy.Spider):
    name = "proxyspider"

    start_urls = ["https://www.google.com/"]

    def start_requests(self):
        with open("proxy_pool.txt", "r") as f:
            for proxy in f.readlines():
                proxy = proxy.strip()
                headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", }

                yield Request(url=self.start_urls[0], callback=self.parse, headers=headers, meta={"proxy": proxy}, dont_filter=True)

    def parse(self, response):
        self.logger.info(f'Parsing: {response.url}')
        if response.status == 200:
            print(f"Requests with proxies: {response.meta['proxy']} - Successful")
        else:
            print(f"Requests with proxies: {response.meta['proxy']} - Unsuccessful")

在使用 requests 构建的代码示例中 - 您实现了多个 session(1 session - 1 个代理)。

然而,在 scrapy 默认设置下 - 应用程序将对所有代理使用单个 cookiejar
它将为每个代理发送相同的 cookie 数据。
您需要在请求中使用 cookiejar meta key

如果网络服务器收到来自多个 IP 的请求,并在 cookie 标头中传输了单个 sessionId - 它看起来很可疑,网络服务器能够将其识别为机器人并禁止所有使用的 IP。 - 可能确实发生了这件事。