动态网页爬取遇错:请求返回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
相关产品推荐
相关产品推荐

