
一、爬虫为啥总被逮?试试代理IP+类选择器组合拳
搞数据抓取的兄弟都懂,网页改个class名分分钟让你脚本报废。最近发现个野路子——把代理IP和XPath类选择器绑着用,就像给爬虫装了个智能变装系统。举个栗子,用//div[contains(@class,'list-item')]这种模糊匹配,就算网站把class名从”item-1″改成”item_new”,咱照样能逮着数据。
import requests
from lxml import html
proxies = {
'http': 'http://user:pass@ipipgo-proxy:9020',
'https': 'http://user:pass@ipipgo-proxy:9020'
}
response = requests.get('https://target.com', proxies=proxies)
tree = html.fromstring(response.text)
模糊匹配带item的class
items = tree.xpath("//div[contains(@class,'item')]/text()")
这里重点说下ipipgo的动态住宅代理,他家IP池子里有200多万个真实家庭网络地址。上次我拿这玩意配合类选择器,连续跑了一周都没触发反爬,比用数据中心IP稳得多。
二、类选择器的三大绝活
别傻乎乎用完整class名,这三招让你少掉坑:
| 招式 | 示例 | 使用场景 |
|---|---|---|
| 模糊匹配 | contains(@class,’part’) | class名带动态后缀 |
| 多重过滤 | [contains(@class,’a’) and contains(@class,’b’)] | 复合class样式 |
| 层级定位 | //div[@class=’wrap’]//li[contains(@class,’item’)] | 嵌套结构解析 |
注意class名里可能有隐藏陷阱,比如某宝的商品class会带时间戳。这时候用ipipgo的轮换代理,每5分钟自动换IP,配合模糊匹配稳如老狗。
三、代理IP的正确打开姿势
见过太多人把好代理用废了,记住这三点:
- 别用免费代理:10个里有8个是蜜罐,剩下2个比蜗牛慢
- 协议要对路:网页用https就别上http代理,会漏马脚
- 超时设置:建议设3-5秒,超过直接换IP
拿ipipgo的代理举个栗子,他家支持socks5和https双协议。建议这样配置:
PROXY_POOL = [
"socks5://user:pass@us1.ipipgo.io:1080",
"https://user:pass@eu1.ipipgo.io:8443"
]
四、实战避坑指南
最近帮朋友搞招聘网站采集,遇到个奇葩问题:明明用了类选择器,还是漏数据。后来发现网站把部分内容放在<div class="item item-hidden">里。解决方案很简单:
同时包含item和item-hidden的情况
items = tree.xpath("//div[contains(@class,'item') and not(contains(@class,'hidden'))]")
这时候如果用普通代理,频繁重试会被封。换成ipipgo的长效静态住宅IP,单个IP能持续用6小时,配合这种精准选择器,成功率直接拉满。
五、常见问题QA
Q:类选择器总是匹配不到怎么办?
A:先检查元素是否在iframe里,再用浏览器开发者工具复制XPath。建议搭配ipipgo的高匿名代理,避免被屏蔽。
Q:代理IP突然失效咋处理?
A:在请求代码里加异常重试机制,推荐用ipipgo的自动切换套餐,失效自动切下一个IP。
Q:需要处理大量验证码怎么办?
A:降低请求频率+使用带浏览器指纹的代理。ipipgo的高级版代理支持自定义User-Agent,能有效降低验证码触发率。
六、终极解决方案
把代理IP和智能解析打包成服务才是王道。比如用ipipgo的API网关服务,直接传XPath表达式就能拿到清洗好的数据。这样连代理管理和HTML解析都省了,适合需要快速出结果的场景。
import requests
api_url = "https://gateway.ipipgo.com/v1/extract"
params = {
"url": "https://target.com",
"xpath": "//div[contains(@class,'price')]",
"api_key": "your_ipipgo_key"
}
response = requests.get(api_url, params=params)
print(response.json()['data'])
这种玩法把复杂度转嫁给服务商,自己专注业务逻辑。特别适合需要多地域数据采集的情况,比如同时获取不同地区的价格信息。

