使用BeautifulSoup+Python爬取网页时无法获取正确结果计数问题
解决KAP网站结果计数爬取问题
问题原因
你拿到的{{memberVm.disclosures.length}}是前端模板占位符,说明这个页面的内容是JavaScript动态渲染的。requests库只能获取服务器返回的静态HTML,无法执行页面中的JS代码,所以拿不到实际渲染后的数字。
解决方案
有两种可行的方法获取真实结果计数:
方法1:使用Selenium模拟浏览器加载JS
Selenium可以模拟真实浏览器打开页面,等待JS渲染完成后再提取内容,步骤如下:
- 安装Selenium:
pip install selenium,同时下载对应浏览器的驱动(比如ChromeDriver) - 使用以下代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC URL = 'https://www.kap.org.tr/tr/bildirim-sorgu?srcbar=Y&cmp=Y&cat=4&s=srp2205201503&st=Yeni%20%C4%B0%C5%9F%20%C4%B0li%C5%9Fkisi&kw=yeni%20i%C5%9F%20ili%C5%9Fkisi&slf=ALL' # 配置Chrome无头模式(可选,不打开浏览器窗口) options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument("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") driver = webdriver.Chrome(options=options) driver.get(URL) # 等待计数元素加载完成,最多等待10秒 wait = WebDriverWait(driver, 10) count_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[style="font-weight : bold; "]'))) number_of_notifications = count_element.text print(number_of_notifications) driver.quit()
方法2:直接调用网站的API接口(更高效)
通过浏览器开发者工具抓包,可以找到页面加载数据的API接口,直接请求该接口获取原始数据,无需渲染页面:
- 打开目标页面,按F12打开开发者工具,切换到「网络」标签
- 刷新页面,筛选XHR/fetch请求,找到返回披露数据的接口(通常包含
disclosures关键词) - 复制接口URL和请求参数,用
requests直接请求:
import requests # 替换为抓包得到的真实API地址 API_URL = 'https://www.kap.org.tr/api/v1/disclosures' params = { 'srcbar': 'Y', 'cmp': 'Y', 'cat': '4', 's': 'srp2205201503', 'st': 'Yeni İş İlişkisi', 'kw': 'yeni iş ilişkisi', 'slf': 'ALL' } headers = { "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", "X-Requested-With": "XMLHttpRequest" } response = requests.get(API_URL, headers=headers, params=params) response.raise_for_status() # 检查请求是否成功 data = response.json() # 从返回的JSON中提取计数,示例假设数据在disclosures数组中 count = len(data['disclosures']) print(f"{count} bildirim bulundu.")
注意事项
- API接口可能会随网站更新变化,需要定期验证接口有效性
- 确保请求头和浏览器一致,避免被网站拦截
- 遵守KAP网站的使用条款,不要过度频繁请求
内容的提问来源于stack exchange,提问作者Kaan Akdik
相关产品推荐
相关产品推荐

