前言

大家好!今天给大家分享一个实用的Python爬虫案例——爬取拉勾网的招聘信息。虽然拉勾网有一定的反爬机制,但通过模拟浏览器请求和解析页面JSON数据,我们仍然可以获取到想要的招聘数据。

一、爬虫思路分析

1.1 目标网站

  • 目标:拉勾网招聘信息
  • 示例URL:https://www.lagou.com/wn/jobs?kd=AIagent开发

1.2 技术要点

  • 使用 requests 发送HTTP请求
  • 通过正则表达式提取页面中的JSON数据
  • 使用 fake-useragent 随机生成User-Agent
  • 利用Cookie模拟登录状态
  • 将数据保存为CSV文件

1.3 反爬对策

拉勾网的招聘数据并不是通过Ajax异步加载,而是直接嵌入在HTML页面的 <script id="__NEXT_DATA__"> 标签中,这大大降低了爬取难度。

二、完整代码实现

import re
import csv
import requests
import json
from pprint import pprint
from fake_useragent import UserAgent


class LagouSpider:

    def __init__(self, keyword='python'):
        self.keyword = keyword
        self.url = f'https://www.lagou.com/wn/jobs?cl=false&fromSearch=true&labelWords=sug&suginput={keyword}&kd={keyword}'
        self.headers = {
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
            'cookie': '',# 填写自己的cookie
            'user-agent': UserAgent().random
        }

    def run(self):
        response = requests.get(self.url, headers=self.headers)
        html_data = re.findall(r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script', response.text)[0]
        json_data = json.loads(html_data)

        with open(f'{self.keyword}_jobs.csv', 'w', newline='', encoding='utf-8-sig') as f:
            writer = csv.DictWriter(f, fieldnames=['职位', '公司', '城市', '区域', '薪资', '经验', '学历', '详情页'])
            writer.writeheader()

            for job in json_data['props']['pageProps']['initData']['content']['positionResult']['result']:
                pprint(job)
                data = {
                    '职位': job['positionName'],
                    '公司': job['companyFullName'],
                    '城市': job['city'],
                    '区域': job['district'],
                    '薪资': job['salary'],
                    '经验': job['workYear'],
                    '学历': job['education'],
                    '详情页': f"https://www.lagou.com/wn/jobs/{job['positionId']}.html"
                }
                print(data)
                writer.writerow(data)

        print(f'完成!共保存 {len(json_data["props"]["pageProps"]["initData"]["content"]["positionResult"]["result"])} 条数据')


if __name__ == '__main__':
    spider = LagouSpider(keyword='AIagent开发')
    spider.run()

三、代码详解

3.1 类的初始化 __init__

  • keyword:搜索关键词,默认为’python’
  • url:动态构建请求URL
  • headers:请求头,包含Cookie和随机User-Agent

注意:Cookie是有时效性的,如果运行时报错,需要登录拉勾网后从浏览器开发者工具中复制最新的Cookie。

3.2 核心方法 run

  1. 发送请求:使用requests.get()模拟浏览器访问
  2. 提取JSON:通过正则表达式提取__NEXT_DATA__标签中的内容
  3. 解析数据:将JSON字符串转换为Python字典
  4. 保存CSV:遍历职位列表,提取需要的字段写入CSV文件

3.3 数据字段说明

字段 说明 示例
职位 岗位名称 AIagent开发工程师
公司 公司全称 某某科技有限公司
城市 工作城市 北京
区域 工作区域 朝阳区
薪资 薪资范围 20k-40k
经验 工作经验 3-5年
学历 学历要求 本科
详情页 职位详情链接 https://www.lagou.com/wn/jobs/xxx.html

四、运行结果

运行脚本后,会在当前目录生成一个AIagent开发_jobs.csv文件,内容如下:

| 职位 | 公司 | 城市 | 区域 | 薪资 | 经验 | 学历 | 详情页 |
|------|------|------|------|------|------|------|--------|
| AI开发工程师 | 某互联网公司 | 北京 | 海淀区 | 25k-50k | 3-5年 | 本科 | https://www.lagou.com/... |

五、注意事项

  1. Cookie时效性:文中的Cookie是示例数据,实际使用需要替换为你自己的Cookie
  2. 请求频率:不要频繁请求,建议加入time.sleep()避免IP被封
  3. 法律合规:请遵守robots.txt协议,仅用于个人学习研究
  4. 反爬升级:拉勾网可能会更新反爬策略,届时需要相应调整代码

六、扩展改进建议

  1. 多页爬取:目前只爬取了第一页,可以通过分析URL参数实现翻页
  2. 异常处理:增加try-except处理网络异常和解析异常
  3. 代理IP:爬取大量数据时建议使用代理IP池
  4. 数据存储:可以改为存储到MySQL或MongoDB

结语

以上就是爬取拉勾网招聘数据的完整教程。这个爬虫代码结构清晰,易于理解和修改,希望能帮助到正在学习爬虫的朋友们。

如果你觉得本文对你有帮助,欢迎点赞收藏!有问题也可以在评论区留言交流~

更多推荐