文章目录
一、为什么要用代理IP?
做过招聘网站爬虫的都知道(说多了都是泪)… 这些网站的反爬机制简直比BOSS直聘的HR还难缠!你会发现刚爬了5页数据,IP就被永久拉黑了(别问我怎么知道的)!!!
这时候代理IP就是你的救星!它就像给爬虫戴上了千面假面,让目标网站以为每次请求都是不同用户在访问。不过注意(敲黑板):
- 免费代理IP的存活率只有20%左右(比应届生面试成功率还低)
- 付费代理API建议选按量计费的(土豪随意)
- 一定!必须!绝对!要测试IP可用性再使用
二、实战准备清单
1. 推荐开发环境
Python 3.8+(别再用Python2了!)
requests库 # 发送HTTP请求的瑞士军刀
BeautifulSoup4 # HTML解析神器
fake_useragent # 随机生成UA头(伪装浏览器必备)
2. 代理IP获取方案对比
类型 | 示例平台 | 优点 | 缺点 |
---|---|---|---|
免费代理 | 西刺代理 | 零成本 | 响应速度慢,存活率低 |
付费隧道代理 | 青果代理 | 自动切换IP | 需要注册认证 |
自建代理池 | 云服务器+脚本 | 完全可控 | 维护成本高 |
三、手把手教学环节(以某主流招聘网站为例)
步骤1:构建动态请求头
from fake_useragent import UserAgent
headers = {
"User-Agent": UserAgent().random, # 随机生成浏览器标识
"Accept-Language": "zh-CN,zh;q=0.9", # 中文环境
"Referer": "https://www.zhipin.com/" # 伪装来源页面
}
步骤2:代理IP中间件实现
import requests
def get_proxy():
# 这里以青果代理为例(记得替换自己的API密钥)
api_url = "http://api.qingguo.com/get?format=json"
response = requests.get(api_url).json()
return f"http://{response['data'][0]['ip']}:{response['data'][0]['port']}"
proxies = {
"http": get_proxy(),
"https": get_proxy()
}
步骤3:智能请求函数(带自动重试)
def smart_request(url, retry=3):
for _ in range(retry):
try:
response = requests.get(url,
headers=headers,
proxies=proxies,
timeout=10)
if response.status_code == 200:
return response.text
except Exception as e:
print(f"请求失败,切换代理重试...(剩余次数:{retry-1})")
proxies.update({"http": get_proxy(), "https": get_proxy()})
return None
步骤4:数据解析(避开反爬陷阱)
from bs4 import BeautifulSoup
def parse_jobs(html):
soup = BeautifulSoup(html, 'lxml')
# 注意!不要用class名称直接定位(网站经常改)
job_list = soup.select('div[ka^="job-item"]') # 使用属性选择器
for job in job_list:
title = job.find('span', {'ka': 'job-name'}).text.strip()
salary = job.find('span', {'ka': 'job-salary'}).text
# 更安全的提取方式:使用data-*属性
company = job.find('div', {'data-company': True})['data-company']
yield {
"title": title,
"salary": salary,
"company": company
}
四、你可能遇到的坑(血泪经验)
1. 明明用了代理IP还是被封?
- 检查请求频率(即使换IP,1秒10次请求照样封)
- 添加随机延迟:
time.sleep(random.uniform(1,3))
- 关闭Keep-Alive:在请求头添加
"Connection": "close"
2. 数据突然无法解析?
- 网站改版是常态(建议每周检查一次解析规则)
- 使用XPath替代CSS选择器(更稳定)
- 添加异常捕获:
try:
title = job.find('span', {'ka': 'job-name'}).text
except AttributeError:
title = "解析失败"
3. 法律风险规避指南
- 严格遵守robots.txt规则
- 不要爬取个人隐私信息(联系方式、身份证号等)
- 控制数据抓取量(建议不超过公开页面的50%)
五、完整项目结构推荐
/scraper_project
├── proxies/ # 代理IP管理
│ ├── ip_pool.py # 代理池维护
│ └── validator.py # IP有效性验证
├── spiders/
│ └── job_spider.py # 主爬虫逻辑
├── utils/
│ ├── logger.py # 日志记录
│ └── storage.py # 数据存储(CSV/MySQL)
└── config.py # 全局配置
六、升级你的爬虫(黑科技推荐)
1. 浏览器指纹模拟
使用selenium-wire
+undetected-chromedriver
实现:
import undetected_chromedriver as uc
options = uc.ChromeOptions()
options.add_argument(f'--proxy-server={get_proxy()}')
driver = uc.Chrome(options=options)
driver.get("https://www.zhipin.com")
2. 分布式爬虫架构
使用Scrapy-Redis
搭建:
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://你的服务器IP:6379'
七、写在最后(重要提醒)
虽然技术无罪,但爬虫有边界!在开始项目前:
- 查看目标网站的《用户协议》
- 咨询法律顾问(特别是商业用途时)
- 设置合理的爬取速率(建议≥5秒/请求)
- 对敏感字段进行脱敏处理
(实战代码已做脱敏处理,请勿直接用于商业用途)