文章目录
前言:当爬虫遇到反爬怎么办?
做爬虫的朋友们都知道(特别是刚入门的新手),很多招聘网站的反爬机制简直比城墙还厚!😭 最常见的限制就是IP访问频率——当你用同一个IP疯狂请求时,分分钟给你封IP没商量!这时候,代理IP就是我们突破封锁的秘密武器!(亲测有效)
划重点:本文所有操作都基于合法合规的前提,请务必遵守目标网站的robots协议和法律法规!!!
一、准备工作(装好这些再上车)
1.1 环境配置
- Python 3.8+(推荐用Anaconda管理环境)
- 安装必备库:
pip install requests beautifulsoup4 fake-useragent
1.2 代理IP来源
这里给大家推荐两种获取方式:
- 免费渠道(适合小规模测试):
- 西刺代理
- 快代理
- (但免费IP的存活率…你懂的🌚)
- 付费服务(推荐商用场景):
- 青果代理
- 亮数据
- 阿布云
二、实战代码解析(手把手教学)
2.1 基础爬虫框架搭建
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
# 初始化工具
ua = UserAgent()
headers = {'User-Agent': ua.random}
def get_job_info(url, proxy=None):
try:
response = requests.get(
url,
headers=headers,
proxies=proxy,
timeout=10
)
response.encoding = 'utf-8'
if response.status_code == 200:
return parse_html(response.text)
else:
print(f'请求失败,状态码:{response.status_code}')
except Exception as e:
print(f'发生异常:{str(e)}')
return None
2.2 代理IP动态切换技巧
# 代理IP池示例(实际建议从API获取)
proxy_pool = [
{'http': 'http://123.45.67.89:8080'},
{'http': 'http://111.222.33.44:3128'},
# 更多代理...
]
current_proxy = 0
def get_proxy():
global current_proxy
proxy = proxy_pool[current_proxy]
current_proxy = (current_proxy + 1) % len(proxy_pool)
return proxy
2.3 高效解析页面数据
def parse_html(html):
soup = BeautifulSoup(html, 'lxml')
job_list = []
# 以某招聘网站结构为例
for item in soup.select('.job-item'):
title = item.select_one('.job-title').text.strip()
company = item.select_one('.company-name').text.strip()
salary = item.select_one('.salary').text.strip()
job_list.append({
'title': title,
'company': company,
'salary': salary
})
return job_list
三、突破反爬的5个关键技巧(血泪经验总结)
3.1 请求头随机生成
# 每次请求生成随机User-Agent
headers = {
'User-Agent': ua.random,
'Accept-Language': 'zh-CN,zh;q=0.9',
'Referer': 'https://www.zhipin.com/'
}
3.2 智能请求间隔控制
import random
import time
# 随机延时防止规律访问
def smart_delay():
time.sleep(random.uniform(1.5, 3.5))
3.3 异常处理加强版
def safe_request(url, retry=3):
for _ in range(retry):
try:
proxy = get_proxy()
response = requests.get(url, proxies=proxy, timeout=8)
# 检查代理是否生效
if '您的IP已被限制' in response.text:
raise ProxyError
return response
except (ConnectionError, Timeout):
print('代理失效,自动切换...')
continue
return None
四、数据存储方案(三种常用方式)
4.1 CSV存储
import csv
def save_to_csv(data, filename='jobs.csv'):
with open(filename, 'a', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'company', 'salary'])
writer.writerows(data)
4.2 MySQL存储(示例)
import pymysql
def save_to_mysql(data):
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
db='jobs_db'
)
# 建表语句省略...
with conn.cursor() as cursor:
sql = """INSERT INTO jobs
(title, company, salary)
VALUES (%s, %s, %s)"""
cursor.executemany(sql, [
(d['title'], d['company'], d['salary'])
for d in data
])
conn.commit()
五、完整项目源码结构
/招聘爬虫项目
│ main.py # 主程序
│ proxy_manager.py # 代理IP管理
│ config.py # 配置文件
├───utils # 工具类
│ │ logger.py # 日志模块
│ │ storage.py # 存储模块
└───data # 数据存储目录
六、法律风险提示(必看!!!)
- 严格遵守《数据安全法》和《个人信息保护法》
- 禁止爬取用户隐私数据(电话号码、邮箱等)
- 控制请求频率(建议≥3秒/次)
- 尊重网站的robots.txt协议
- 商用前务必获得网站授权
结语:让爬虫更智能
现在你已经掌握了代理IP的核心用法!🎉 这个项目还可以继续扩展:
- 添加自动验证代理IP有效性的模块
- 集成Scrapy框架提升效率
- 增加定时任务自动抓取
- 结合数据分析生成薪资报告
源码获取:关注后私信回复"招聘爬虫"获取完整可运行代码(包含异常处理增强版)
最后提醒:技术是把双刃剑,请务必在法律允许的范围内合理使用爬虫技术!如果觉得本文有帮助,欢迎转发给更多需要的朋友~(转载请标明出处)