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
相关产品推荐
相关产品推荐

