如何根据 Python 请求轮换代理

新手上路,请多包涵

我正在尝试进行一些抓取,但每 4 个请求就会被阻止。我试图更改代理,但错误是一样的。我应该怎么做才能正确更改它?

这是我尝试的一些代码。首先,我从免费网络获得代理。然后我去用新代理做请求,但它不起作用,因为我被阻止了。

 from fake_useragent import UserAgent
import requests

def get_player(id,proxy):
    ua=UserAgent()
    headers = {'User-Agent':ua.random}

    url='https://www.transfermarkt.es/jadon-sancho/profil/spieler/'+str(id)

    try:
        print(proxy)
        r=requests.get(u,headers=headers,proxies=proxy)
    execpt:

....
code to manage the data
....

获取代理

def get_proxies():
    ua=UserAgent()
    headers = {'User-Agent':ua.random}
    url='https://free-proxy-list.net/'

    r=requests.get(url,headers=headers)
    page = BeautifulSoup(r.text, 'html.parser')

    proxies=[]

    for proxy in page.find_all('tr'):
        i=ip=port=0

    for data in proxy.find_all('td'):
        if i==0:
            ip=data.get_text()
        if i==1:
            port=data.get_text()
        i+=1

    if ip!=0 and port!=0:
        proxies+=[{'http':'http://'+ip+':'+port}]

return proxies

调用函数

proxies=get_proxies()
for i in range(1,100):
    player=get_player(i,proxies[i//4])

....
code to manage the data
....

我知道代理抓取很好,因为当我打印时,我会看到类似这样的内容:{‘http’: ‘ http://88.12.48.61:42365 ‘} 我希望不要被阻止。

原文由 Javier Jiménez de la Jara 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 777
2 个回答

我最近遇到了同样的问题,但按照其他答案中的建议在线使用代理服务器总是有风险(从隐私的角度来看)、缓慢或不可靠。

相反,您可以使用 requests-ip-rotator python 库通过 AWS API Gateway 代理流量,它每次都会为您提供一个新的 IP:

pip install requests-ip-rotator

这可以按如下方式使用(专门针对您的站点):

 import requests
from requests_ip_rotator import ApiGateway, EXTRA_REGIONS

gateway = ApiGateway("https://www.transfermarkt.es")
gateway.start()

session = requests.Session()
session.mount("https://www.transfermarkt.es", gateway)

response = session.get("https://www.transfermarkt.es/jadon-sancho/profil/spieler/your_id")
print(response.status_code)

# Only run this line if you are no longer going to run the script, as it takes longer to boot up again next time.
gateway.shutdown()

结合多线程/多处理,您将能够立即抓取该站点。

AWS 免费层为每个区域提供 100 万个请求,因此此选项将免费用于所有合理的抓取。

原文由 George 发布,翻译遵循 CC BY-SA 4.0 许可协议

import requests
from itertools import cycle

list_proxy = ['socks5://Username:Password@IP1:20000',
              'socks5://Username:Password@IP2:20000',
              'socks5://Username:Password@IP3:20000',
               'socks5://Username:Password@IP4:20000',
              ]

proxy_cycle = cycle(list_proxy)
# Prime the pump
proxy = next(proxy_cycle)

for i in range(1, 10):
    proxy = next(proxy_cycle)
    print(proxy)
    proxies = {
      "http": proxy,
      "https":proxy
    }
    r = requests.get(url='https://ident.me/', proxies=proxies)
    print(r.text)

原文由 John Wick 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题