
当使用beautifulsoup等库直接解析网页内容时,如果目标元素为空,通常是因为其内容通过javascript动态加载。本教程将指导您如何利用浏览器开发者工具识别并直接请求这些动态数据背后的xhr(xmlhttprequest)接口,从而绕过前端渲染,高效地抓取所需信息,特别是针对json格式的动态内容。
在现代网页开发中,为了提升用户体验,许多网站采用JavaScript来动态加载内容。这意味着当您通过requests库获取网页的初始HTML时,某些区域(例如列表、评论、搜索结果等)可能还是空的占位符。只有当浏览器执行了页面上的JavaScript代码后,这些内容才会通过AJAX(异步JavaScript和XML)请求从服务器获取并填充到页面中。
对于爬虫而言,直接使用BeautifulSoup解析初始HTML将无法获取到这些动态加载的内容。正如问题中所示,即使目标ul标签存在,其内部的li元素也可能为空,因为它们尚未被JavaScript注入。
解决这类问题的关键在于找到数据实际的来源。浏览器开发者工具是您的最佳盟友。以下是识别动态数据源的步骤:
通过分析,我们可以发现本例中成员列表的数据并非直接嵌入在初始HTML中,而是通过一个POST请求到https://www.parliament.lk/members-of-parliament/directory-of-members/index2.php?option=com_members&task=all&tmpl=component&letter={letter}&wordfilter=&search_district=获取的。这个接口接收一个letter参数,用于按字母筛选成员。
立即学习“Python免费学习笔记(深入)”;
一旦确定了动态数据源的URL、请求方法和所需参数,我们就可以使用requests库直接向该接口发送请求,获取原始数据。
以下Python代码演示了如何通过直接请求XHR接口来获取斯里兰卡议会成员的列表:
import requests
import string
import json # 导入json模块以处理JSON数据
def scrape_parliament_members():
"""
通过直接请求XHR接口,抓取斯里兰卡议会成员信息。
"""
all_members_data = []
# 遍历所有大写字母,模拟页面按字母筛选的功能
for letter in string.ascii_uppercase:
print(f"Fetching members for letter: {letter}")
# 构建请求的URL和参数
# 注意:这里是一个POST请求,且URL中包含部分参数,其他参数可能通过data字段发送
# 实际情况请根据开发者工具中观察到的请求详情进行调整
api_url = f'https://www.parliament.lk/members-of-parliament/directory-of-members/index2.php?option=com_members&task=all&tmpl=component&letter={letter}&wordfilter=&search_district='
try:
# 发送POST请求
# 如果API需要特定的headers,如User-Agent,可以在这里添加
response = requests.post(api_url)
response.raise_for_status() # 检查HTTP请求是否成功 (200 OK)
# 解析JSON响应
members_json = response.json()
# 遍历JSON中的每个成员数据
for member_info in members_json:
# 提取所需信息,并构建成员字典
member_detail = {
'url': f"https://www.parliament.lk/en/members-of-parliament/directory-of-members/viewMember/{member_info.get('mem_intranet_id')}",
'id': member_info.get('mem_intranet_id'),
'name': member_info.get('member_sname_eng')
}
all_members_data.append(member_detail)
except requests.exceptions.RequestException as e:
print(f"Error fetching data for letter {letter}: {e}")
except json.JSONDecodeError as e:
print(f"Error decoding JSON for letter {letter}: {e}")
print(f"Response content: {response.text[:200]}...") # 打印部分响应内容帮助调试
return all_members_data
# 执行抓取
members = scrape_parliament_members()
# 打印前5个成员数据作为示例
if members:
print("\nSuccessfully scraped members. First 5 entries:")
for i, member in enumerate(members[:5]):
print(member)
else:
print("\nNo member data was scraped.")
# 您也可以将数据保存到文件,例如CSV或JSON
# import pandas as pd
# df = pd.DataFrame(members)
# df.to_csv('parliament_members.csv', index=False, encoding='utf-8-sig')
# with open('parliament_members.json', 'w', encoding='utf-8') as f:
# json.dump(members, f, ensure_ascii=False, indent=4)通过直接识别和调用XHR接口,您可以有效地绕过JavaScript动态加载带来的障碍,直接获取到结构化的数据,从而大大提高爬取效率和成功率。这种方法对于处理大多数现代网站的动态内容都是一个非常强大的技巧。
以上就是Python爬取动态加载内容的技巧:识别并处理XHR请求的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号