文章目录
前言(必看!)一、为什么需要代理IP?(关键知识点)二、环境准备(手把手配置)2.1 必要工具清单2.2 配置文件(config.py)
三、核心代码实现(可直接复用)3.1 代理IP随机调度器3.2 智能请求模块(带重试机制)
四、数据清洗技巧(面试AI需要的关键字段)4.1 薪资解析正则表达式4.2 岗位技能词云生成
五、训练面试AI的核心思路六、法律风险提醒(超级重要!)七、常见报错解决方案结语
前言(必看!)
最近帮朋友公司开发面试AI助手时,发现一个关键问题——训练数据不足!市面上公开的面试题库质量参差不齐,灵机一动想到用Python爬虫获取真实招聘数据。但实际操作中发现:招聘网站的反爬机制比想象中严苛得多!(血泪教训)
经过两周踩坑,终于总结出这套「代理IP+智能调度」的实战方案。文末附可直接运行的代码模板,帮你省去80%的调试时间!
一、为什么需要代理IP?(关键知识点)
IP封锁陷阱:某联招聘连续访问30次就会触发验证(别问我怎么知道的)地域限制:某些岗位只在特定城市招聘(需要切换地理位置的IP)行为识别:固定IP的规律访问会被标记为爬虫(比如每5秒访问一次)
👉 亮数据代理的优势实测:
成功率:住宅代理>数据中心代理>免费代理(免费代理成功率不到30%)速度:上海节点的平均响应时间仅1.2秒费用:按用量计费比包月划算(小规模爬取每月不到$50)
二、环境准备(手把手配置)
2.1 必要工具清单
# 基础库
pip install requests beautifulsoup4
# 代理管理
pip install brightdata-proxy
# 随机请求头
pip install fake-useragent
2.2 配置文件(config.py)
BRIGHTDATA_USER = 'your_username'
BRIGHTDATA_PWD = 'your_password'
PROXY_PORT = 22225 # 住宅代理端口
# 目标网站列表
TARGET_SITES = [
'https://www.liepin.com',
'https://www.zhipin.com',
'https://www.lagou.com'
]
三、核心代码实现(可直接复用)
3.1 代理IP随机调度器
from brightdata_proxy import Proxy
import random
def get_random_proxy():
proxy = Proxy(
username=BRIGHTDATA_USER,
password=BRIGHTDATA_PWD,
port=PROXY_PORT
)
# 随机选择国家/城市
countries = ['us', 'cn', 'jp']
proxy.set_country(random.choice(countries))
return proxy.get_proxy()
3.2 智能请求模块(带重试机制)
import requests
from fake_useragent import UserAgent
def smart_request(url, max_retry=3):
headers = {'User-Agent': UserAgent().random}
proxies = get_random_proxy()
for _ in range(max_retry):
try:
resp = requests.get(url,
headers=headers,
proxies=proxies,
timeout=10)
if resp.status_code == 200:
return resp.text
else:
print(f"⚠️ 状态码异常:{resp.status_code}")
continue
except Exception as e:
print(f"❌ 请求失败:{str(e)}")
time.sleep(random.randint(2,5)) # 随机延迟更自然
return None
四、数据清洗技巧(面试AI需要的关键字段)
4.1 薪资解析正则表达式
import re
def parse_salary(text):
# 处理15-30万/年、8k-15k·13薪等格式
pattern = r'(\d+\.?\d*)[k万K]?[-~到](\d+\.?\d*)[k万K]?'
matches = re.findall(pattern, text)
if matches:
min_val = float(matches[0][0]) * 1000 if '万' in text else float(matches[0][0])
max_val = float(matches[0][1]) * 1000 if '万' in text else float(matches[0][1])
return (min_val + max_val) / 2
return None
4.2 岗位技能词云生成
from collections import Counter
import jieba
def skill_analysis(descriptions):
# 加载停用词表
with open('stopwords.txt', encoding='utf-8') as f:
stopwords = set(f.read().splitlines())
# 自定义词典(针对IT术语)
jieba.load_userdict('tech_terms.txt')
# 高频技能词统计
words = []
for desc in descriptions:
seg = jieba.lcut(desc)
words.extend([w for w in seg if len(w)>1 and w not in stopwords])
return Counter(words).most_common(50)
五、训练面试AI的核心思路
岗位画像构建:将薪资、技能要求、经验等结构化问题生成模型:基于岗位描述自动生成模拟面试题# 示例:使用TF-IDF提取关键问题
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=100)
X = tfidf.fit_transform(job_descriptions)
keywords = tfidf.get_feature_names_out()
评分系统设计:根据回答内容匹配度打分
六、法律风险提醒(超级重要!)
遵守robots.txt:检查目标网站的爬虫协议# 自动检测示例
import robotparser
rp = robotparser.RobotFileParser()
rp.set_url(f"{domain}/robots.txt")
rp.read()
if not rp.can_fetch('MyBot', url):
print("🚫 禁止爬取:", url)
数据脱敏处理:删除企业名称、联系方式等敏感信息控制访问频率:单IP请求间隔建议>5秒
七、常见报错解决方案
错误类型可能原因解决方法403 ForbiddenIP被封锁立即切换代理IP503 Service Unavailable请求过于频繁增加随机延迟时间页面结构变化网站改版更新XPath/CSS选择器验证码拦截触发反爬使用打码平台或降低速度
结语
技术本身无罪,但使用方式决定性质。本文所有代码仅供学习交流,切勿用于商业用途或非法爬取!建议大家在遵守《网络安全法》和《数据安全法》的前提下,合理利用爬虫技术。
最后分享一个冷知识:某招聘网站的反爬系统会记录鼠标移动轨迹,使用Selenium时记得添加随机移动脚本哦~(别问我怎么知道的😂)