文章目录
一、为什么要用代理IP?(血泪教训!)
最近帮朋友公司抓取某招聘网站数据时,我经历了从"信心满满"到"怀疑人生"的过山车体验😭。前100条数据顺利到手,第101次请求突然就被封IP了!网站直接弹出了验证码页面(当场裂开.jpg)。后来发现,现在主流招聘网站都部署了这些防御措施:
- IP访问频率检测(超过阈值就封)
- User-Agent验证(非浏览器访问直接拦截)
- 请求头完整性检查(少个字段都不行!)
- 动态加载数据(你以为看到的网页就是全部?太天真!)
这时候代理IP就是我们的救命稻草!通过切换不同IP地址,可以把我们的请求伪装成不同用户的正常访问(就像开外挂的变脸术~)
二、代理IP的正确打开方式
2.1 代理服务选择避坑指南
市面上的代理服务商鱼龙混杂,经过多次踩坑测试,推荐这两个类型:
- 短效代理(适合小规模爬虫):
# 示例:从免费代理网站抓取IP(注意存活率只有30%左右!)
proxies = [
{"http": "http://61.216.156.222:1080"},
{"http": "http://121.13.252.58:41564"},
# ...其他IP
]
- 付费代理池(企业级项目必备):
# 使用专业代理服务(以某服务商为例)
import requests
def get_proxy():
url = "https://api.proxy.com/get?type=http"
return requests.get(url).json()['proxy']
2.2 代理IP的实战配置
在requests库中使用代理的正确姿势:
import random
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...',
'Referer': 'https://www.zhipin.com/'
}
def get_job_info(url):
try:
# 获取代理IP(这里要替换成你的代理服务)
proxy = get_proxy()
response = requests.get(url,
headers=headers,
proxies={"http": proxy},
timeout=5)
# 解析代码放在下一章节...
return response.json()
except Exception as e:
print(f"请求失败!错误信息:{str(e)}")
# 自动切换代理重试
return get_job_info(url)
三、招聘网站反爬破解大全(合法合规版!)
3.1 动态参数逆向工程
以某招聘网站为例,发现它的翻页参数是加密的timestamp:
# 生成动态参数
import time
import hashlib
def generate_params(keyword):
timestamp = str(int(time.time()*1000))
secret = hashlib.md5(f"{keyword}_{timestamp}".encode()).hexdigest()
return {
'keyword': keyword,
'_ts': timestamp,
'_secret': secret[:8]
}
3.2 页面解析绝招
遇到动态加载数据怎么办?三步走战略:
- 使用浏览器开发者工具分析XHR请求
- 定位真实数据接口(一般藏在Network的XHR里)
- 直接请求接口获取JSON数据
# 使用正则表达式提取JSON数据(暴力但有效)
import re
import json
def parse_html(html):
# 匹配 <script> 标签中的JSON数据
pattern = r'<script>window.__INITIAL_STATE__=(.*?);</script>'
match = re.search(pattern, html)
if match:
data = json.loads(match.group(1))
jobs = data['jobList']['results']
for job in jobs:
print(f"职位:{job['jobTitle']}")
print(f"薪资:{job['salary']}")
print(f"公司:{job['company']['name']}")
print("="*50)
四、完整项目源码(可直接运行)
# 省略导入语句...
# 完整代码获取方式见文末
class JobSpider:
def __init__(self):
self.session = requests.Session()
self.proxy_pool = [] # 代理池初始化
self.load_proxies() # 加载代理IP
def load_proxies(self):
# 这里接入代理服务API
pass
def get_random_proxy(self):
return random.choice(self.proxy_pool)
def crawl_jobs(self, keyword, pages=10):
base_url = "https://careers.xxx.com/api/jobs"
for page in range(1, pages+1):
params = self.generate_params(keyword, page)
response = self.make_request(base_url, params)
# 解析数据...
# 其他方法...
if __name__ == "__main__":
spider = JobSpider()
spider.crawl_jobs("Python开发", pages=5)
五、法律红线提醒(必看!)
- 遵守网站的robots.txt协议
- 控制请求频率(建议每次请求间隔3-5秒)
- 不抓取个人隐私数据(手机号、邮箱等)
- 数据仅用于学习研究
- 商业用途需获得授权
根据《数据安全法》第二十七条,任何个人和组织获取数据应当遵守法律规定,尊重社会公德!
六、常见问题QA
Q:代理IP还是被封怎么办?
A:试试这些组合拳:
- 增加请求头完整性(带上Accept/Cookie等)
- 使用浏览器指纹伪装
- 切换不同网络环境(4G/WiFi交替)
Q:遇到验证码怎么处理?
A:推荐方案:
- 接入打码平台(适合少量需求)
- 使用机器学习识别(技术难度较高)
- 最推荐:降低请求频率!
需要完整源码的小伙伴,在评论区留言【求源码】,我会私信发给你~ (原创不易,记得点赞收藏哦!)
&spm=1001.2101.3001.5002&articleId=148081735&d=1&t=3&u=55aaad5993fb4a68816f9ce6af0dcc2f)
34万+

被折叠的 条评论
为什么被折叠?



