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

动态网页爬取遇错:请求返回503/404,需获取演讲相关数据

解决滚动加载内容的请求失败问题

问题根源分析

你的请求返回503/404主要有几个核心原因:

  • 未模拟浏览器请求头,被服务器基础反爬机制拦截
  • payload提交格式错误(WordPress的admin-ajax.php接口默认接受application/x-www-form-urlencoded格式,而非JSON)
  • 缺少WordPress AJAX请求必需的标识头

修改后的可运行代码示例

import requests
from bs4 import BeautifulSoup

# 目标页面基础URL
base_url = "https://www.pmindia.gov.in/en/tag/pmspeech/"

# 初始化会话,维持请求上下文(如Cookie)
session = requests.Session()

# 构造浏览器级请求头,绕过反爬拦截
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": base_url,
    "X-Requested-With": "XMLHttpRequest"  # WordPress AJAX接口必需的标识头
}

# 先访问一次原页面,建立合法会话上下文
session.get(base_url, headers=headers)

# 构造滚动加载的请求参数
payload = {
    'action': 'infinite_scroll_speeches',
    'page_no': '2',
    'tag': 'pmspeech',
    'loop_file': '10',
    'language': 'en'
}

ajax_url = "https://www.pmindia.gov.in/wp-admin/admin-ajax.php"
# 用data参数提交表单格式的payload,而非json
response = session.post(ajax_url, data=payload, headers=headers, verify=False)

# 处理响应并提取数据
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    # 定位演讲条目容器
    speech_items = soup.find_all('div', class_='speech-box')
    speech_table = []
    
    for item in speech_items:
        title = item.find('h3').get_text(strip=True)
        link = item.find('a')['href']
        date = item.find('span', class_='date').get_text(strip=True)
        speech_table.append({
            '标题': title,
            '链接': link,
            '日期': date
        })
    
    # 输出提取结果(可自行改为保存为CSV/Excel表格)
    for idx, speech in enumerate(speech_table, 1):
        print(f"第{idx}条演讲:")
        print(f"标题: {speech['标题']}")
        print(f"链接: {speech['链接']}")
        print(f"日期: {speech['日期']}\n")
else:
    print(f"请求失败,状态码: {response.status_code}")

关键修改点说明

  • 使用requests.Session()维持会话,保留首次访问的Cookie,避免被服务器判定为异常请求
  • 添加完整浏览器请求头,尤其是X-Requested-With,让服务器识别为合法AJAX请求
  • 将json=payload改为data=payload,匹配接口要求的参数提交格式
  • 集成BeautifulSoup提取逻辑,直接获取你需要的标题、链接、日期数据

注意事项

  • 不要高频发送请求,建议添加time.sleep(2)等延时,避免触发服务器反爬限制
  • verify=False仅用于临时跳过SSL验证,生产环境建议移除该参数并确保证书正常

内容的提问来源于stack exchange,提问作者bavagliladri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:50:25