Python爬虫使用requests代理为何依然被封堵?
我通过爬取西刺代理获取代理 list ,如下面代码
def setProxiesConfig():
url = 'http://www.xicidaili.com/nn/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}
web_data = requests.get(url, headers=headers)
soup = BeautifulSoup(web_data.text, 'lxml')
ips = soup.find_all('tr')
ip_list = []
for i in range(1, len(ips)):
ip_info = ips[i]
tds = ip_info.find_all('td')
ip_list.append(tds[1].text + ':' + tds[2].text)
print(ip_list)
return ip_list
#获取随机 IP
def get_random_ip(ip_list):
proxy_list = []
for ip in ip_list:
proxy_list.append('http://' + ip)
proxy_ip = random.choice(proxy_list)
proxies = {'http': proxy_ip}
return proxies
获取列表后,随机取一个 IP{'http':'http://ip:9999'} 然后放到 get 中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}
ipC=get_random_ip(ip_list)
web_data = requests.get(URL, headers=headers,proxie= ,verify=False,timeout=10)
soup = BeautifulSoup(web_data.text, 'lxml')
爬取了 46 个页面的时候还可以操作,但是之后就开始提示 timeout 了,就无论如何也不能爬取了,这是为啥?
Python爬虫使用requests代理为何依然被封堵?
11 回复
开一个页面休息 5 秒试试
我遇到过同样的问题。requests库本身只是发送HTTP请求的工具,被封堵通常是因为代理质量或请求特征被识别了。
首先检查代理是否有效:
import requests
proxies = {
'http': 'http://your-proxy:port',
'https': 'https://your-proxy:port'
}
# 测试代理连通性
try:
response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
print(f"代理IP: {response.json()['origin']}")
except Exception as e:
print(f"代理不可用: {e}")
如果代理本身没问题,被封的原因可能是:
- 请求头不完整 - 很多网站会检查User-Agent等头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive'
}
- 请求频率太高 - 即使用了代理,太快的请求也会触发风控
import time
import random
# 添加随机延迟
time.sleep(random.uniform(1, 3))
-
代理IP质量差 - 免费的代理IP很多都被网站标记了,需要换高质量代理
-
Cookie和会话管理 - 有些网站需要维持会话状态
session = requests.Session()
session.proxies.update(proxies)
session.headers.update(headers)
建议先用免费代理测试,稳定后再考虑付费代理服务。
随机 sleep,sleep 时间大于 10 秒
time.sleep(randomint(3, 5))
你确定你这个代码能跑通?最下面 proxie=的位置后面都没东西了
而且那个参数名叫 proxies,不是 proxie。如果你的代码没问题的话,代理本身超时也是有可能的,注意看报错信息。
这种免费代理就是垃圾,基本上不可以用的,最好是买代理。。
用收费代理吧
建议上 芝麻代理之类的, 靠谱点
用之前线上 ip138 之类的检测下是否更换成功啊,免费的 ip 真的都挺垃圾
代理池要不断测试更新

