如何在 Python 请求上轮换代理

Posted

技术标签:

【中文标题】如何在 Python 请求上轮换代理【英文标题】:How to rotate proxies on a Python requests 【发布时间】:2019-09-16 05:40:44 【问题描述】:

我正在尝试进行一些抓取,但每 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' 我不想被阻止。

【问题讨论】:

我过去遇到过这个问题。您知道这些代理是 HTTP 还是 HTTPS 代理,以及服务器是否只接受特定类型的代理?对我来说,我遇到了同样的问题,直到我了解到服务器只接受 HTTP 代理,但我给它提供了 HTTPS 代理。现在我的脚本只运行 24/7 有可能。我刚刚尝试过使用 HTTPS,但更糟糕的是因为我无法访问。使用 HTTP,我最多收到 6 个请求,但没有 HTTPS。 快速提问:你想抓取什么被屏蔽了? 是'tranfermarkt',一个足球网站。最后我尝试使用 HTTPS 代理,但来自 'hidemyna.me/es/proxy-list/?type=s#list' 并且它有效。你知道另一个免费的页面来获取列表吗? 我使用 proxybroker(一个 github 包)来获取代理并且工作得很好 【参考方案1】:

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

相反,您可以使用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 万个请求,因此此选项对于所有合理的抓取都是免费的。

【讨论】:

很棒的工具,感谢您将它放在一起! 谢谢!另外,我想补充一点,您需要从 AWS 获取 API 密钥并以这种方式添加它们:gateway = ApiGateway(site="site.com", access_key_id = AWS_ACCESS_KEY_ID, access_key_secret = AWS_SECRET_ACCESS_KEY) 您可以关注this guide。如何取回您的密钥。 确实 - 或者如果密钥存储在环境变量中,那么它们也将被自动使用,详见this aws guide :)【参考方案2】:
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)

【讨论】:

这里“# Prime the pump”的目的是什么?【参考方案3】:

从这样的网站使用免费代理的问题是

    网站知道这些,可能会因为您使用其中之一而被阻止

    你不知道其他人没有因为与他们一起做坏事而将他们列入黑名单

    该网站可能会使用某种形式的其他标识符来根据其他特征(设备指纹识别、代理穿透等)跨代理跟踪您

不幸的是,除了更复杂(分布在多个设备上,使用 ***/TOR 等),您无能为力,并且您的 IP 可能会因尝试类似 DDOS 的流量而被阻止或,最好是看看网站有没有访问的API

【讨论】:

以上是关于如何在 Python 请求上轮换代理的主要内容,如果未能解决你的问题,请参考以下文章

在带有 selenium 的 python 中,如何轮换 IP 地址?

如何使用 R 和 rvest 轮换代理和 IP 地址

如何在python中编写代理池服务器(请求来时,选择代理获取url内容)?

如何在 Azure 中的密钥轮换后为存储 Blob 的客户端请求提供服务

如何使用 luminati.io 等代理服务器正确地向 https 发出请求?

如何在python的请求中禁用代理socks5?