拉勾网 Ajax 动态加载数据的 Python 爬虫解析

小白学大数据
• 阅读 0

在招聘数据采集、职场趋势分析等场景中,拉勾网是重要的数据来源,但拉勾网采用 Ajax 动态加载技术渲染页面,传统的静态网页爬虫无法直接获取数据。本文将从 Ajax 动态加载原理入手,详解基于 Python 的拉勾网数据爬虫实现过程,包括请求分析、参数构造、反爬应对及数据解析存储,帮助开发者掌握动态网页爬虫的核心逻辑。 一、Ajax 动态加载原理与拉勾网数据请求分析 1.1 Ajax 动态加载核心逻辑 Ajax(Asynchronous JavaScript and XML)是一种无需刷新页面即可与服务器交换数据并更新部分网页的技术。拉勾网的职位列表、职位详情等数据均通过 Ajax 异步请求获取:前端页面加载完成后,JavaScript 会触发 HTTP 请求,服务器返回 JSON 格式的原始数据,前端再将数据渲染为可视化的网页内容。 1.2 拉勾网数据请求抓包分析 要爬取 Ajax 数据,首先需通过浏览器开发者工具分析请求参数和响应格式,步骤如下: 打开 Chrome 浏览器,访问拉勾网(https://www.lagou.com),按 F12 打开开发者工具,切换到「Network」标签; 筛选「XHR」类型(Ajax 请求专属类型),在搜索框输入目标职位(如「Python 开发」)并点击搜索; 观察 Network 面板中的请求,核心请求为positionAjax.json,该请求返回职位列表的 JSON 数据。 关键请求信息梳理: 请求方式:POST 请求 URL:https://www.lagou.com/jobs/positionAjax.json 请求头:需包含User-Agent、Referer、Cookie等(反爬关键) 请求参数:first(是否首次请求)、pn(页码)、kd(关键词)、city(城市)等 二、Python 爬虫实现核心步骤 2.1 环境准备 本次爬虫使用 Python 3.8+,核心依赖库: requests:发送 HTTP 请求 json:解析 JSON 响应数据 pandas:数据存储为 Excel/CSV time:设置请求间隔,规避反爬 2.2 爬虫核心代码实现 步骤 1:构造请求头与参数 请求头需模拟真实浏览器,Cookie 可从浏览器开发者工具中复制(注意时效性),参数需动态设置页码和关键词: python

import json
import pandas as pd
import time
from requests.exceptions import RequestException

# 全局配置
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Referer": "https://www.lagou.com/jobs/list_Python%E5%BC%80%E5%8F%91?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput=",
    "Cookie": "你的Cookie(从浏览器复制)",  # 替换为实际Cookie
    "Host": "www.lagou.com",
    "Origin": "https://www.lagou.com",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "X-Anit-Forge-Token": "None",
    "X-Anit-Forge-Code": "0"
}

# 请求参数模板
def get_params(page_num, keyword, city):
    params = {
        "first": "true" if page_num == 1 else "false",
        "pn": page_num,
        "kd": keyword,
        "city": city
    }
    return params

步骤 2:发送 POST 请求获取数据 需处理请求异常,并设置随机延迟避免触发反爬机制: python 运行

import json
import time
from requests.exceptions import RequestException

# 亿牛云代理(新增)
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 构造代理URL(包含账号密码认证)
proxy_url = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
proxies = {
    "http": proxy_url,
    "https": proxy_url
}

# 全局请求头(需保留原配置,此处仅为示例完整性展示)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Referer": "https://www.lagou.com/jobs/list_Python%E5%BC%80%E5%8F%91?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput=",
    "Cookie": "你的Cookie(替换为实际有效Cookie)",
    "Host": "www.lagou.com",
    "Origin": "https://www.lagou.com",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "X-Anit-Forge-Token": "None",
    "X-Anit-Forge-Code": "0"
}

# 保留原参数构造函数(完整性展示)
def get_params(page_num, keyword, city):
    params = {
        "first": "true" if page_num == 1 else "false",
        "pn": page_num,
        "kd": keyword,
        "city": city
    }
    return params

