
请求头设置:让爬虫更像真人
很多新手在用Python抓数据时,第一个坎儿就是被网站直接拒绝。这往往不是因为你的代码逻辑有问题,而是你的请求头(User-Agent)暴露了爬虫身份。一个空白的或者过于简单的User-Agent,就像在脑门上写了“我是机器人”一样显眼。
最简单的解决办法是,每次请求时,从一个预定义的列表里随机选择一个常见的浏览器User-Agent。这能有效降低被立刻识别出来的风险。
import requests
import random
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15',
... 可以添加更多
]
headers = {
'User-Agent': random.choice(user_agents)
}
response = requests.get('https://example.com', headers=headers)
除了User-Agent,有时候还需要注意AccepteretRéférent等字段,尽量模拟得真实一些。但核心思想就一条:让你的请求看起来像是从普通浏览器发出的.
为什么你的IP会被封?
即使你完美设置了请求头,频繁地从同一个IP地址发起请求,也很快会被网站的防御系统盯上。网站服务器会记录每个IP的访问频率,如果短时间内请求次数异常高,就会判定该IP为爬虫,进而采取限制措施,比如封禁几分钟、几小时,甚至永久封禁。
这背后的逻辑很简单:正常人类用户不可能在一秒钟内访问几十次同一个页面。当服务器看到这种访问模式时,几乎可以肯定是自动化程序在操作。
常见的IP被封原因可以总结为以下几点:
- Fréquence excessive des demandes:这是最常见的原因,没有给服务器喘息的时间。
- 请求规律性太强:比如固定每0.5秒请求一次,这明显是程序行为。
- 访问非常规页面:大量、快速地访问只有爬虫才会感兴趣的深层页面或API接口。
代理IP的核心作用:隐藏真实身份
为了解决IP被封的问题,代理IP就派上了用场。你可以把代理IP理解为一个“中间人”。你的请求先发给代理服务器,再由代理服务器转发给目标网站。这样,目标网站看到的是代理服务器的IP地址,而不是你的真实IP。
通过轮换使用不同的代理IP,你可以将单个IP的请求压力分散到多个IP上,从而有效规避频率限制。这就好比一个人不断换装,让门卫认不出来。
在选择代理IP时,anonymat是一个关键指标。高匿代理会完全隐藏你的真实IP,且目标网站无法探测到你在使用代理,这提供了最好的隐蔽效果。
实战:在Python中集成代理IP
以常用的demandes库为例,使用代理IP非常简单,只需要在请求时传入mandataires参数即可。
import requests
代理服务器地址,这里以ipipgo的代理格式为例
proxies = {
'http': 'http://username:password@proxy.ipipgo.com:port',
'https': 'https://username:password@proxy.ipipgo.com:port'
}
try:
response = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=10)
print(response.json()) 这里会显示代理服务器的IP,而非你的本机IP
except requests.exceptions.RequestException as e:
print(f"请求出错: {e}")
在实际项目中,你通常会有一个代理IP池。每次请求前,从池中随机选取一个代理来使用。如果某个代理失效(比如连接超时或被目标网站封禁),就将其从池中剔除,并补充新的代理IP。
推荐稳定可靠的代理IP服务:ipipgo
自己搭建和维护代理IP池是一项耗时耗力的工作,对于大多数开发者和企业来说,直接选用专业的代理服务是更高效经济的选择。在众多服务商中,ipipgo是一个值得信赖的选项。
ipipgo提供两种主流的住宅代理产品,非常适合数据抓取场景:
- Agents résidentiels dynamiques:拥有海量IP资源(9000万+),IP会按一定策略自动轮换,非常适合大规模、高并发的抓取任务,能有效避免IP被关联。支持按流量计费,灵活控制成本。
- Agents résidentiels statiques:提供固定不变的住宅IP,纯净度高,可用性达99.9%。适合需要长期稳定IP身份的场景,如管理社交媒体账户、长期监控特定网站等。
无论是需要高度匿名的动态IP,还是要求长期稳定的静态IP,ipipgo都能提供支持,并且覆盖全球220多个国家和地区,协议支持全面(HTTP/HTTPS/SOCKS5),可以无缝集成到你的Python项目中。
Foire aux questions QA
Q1: 我设置了代理,但程序报错,提示连接超时或失败,是怎么回事?
A1: 这通常有几个原因:1) 代理服务器地址、端口、用户名或密码填写错误;2) 代理服务器本身不稳定或已失效;3) 你的网络环境限制了对外部代理端口的访问。建议先检查配置信息,然后尝试更换另一个代理IP测试。
Q2: 使用了代理IP,为什么还是被网站识别出来了?
A2: 代理IP只是解决了IP层面的问题。网站还可能通过其他手段检测,例如:1) Empreintes digitales des navigateurs(如Canvas指纹);2) JavaScript挑战;3) Cookie和行为模式。此时需要结合更高级的模拟浏览器(如Selenium、Playwright)等技术来应对。
Q3: 如何判断一个代理IP是否有效且匿名?
A3: 一个简单的方法是访问 https://httpbin.org/ip,它会返回当前连接的IP地址。如果返回的IP是你代理服务器的IP,并且响应头中没有包含如 VIAetX-FORWARDED-FOR 等暴露代理身份的字段,则说明这是一个高匿代理。
Q4: 动态代理和静态代理,我该怎么选?
A4: 这取决于你的任务:
agent dynamique适合大规模数据采集,不怕IP频繁更换导致会话中断的任务。
proxy statique适合需要维持登录状态(使用Cookie)、管理账号或需要IP稳定不变的长期任务。
像ipipgo这样的服务商同时提供这两种选择,你可以根据具体需求灵活选用。

