如何根据 Python 请求轮换代理
How to rotate proxies on a 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
....
获取代理
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'}
我希望不要被屏蔽。
使用此类网站的免费代理的问题是
网站知道这些,可能会因为您正在使用其中之一而阻止
你不知道别人不是因为跟他们干坏事而把他们拉进黑名单的
该站点可能使用某种形式的其他标识符根据其他特征跨代理跟踪您(设备指纹识别、代理穿孔等)
不幸的是,除了更复杂 (跨多个设备分发,使用 VPN/TOR 等) 并冒着 IP 被阻止的风险,您无能为力用于尝试类似 DDOS 的流量,或者最好查看该站点是否具有 API 访问权限
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)
我最近遇到了同样的问题,但按照其他答案中的建议使用在线代理服务器总是有风险(从隐私的角度来看)、缓慢或不可靠。
相反,您可以使用 requests-ip-rotator python 库通过 AWS API 网关代理流量,它每次都会给您一个新的 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()
结合 multithreading/multiprocessing,您将能够立即抓取网站。
AWS 免费套餐为您提供每个区域 100 万个请求,因此此选项对于所有合理的抓取都是免费的。
我正在尝试进行一些抓取,但每 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'} 我希望不要被屏蔽。
使用此类网站的免费代理的问题是
网站知道这些,可能会因为您正在使用其中之一而阻止
你不知道别人不是因为跟他们干坏事而把他们拉进黑名单的
该站点可能使用某种形式的其他标识符根据其他特征跨代理跟踪您(设备指纹识别、代理穿孔等)
不幸的是,除了更复杂 (跨多个设备分发,使用 VPN/TOR 等) 并冒着 IP 被阻止的风险,您无能为力用于尝试类似 DDOS 的流量,或者最好查看该站点是否具有 API 访问权限
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)
我最近遇到了同样的问题,但按照其他答案中的建议使用在线代理服务器总是有风险(从隐私的角度来看)、缓慢或不可靠。
相反,您可以使用 requests-ip-rotator python 库通过 AWS API 网关代理流量,它每次都会给您一个新的 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()
结合 multithreading/multiprocessing,您将能够立即抓取网站。
AWS 免费套餐为您提供每个区域 100 万个请求,因此此选项对于所有合理的抓取都是免费的。