Python爬虫实战:利用代理IP获取招聘网站信息(附完整源码)

一、为什么要用代理IP?(血泪教训!)

最近帮朋友公司抓取某招聘网站数据时,我经历了从"信心满满"到"怀疑人生"的过山车体验😭。前100条数据顺利到手,第101次请求突然就被封IP了!网站直接弹出了验证码页面(当场裂开.jpg)。后来发现,现在主流招聘网站都部署了这些防御措施:

  1. IP访问频率检测(超过阈值就封)
  2. User-Agent验证(非浏览器访问直接拦截)
  3. 请求头完整性检查(少个字段都不行!)
  4. 动态加载数据(你以为看到的网页就是全部?太天真!)

这时候代理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 页面解析绝招

遇到动态加载数据怎么办?三步走战略:

  1. 使用浏览器开发者工具分析XHR请求
  2. 定位真实数据接口(一般藏在Network的XHR里)
  3. 直接请求接口获取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)

五、法律红线提醒(必看!)

  1. 遵守网站的robots.txt协议
  2. 控制请求频率(建议每次请求间隔3-5秒)
  3. 不抓取个人隐私数据(手机号、邮箱等)
  4. 数据仅用于学习研究
  5. 商业用途需获得授权

根据《数据安全法》第二十七条,任何个人和组织获取数据应当遵守法律规定,尊重社会公德!

六、常见问题QA

Q:代理IP还是被封怎么办?
A:试试这些组合拳:

  • 增加请求头完整性(带上Accept/Cookie等)
  • 使用浏览器指纹伪装
  • 切换不同网络环境(4G/WiFi交替)

Q:遇到验证码怎么处理?
A:推荐方案:

  1. 接入打码平台(适合少量需求)
  2. 使用机器学习识别(技术难度较高)
  3. 最推荐:降低请求频率!

需要完整源码的小伙伴,在评论区留言【求源码】,我会私信发给你~ (原创不易,记得点赞收藏哦!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值