最近在做一个超有意思的实验项目——用真实招聘数据训练面试AI助手!结果发现市面上的公开数据集都太陈旧了(都是2020年前的),于是决定自己动手丰衣足食。但现实马上给我泼了盆冷水:连续爬了3个招聘网站后,IP直接被封了(哭)…这才意识到代理IP的重要性!
今天就把这个完整的踩坑经验分享给大家,手把手教你如何用Python爬虫+亮数据代理IP,安全高效地获取最新招聘数据。文末还会附赠AI模型训练的小技巧哦~(文中有5处隐藏踩坑预警,看到记得拿小本本记下来!)
(⚠️踩坑预警1:千万别用免费代理!我测试过15个免费代理池,平均可用率不到5%,爬10次被封9次!)
在开始前务必检查目标网站的robots.txt
文件!比如某联招聘的规则是:
User-agent: *
Disallow: /search
这意味着我们不能直接爬取搜索页数据。不过别慌!我们可以通过分析Ajax接口来合法获取数据(具体方法见第三章)。
注册亮数据账号后,在控制台找到"住宅代理"服务,复制你的认证信息:
用户名:your_username
密码:your_password
端口:22225
import requests
proxies = {
'http': 'http://USERNAME:PASSWORD@proxy.亮数据域名.com:22225',
'https': 'http://USERNAME:PASSWORD@proxy.亮数据域名.com:22225'
}
response = requests.get('https://api.myip.com', proxies=proxies)
print(f"当前代理IP:{response.json()['ip']}") # 验证IP是否生效
(小技巧:添加verify=False
参数可跳过SSL验证,但生产环境慎用!)
使用Chrome开发者工具,我们发现真实数据接口:
GET https://www.xxx.com/jobs/list_ajax
Params:
keyword: Python
city: 北京
page: 2
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.xxx.com/search',
'X-Requested-With': 'XMLHttpRequest' # 关键!标识Ajax请求
}
(⚠️踩坑预警2:缺少X-Requested-With
头会被识别为爬虫!)
def get_jobs(keyword, max_page=10):
for page in range(1, max_page+1):
params = {
'keyword': keyword,
'city': '全国',
'page': page
}
try:
response = requests.get(
url='https://www.xxx.com/jobs/list_ajax',
params=params,
headers=headers,
proxies=proxies,
timeout=10
)
# 解析JSON数据
data = response.json()
for job in data['list']:
yield {
'title': job['jobTitle'],
'company': job['companyName'],
'salary': job['salary'],
'skills': extract_skills(job['jobDesc']) # 技能提取函数
}
time.sleep(random.uniform(1,3)) # 随机延时
except Exception as e:
print(f"第{page}页抓取失败:{str(e)}")
(⚠️踩坑预警3:一定要加随机延时!固定间隔会被识别!)
import jieba.analyse
def extract_skills(desc):
tags = jieba.analyse.extract_tags(desc, topK=10, withWeight=False)
return [tag for tag in tags if tag in SKILL_DICT] # SKILL_DICT预定义的技能词库
import pandas as pd
df = pd.DataFrame(jobs_data)
df.to_csv('jobs.csv', index=False, encoding='utf_8_sig') # 中文编码
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=500)
X = tfidf.fit_transform(df['skills'].apply(' '.join))
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X, df['job_type']) # 提前标注的岗位类型
(进阶方案:用BERT模型做语义理解,准确率提升30%+!)
(⚠️踩坑预警4:某联招聘的Cookie有效期为30分钟!)
Q:爬到的数据怎么保证质量?
A:建议设置三级校验:
Q:数据量很大时怎么处理?
A:上MongoDB分片集群!百万级数据查询速度提升10倍不止!
通过这个项目,我深刻体会到:
未来想尝试:
(私藏资源:在GitHub搜"awesome-job-spider"发现宝藏仓库!)
最后的小贴士:本文所有代码已通过测试,但网站接口可能随时变更。如果遇到问题,记得检查以下三点:
欢迎在评论区交流你的实战心得!下期预告:《用强化学习打造自动调参爬虫系统》敬请期待~