gpt4 book ai didi

python - 将 Scrapy 代理中间件设置为根据每个请求轮换

转载 作者:太空狗 更新时间:2023-10-29 18:31:33 25 4
gpt4 key购买 nike

这个问题必然有两种形式,因为我不知道更好的解决方案。

我正在爬行的网站经常将我踢到重定向的“用户被阻止”页面,但频率(按请求/时间)似乎是随机的,而且它们似乎有一个黑名单阻止了我的许多“开放”代理列表通过 Proxymesh 使用。所以……

  1. 当 Scrapy 收到对其请求的“重定向”时(例如 DEBUG:从 (GET http://. ../page-544.htm)), 它是继续尝试访问 page-544.htm,还是继续访问 page-545.htm 并永远丢失 page-544.htm ?如果它“忘记”(或将其计为已访问),是否有办法告诉它继续重试该页面? (如果它自然而然地这样做,那么是的,很高兴知道...)

  2. 什么是最有效的解决方案?

(a) 我目前正在做的事情:通过 http_proxy 环境变量使用 proxymesh 轮换代理,它似乎经常轮换代理以至少相当定期地通过目标站点的重定向。 (缺点:开放代理的 ping 速度很慢,只有这么多,proxymesh 最终会开始向我收取超过 10 场演出的费用,我只需要它们在重定向时轮换,我不需要不知道他们轮换的频率或触发器,以及上面的内容:我不知道我被重定向的页面是否正在被 Scrapy 重新排队......)(如果 Proxymesh 在每个请求上轮换,那么我愿意支付合理的费用。)

(b) 使用中间件在每次重定向时重新选择新代理有意义(并且简单)吗?对每一个请求呢?通过 TOR 或 Proxifier 等其他东西会更有意义吗?如果这相对简单,我将如何设置?我在几个地方读过类似的内容,但大多数都已过时,链接断开或已弃用 Scrapy 命令。

作为引用,我目前确实为 Proxy Mesh 设置了中间件(是的,我使用的是 http_proxy 环境变量,但为了不惹麻烦,我喜欢冗余)。所以这就是我目前所拥有的,以防万一:

 class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = "http://open.proxymesh.com:[port number]"

proxy_user_pass = "username:password"
encoded_user_pass = base64.encodestring(proxy_user_pass)
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

最佳答案

昨天我在代理和 DDoS 防护方面有类似的任务。 (我已经解析了一个网站)这个想法在 random.choice 中。每个请求都有机会更改 IP。Scrapy 使用 Tor 和 telnetlib3。您需要配置 ControlPort 密码。

from scrapy import log
from settings import USER_AGENT_LIST

import random
import telnetlib
import time


# 15% ip change
class RetryChangeProxyMiddleware(object):
def process_request(self, request, spider):
if random.choice(xrange(1,100)) <= 15:
log.msg('Changing proxy')
tn = telnetlib.Telnet('127.0.0.1', 9051)
tn.read_until("Escape character is '^]'.", 2)
tn.write('AUTHENTICATE "<PASSWORD HERE>"\r\n')
tn.read_until("250 OK", 2)
tn.write("signal NEWNYM\r\n")
tn.read_until("250 OK", 2)
tn.write("quit\r\n")
tn.close()
log.msg('>>>> Proxy changed. Sleep Time')
time.sleep(10)



# 30% useragent change
class RandomUserAgentMiddleware(object):
def process_request(self, request, spider):
if random.choice(xrange(1,100)) <= 30:
log.msg('Changing UserAgent')
ua = random.choice(USER_AGENT_LIST)
if ua:
request.headers.setdefault('User-Agent', ua)
log.msg('>>>> UserAgent changed')

关于python - 将 Scrapy 代理中间件设置为根据每个请求轮换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com