如何在 Python 请求上轮换代理

Jav*_*ara 6 python proxy http-proxy web-scraping python-requests

我正在尝试进行一些抓取,但每 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
....
Run Code Online (Sandbox Code Playgroud)

获取代理

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
Run Code Online (Sandbox Code Playgroud)

调用函数

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

....
code to manage the data  
....
Run Code Online (Sandbox Code Playgroud)

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

小智 32

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

相反,您可以使用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() 
Run Code Online (Sandbox Code Playgroud)

与多线程/多处理相结合,您将能够立即抓取网站。

AWS 免费套餐为您提供每个区域 100 万个请求,因此此选项对于所有合理的抓取都是免费的。

  • 谢谢!另外,我想补充一点,您需要从AWS获取API密钥并以这种方式添加它们: `gateway = ApiGateway(site="site.com", access_key_id = AWS_ACCESS_KEY_ID, access_key_secret = AWS_SECRET_ACCESS_KEY)` 您可以按照[本指南](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-appendix-sign-up.html)。如何取回您的钥匙。 (9认同)
  • 很棒的工具,感谢您将其组合在一起! (4认同)

小智 7

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)
Run Code Online (Sandbox Code Playgroud)

  • 这里“#Prime the Pump”的目的是什么? (2认同)

G. *_*son 5

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

  1. 网站知道这些并且可能会因为您正在使用其中之一而被阻止

  2. 你不知道其他人并没有因为对他们做坏事而将他们列入黑名单

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

不幸的是,除了更复杂(跨多个设备分布、使用 VPN/TOR 等)并冒着 IP 因尝试类似 DDOS 的流量而被阻止的风险,或者最好查看该站点是否有 API之外,您无能为力。访问