文章目录
一、为什么要用代理IP?(血的教训!)
兄弟们!上次我撸了某招聘网站3小时爬了2万条数据,结果第二天账号直接被封了!(哭晕在键盘前)现在但凡正经点的招聘平台都配了这些防护手段:
- IP访问频率监控(超过阈值直接拉黑)
- User-Agent检测(非浏览器特征直接拒绝)
- 验证码拦截(突然弹验证码打断采集)
- 账号关联封禁(别以为换个账号就能逃)
所以老铁们!用代理IP是咱们搞数据采集的保命符啊!(敲黑板)
二、实战装备清单(小白也能看懂)
2.1 开发环境准备
安装这些库(一行命令搞定):
pip install requests beautifulsoup4 fake-useragent pandas
2.2 代理IP来源推荐
推荐几个我用过的靠谱渠道(自取不谢):
代理类型 | 免费推荐 | 付费推荐(墙裂推荐) |
---|---|---|
透明代理 | 快代理免费池 | 青果动态住宅代理 |
匿名代理 | ProxyScrape | 亮数据旋转代理 |
高匿代理 | Geonode(每日500个) | Oxylabs企业级代理 |
(注意:免费代理存活率不到30%,重要项目建议直接上付费的!)
三、手把手实战教学(以智联招聘为例)
3.1 爬虫核心代码骨架
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
# 初始化工具
ua = UserAgent()
proxies = {
'http': 'http://12.34.56.78:8888', # 替换成你的代理IP
'https': 'http://12.34.56.78:8888'
}
def get_job_data(keyword, page):
headers = {
'User-Agent': ua.random,
'Referer': 'https://www.zhaopin.com/'
}
try:
url = f'https://sou.zhaopin.com/?jl=765&kw={keyword}&p={page}'
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'lxml')
# 解析逻辑放这里(后面细说)
return parse_data(soup)
else:
print(f'请求失败!状态码:{response.status_code}')
except Exception as e:
print(f'发生异常:{str(e)}')
def parse_data(soup):
jobs = []
items = soup.select('.contentpile__content__wrapper__item')
for item in items:
title = item.select_one('.contentpile__content__wrapper__item__info__box__jobname').text.strip()
company = item.select_one('.company_title').text.strip()
salary = item.select_one('.contentpile__content__wrapper__item__info__box__job__saray').text
jobs.append({
'职位': title,
'公司': company,
'薪资': salary,
# 其他字段自行扩展
})
return jobs
# 示例调用
if __name__ == '__main__':
for page in range(1, 6): # 爬前5页
print(f'正在爬取第{page}页...')
data = get_job_data('Python开发', page)
print(data)
3.2 解析层避坑重点(超级重要)
招聘网站常用这些反爬套路:
-
动态class名:比如
.contentpile__content__wrapper__item
每周变一次- 对策:多用contains语法
[class*="contentpile"]
- 对策:多用contains语法
-
数据加密:关键字段用base64编码
- 对策:找到解密函数逆向处理
-
懒加载:图片和详情页数据需要滚动加载
- 对策:使用selenium模拟滚动
-
参数签名:URL带timestamp和hash参数
- 对策:逆向JS生成逻辑
(PS:遇到复杂情况建议上selenium+代理插件方案)
四、数据存储进阶方案
4.1 基础存储(CSV)
import pandas as pd
def save_to_csv(data, filename='jobs.csv'):
df = pd.DataFrame(data)
df.to_csv(filename, mode='a', index=False, encoding='utf_8_sig')
4.2 高级方案(MySQL+去重)
import pymysql
from hashlib import md5
conn = pymysql.connect(host='localhost', user='root', password='123456', database='jobs')
def save_to_mysql(data):
with conn.cursor() as cursor:
for item in data:
# 生成数据指纹防止重复
data_hash = md5(str(item).encode()).hexdigest()
sql = f"""INSERT INTO job_list
(title, company, salary, hash)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE update_time=NOW()"""
cursor.execute(sql, (
item['职位'],
item['公司'],
item['薪资'],
data_hash
))
conn.commit()
五、法律红线千万别碰!(保命提醒)
根据《网络安全法》和《数据安全法》,这些操作绝对禁止:
- 爬取用户隐私数据(电话号码、邮箱等)
- 绕过网站反爬措施(破解验证等)
- 高频访问影响网站正常运行
- 将数据用于商业牟利(需获得授权)
建议每次爬取前:
✅ 查看robots.txt协议
✅ 设置访问间隔(建议3-5秒)
✅ 使用正规代理服务
✅ 限制爬取数量
六、常见问题急救包
Q1:总是返回403错误怎么办?
A:检查这三个地方:
- 代理IP是否失效(用
curl -x http://ip:port ifconfig.me
测试) - Headers是否完整(特别是Cookie和Referer)
- 访问频率是否过高(加随机延时)
Q2:数据抓不全怎么破?
A:八成遇到动态加载了!上这两招:
- 抓包分析XHR请求
- 使用selenium渲染页面
Q3:免费代理总超时怎么办?
A:自己搭建代理池啊!代码模板拿去:
import random
class ProxyPool:
def __init__(self):
self.proxies = []
# 这里添加代理IP获取逻辑
def get_random_proxy(self):
return random.choice(self.proxies)
def check_proxy(self, proxy):
try:
requests.get('http://httpbin.org/ip', proxies={'http': proxy}, timeout=5)
return True
except:
return False
七、升级路线图(从小白到专家)
- 入门级:Requests+BS4(适合静态页面)
- 进阶级:Selenium/Playwright(搞定动态渲染)
- 高手级:Scrapy/Feapder(分布式爬虫)
- 专家级:自研反反爬系统(IP池+打码平台+行为模拟)
最后送大家一句话:爬虫玩得好,班房进的早!切记遵守规则,技术要用在正道啊!(别问我怎么知道的…)