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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:55:19