Python BeautifulSoup爬取点击搜索后加载的丹麦政党新闻
解决方案:爬取Dansk Folkeparti动态加载的新闻内容
你的问题核心是页面新闻内容通过JavaScript异步加载,直接用requests获取的初始HTML不包含目标数据,必须模拟触发加载的行为。以下两种方法可以解决:
方法1:直接调用AJAX接口(推荐,高效)
点击搜索按钮后,浏览器会向网站后端接口发送异步请求获取新闻数据。通过浏览器开发者工具(Network面板→XHR)可抓到该接口,直接用requests请求即可:
import requests import pandas as pd # 目标AJAX接口 api_url = "https://danskfolkeparti.dk/wp-admin/admin-ajax.php" # 请求头,模拟浏览器并标记为异步请求 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", "X-Requested-With": "XMLHttpRequest" } # 搜索参数,空值对应默认搜索结果 payload = { "action": "df_search_timeline", "search_query": "", "category": "", "period": "" } # 发送POST请求获取JSON数据 response = requests.post(api_url, headers=headers, data=payload) news_json = response.json() # 解析并整理数据 news_list = [] for post in news_json["posts"]: news_list.append({ "标题": post["title"], "日期": post["date"], "URL": post["url"] }) # 转为DataFrame df = pd.DataFrame(news_list) print(df.head())
方法2:用Selenium模拟浏览器操作(直观,适合复杂场景)
如果不想分析接口,可以用Selenium模拟打开浏览器、点击搜索按钮、等待内容加载,再解析页面:
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 import pandas as pd from bs4 import BeautifulSoup # 初始化浏览器(需提前安装对应浏览器的驱动,如ChromeDriver) driver = webdriver.Chrome() driver.get("https://danskfolkeparti.dk/nyheder/") # 等待搜索按钮可点击并点击 search_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "button.search-button")) ) search_btn.click() # 等待新闻内容加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "timeline")) ) # 获取加载后的页面HTML并解析 soup = BeautifulSoup(driver.page_source, "html.parser") driver.quit() # 提取新闻数据 news_list = [] for item in soup.find_all("div", class_="timeline-item"): title = item.find("h3").get_text(strip=True) date = item.find("div", class_="timeline-date").get_text(strip=True) url = item.find("a")["href"] news_list.append({ "标题": title, "日期": date, "URL": url }) df = pd.DataFrame(news_list) print(df.head())
两种方法对比
- AJAX接口法:无需浏览器,请求速度快,资源占用低,适合批量爬取;需要简单分析接口参数。
- Selenium法:模拟真实浏览器行为,无需分析接口,适合动态渲染逻辑复杂的页面;但速度慢,需要安装浏览器驱动。
内容的提问来源于stack exchange,提问作者zach dickson
相关产品推荐
相关产品推荐

