You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python网页爬取遇“Show More”按钮加载问题求助

解决Pole Emploi“Show More”按钮的爬取问题

嘿,我来帮你搞定这个动态加载内容的爬取难题!你遇到的这种点击“Show More”才加载更多数据的情况,本质是网站通过AJAX POST请求异步获取后续内容,咱们一步步来解决:

第一步:分析浏览器的网络请求

首先得搞清楚点击“Show More”时,浏览器到底给服务器发了什么请求:

  • 打开浏览器的开发者工具(按F12),切换到「Network」标签页
  • 勾选「Preserve Log」(避免请求被清空),然后点击网页上的“Show More”按钮
  • 在网络请求列表里,找类型为「XHR」或「Fetch」的POST请求(通常就是加载更多数据的接口)
  • 点击这个请求,查看「Headers」里的请求URL、「Form Data」(或「Payload」)里的参数,还有「Request Headers」里的必要字段(比如User-Agent、Referer、Cookie)

你会发现参数里大概率包含分页相关的字段,比如page(当前页码)、taillePage(每页条数,这里应该是10),还有你搜索时的关键词、筛选条件等,这些参数必须原封不动地带到你的POST请求里。

第二步:用Python模拟POST请求

知道了请求细节后,就可以用requests库来模拟了,这里给你结合现有代码的示例:

1. 初始化会话(保持Cookie)

因为网站需要验证会话状态,最好用requests.Session()来维持会话:

import requests
import time

# 初始化会话
session = requests.Session()

# 先访问初始搜索页,获取必要的Cookie和会话信息
initial_url = 'https://candidat.pole-emploi.fr/offres/recherche?mot...'  # 替换成你的初始搜索URL
session.get(initial_url)

2. 设置请求头和参数

从开发者工具里复制必要的请求头和POST参数:

# 请求头,尽量和浏览器一致,避免被拦截
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': initial_url,
    'X-Requested-With': 'XMLHttpRequest',  # 标记这是AJAX请求,很多网站会校验这个
    # 其他必要的头信息(比如Cookie)可以从开发者工具里复制
}

# POST请求的参数,从Form Data里复制,注意分页字段
post_data = {
    'motCle': '你的搜索关键词',
    'page': 2,  # 第二页,对应第一次点击Show More的内容
    'taillePage': 10,
    # 其他筛选参数,比如所在地区、行业等,全部从浏览器里复制过来
}

3. 发送POST请求并解析数据

# 替换成你从开发者工具找到的POST接口URL
post_url = 'https://candidat.pole-emploi.fr/offres/recherche/resultats'

response = session.post(post_url, headers=headers, data=post_data)

# 通常返回的是JSON格式数据,解析它
if response.status_code == 200:
    job_results = response.json()
    # 提取职位列表,具体字段要看返回的JSON结构,比如:
    jobs = job_results.get('resultats', [])
    for job in jobs:
        print(job['intitule'])  # 打印职位标题,根据实际字段调整
else:
    print(f"请求失败,状态码:{response.status_code}")

4. 循环爬取所有分页

如果要爬取所有数据,可以循环递增page参数,直到返回的结果为空:

page = 1
while True:
    post_data['page'] = page
    response = session.post(post_url, headers=headers, data=post_data)
    
    if response.status_code != 200:
        print(f"第{page}页请求失败,状态码:{response.status_code}")
        break
        
    job_results = response.json()
    jobs = job_results.get('resultats', [])
    
    if not jobs:
        print("已爬取所有数据,结束循环")
        break  # 没有更多数据了,退出循环
        
    # 处理当前页的数据
    print(f"正在处理第{page}页,共{len(jobs)}条数据")
    for job in jobs:
        # 这里可以添加保存数据的逻辑,比如写入CSV或数据库
        print(f"职位:{job['intitule']},链接:{job['url']}")
    
    page += 1
    time.sleep(1)  # 加个延迟,避免请求太频繁被封

注意事项

  • 严格遵守网站的使用条款,不要短时间内发送大量请求,避免被封禁IP
  • 参数要和浏览器里的完全一致,包括参数名、编码,不要漏填任何字段
  • 如果遇到反爬验证(比如验证码),可能需要额外处理,但Pole Emploi的公开职位接口一般不会太严格

内容的提问来源于stack exchange,提问作者Rémi Heitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:05