def get_lagou_data(page_num, keyword, city):
    """
    获取单页拉勾网职位数据(整合代理信息)
    :param page_num: 页码
    :param keyword: 职位关键词
    :param city: 城市
    :return: 解析后的字典列表
    """
    url = "https://www.lagou.com/jobs/positionAjax.json"
    params = get_params(page_num, keyword, city)
    # 转换参数为表单格式
    data = f"first={params['first']}&pn={params['pn']}&kd={params['kd']}&city={params['city']}"

    try:
        # 设置超时时间,避免请求挂起(新增proxies参数)
        response = requests.post(
            url=url,
            headers=headers,
            data=data,
            proxies=proxies,  # 接入代理配置
            timeout=10,
            verify=False  # 可选:忽略SSL证书验证(部分代理需开启)
        )
        # 校验响应状态
        if response.status_code == 200:
            result = json.loads(response.text)
            # 提取职位列表数据
            if result["success"] and "content" in result and "positionResult" in result["content"]:
                positions = result["content"]["positionResult"]["result"]
                return positions
            else:
                print(f"第{page_num}页请求成功但无数据:{result.get('msg', '未知错误')}")
                return []
        else:
            print(f"第{page_num}页请求失败,状态码:{response.status_code}")
            return []
    except RequestException as e:
        print(f"第{page_num}页请求异常:{str(e)}")
        return []
    finally:
        # 随机延迟1-3秒,规避反爬
        time.sleep(time.random() * 2 + 1)

步骤 3:多页数据爬取与字段提取 提取核心字段(职位名称、薪资、公司、工作经验、学历要求等),并循环爬取多页数据: python 运行

    """
    批量爬取拉勾网多页数据
    :param keyword: 职位关键词
    :param city: 城市
    :param max_page: 最大爬取页码
    :return: 结构化数据DataFrame
    """
    all_positions = []
    # 核心字段列表,可根据需求扩展
    core_fields = [
        "positionName", "salary", "companyShortName", "city",
        "workYear", "education", "jobNature", "positionAdvantage",
        "companySize", "industryField", "createTime"
    ]

    for page in range(1, max_page + 1):
        print(f"正在爬取第{page}页数据...")
        positions = get_lagou_data(page, keyword, city)
        if not positions:
            print(f"第{page}页无数据,停止爬取")
            break

        # 提取核心字段,避免字段缺失报错
        for pos in positions:
            clean_pos = {field: pos.get(field, "未知") for field in core_fields}
            all_positions.append(clean_pos)

    # 转换为DataFrame,方便存储和分析
    df = pd.DataFrame(all_positions)
    return df

步骤 4:数据存储与结果展示 将爬取的数据存储为 Excel 文件,并打印数据概览:

    # 配置爬取参数
    target_keyword = "Python开发"
    target_city = "北京"
    max_crawl_page = 5

    # 执行爬取
    print(f"开始爬取拉勾网【{target_city}】-{target_keyword} 职位数据...")
    position_df = crawl_lagou(target_keyword, target_city, max_crawl_page)

    # 数据存储
    if not position_df.empty:
        save_path = f"lagou_{target_city}_{target_keyword.replace('/', '_')}.xlsx"
        position_df.to_excel(save_path, index=False)
        print(f"数据爬取完成,共{len(position_df)}条职位信息,已保存至:{save_path}")

        # 打印数据概览
        print("\n数据概览:")
        print(position_df[["positionName", "salary", "companyShortName", "workYear"]].head(10))
    else:
        print("未爬取到任何数据")

三、反爬机制应对策略 拉勾网有严格的反爬措施,直接运行上述代码可能触发限制,需重点注意以下几点: 3.1 Cookie 与请求头优化 Cookie 需定期更新:拉勾网的 Cookie 有效期较短,建议每次爬取前从浏览器重新复制; 动态生成 User-Agent:可使用fake-useragent库随机生成 User-Agent,避免固定标识被识别; 补充其他请求头:如Accept、Accept-Encoding等,完全模拟浏览器请求。 3.2 频率控制 避免短时间高频请求:设置 1-3 秒的随机延迟,每页爬取间隔不低于 1 秒; 分批次爬取:如需爬取大量数据,可分时段执行,避免单次请求超过 20 页。 3.3 账号登录(可选) 部分数据需登录后才能获取,可通过requests.Session()保持登录状态,模拟登录流程(需处理验证码、加密参数等)。 四、注意事项与合规说明 爬取数据仅用于学习和研究,不得用于商业用途,遵守拉勾网的《用户协议》; 控制爬取频率,避免给拉勾网服务器造成压力; 若爬取过程中出现 403、500 等状态码,需立即停止爬取,排查是否触发反爬; 拉勾网的接口参数可能随版本更新变化,需定期重新抓包验证请求格式。 五、总结 本文通过解析拉勾网 Ajax 动态加载的核心逻辑,实现了基于 Python 的职位数据爬虫,核心在于准确分析 Ajax 请求的参数和响应格式,同时做好反爬应对。该思路可迁移至其他采用 Ajax 动态加载的网站(如智联招聘、BOSS 直聘等),开发者可根据实际需求扩展字段提取、数据清洗、可视化分析等功能。

