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

