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

如何用Python、Selenium及BeautifulSoup抓取NGO弹窗页面数据?

解决弹窗NGO数据抓取的方案

你已经成功提取到NGO的ID,这步做得相当到位!之前用Selenium没成功也没关系,我们直接模拟后台的AJAX请求就能拿到弹窗里的数据,不用再依赖浏览器了。下面是具体的修改步骤和代码:

步骤1:确认后台请求接口

当你点击show_ngo_info(161456)时,浏览器会发送一个AJAX请求到后台获取弹窗内容。通过分析该网站的网络请求,这个接口通常是http://ngodarpan.gov.in/index.php/home/get_ngo_details(你可以自己用浏览器DevTools的Network标签验证:点击弹窗时,看新增的POST请求地址,若有差异替换成实际地址即可)。

步骤2:构造POST请求

我们需要用requests.Session()保持会话,因为网站依赖Cookie验证身份。然后把提取到的NGO ID作为核心参数发送POST请求。

修改后的完整代码

import requests
from bs4 import BeautifulSoup
import re

# 初始化会话,自动保持Cookie
session = requests.Session()

# 先访问主页面,获取必要的Cookie和页面上下文
main_url = "http://ngodarpan.gov.in/index.php/home/statewise_ngo/31/35/1"
html = session.get(main_url)
soup = BeautifulSoup(html.text, 'lxml')

first_div = soup.find('div', class_="ibox-content")
get_tr = first_div.find_all('a', onclick=True)

# 弹窗数据的接口地址(若验证后不是这个,替换成实际请求URL)
ngo_api_url = "http://ngodarpan.gov.in/index.php/home/get_ngo_details"

for ngoinfo in get_tr:
    try:
        if re.match('show_ngo_info', ngoinfo['onclick']):
            # 提取NGO的数字ID
            k = ngoinfo['onclick']
            ngo_id = re.sub("\D", "", k)
            print(f"正在抓取NGO ID: {ngo_id}的数据...")
            
            # 构造POST请求参数
            payload = {
                'id': ngo_id
                # 如果网站有CSRF验证,需从主页面提取csrf_token并添加到这里
            }
            
            # 模拟AJAX请求的必要Headers
            headers = {
                'Referer': main_url,
                'X-Requested-With': 'XMLHttpRequest',
                'Content-Type': 'application/x-www-form-urlencoded',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
            }
            
            # 发送POST请求
            response = session.post(ngo_api_url, data=payload, headers=headers)
            
            # 解析返回的弹窗内容(假设返回的是HTML结构)
            popup_soup = BeautifulSoup(response.text, 'lxml')
            
            # 根据弹窗实际HTML结构提取信息,示例如下
            ngo_name = popup_soup.find('h4').text.strip() if popup_soup.find('h4') else "未获取到名称"
            ngo_address = popup_soup.find('div', class_='address').text.strip() if popup_soup.find('div', class_='address') else "未获取到地址"
            
            print(f"NGO名称: {ngo_name}")
            print(f"NGO地址: {ngo_address}")
            print("---")
            
    except Exception as e:
        print(f"处理NGO ID {ngo_id}时出错: {str(e)}")
        continue

关键注意事项

  • 接口地址验证:打开浏览器F12进入Network标签,点击NGO名称后,找到新出现的POST请求,把它的URL替换到代码中的ngo_api_url。
  • CSRF Token处理:如果请求被拒绝,检查主页面的HTML,找到类似<input type="hidden" name="csrf_token" value="xxx">的字段,将'csrf_token': 'xxx'添加到payload中。
  • Headers适配:如果请求失败,对照浏览器发送的Headers,补充必要字段(比如Accept、Accept-Language等)。
  • 异常捕获:代码中加入了异常处理,避免单个NGO处理失败导致整个程序中断。

这样修改后,你就能直接通过POST请求高效获取每个NGO的弹窗数据,比用Selenium更稳定快捷!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:40:22