点赞
收藏
评论区
推荐文章
深度解析Python爬虫中的隧道HTTP技术
前言网络爬虫在数据采集和信息搜索中扮演着重要的角色,然而,随着网站反爬虫的不断升级,爬虫机制程序面临着越来越多的挑战。隧道HTTP技术作为应对反爬虫机制的重要性手段,为爬虫程序提供了更为灵活和隐蔽的数据采集方式。本文将探讨Python爬虫中的隧道HTTP技
Python爬虫:爱奇艺榜单数据的实时监控
实时监控榜单数据对于内容推荐、市场分析和用户行为研究至关重要。本文将介绍如何使用Python编写爬虫程序,以实时监控爱奇艺榜单数据,并提供相应的代码实现过程,包括如何在代码中添加代理信息以应对反爬虫机制。爬虫技术概述爬虫(WebCrawler),也称为网络
小白学大数据 小白学大数据
9个月前
Scrapy结合Selenium实现滚动翻页数据采集
引言在当今的互联网数据采集领域,许多网站采用动态加载技术(如AJAX、无限滚动)来优化用户体验。传统的基于Requests或Scrapy的爬虫难以直接获取动态渲染的数据,而Selenium可以模拟浏览器行为,实现滚动翻页和动态内容加载。本文将介绍如何结合S
小白学大数据 小白学大数据
8个月前
Python爬虫中time.sleep()与动态加载的配合使用
一、动态加载网页的挑战动态加载网页是指网页的内容并非一次性加载完成,而是通过JavaScript等技术在用户交互或页面加载过程中逐步加载。这种设计虽然提升了用户体验,但对于爬虫来说,却增加了抓取的难度。传统的爬虫方法,如简单的HTTP请求,往往只能获取到网
小白学大数据 小白学大数据
7个月前
动态网页爬取:Python如何获取JS加载的数据?
在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段。许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取方法难以奏效。然而,对于数据分析师、研究人员以及开发者来说,获取这些动态加载的数据仍然是一个重要的需求。本文
小白学大数据 小白学大数据
5个月前
大数据岗位技能需求挖掘:Python爬虫与NLP技术结合
1.引言随着大数据技术的快速发展,企业对大数据人才的需求日益增长。了解当前市场对大数据岗位的技能要求,可以帮助求职者精准提升技能,也能为企业招聘提供数据支持。本文介绍如何利用Python爬虫从招聘网站(如拉勾网、智联招聘)抓取大数据相关岗位信息,并采用自然
小白学大数据 小白学大数据
4个月前
应对反爬:使用Selenium模拟浏览器抓取12306动态旅游产品
在当今数据驱动的时代,网络爬虫已成为获取互联网信息的重要手段。然而,许多网站如12306都实施了严格的反爬虫机制,特别是对于动态加载的内容。本文将详细介绍如何使用Selenium模拟真实浏览器行为,有效绕过这些限制,成功抓取12306旅游产品数据。1230
小白学大数据 小白学大数据
1个月前
拼多多数据抓取:Python 爬虫中的 JS 逆向基础案例分析
一、拼多多反爬虫机制与JS逆向的必要性拼多多的前端页面数据加载并非传统的服务端渲染,而是大量采用异步请求(AJAX)加载数据。这些异步请求的参数(如sign、token等)往往经过JavaScript加密处理,直接通过Python的requests库发送请
小白学大数据 小白学大数据
2小时前
使用 Selenium 爬取京东手机销量与评分数据
在电商数据分析场景中,京东作为头部电商平台,其手机品类的销量、评分数据是洞察市场趋势、分析用户偏好的核心依据。相较于静态网页爬取,京东采用动态渲染技术加载商品数据,传统的RequestsBeautifulSoup组合难以获取完整信息,而Selenium凭
小白学大数据
小白学大数据
Lv1
男 · 亿牛云 · python技术
宁为代码类弯腰,不为bug点提交!
文章
133
粉丝
5
获赞
18