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

使用BeautifulSoup爬取网站无法获取全部条目问题求助

解决Runelite Plugin Hub爬取插件数量不全的问题

问题分析

你遇到的核心问题是静态HTML爬取无法获取动态加载的内容。Runelite插件Hub的部分插件是通过滚动触发AJAX异步加载的,BeautifulSoup只能解析初始请求返回的HTML,无法抓取后续动态渲染的内容——这就是为什么加time.sleep()没用,它只等待初始页面加载,不会触发滚动加载逻辑。

解决方案

1. 用浏览器自动化工具抓取(最可靠)

使用Selenium模拟浏览器行为,滚动页面触发所有插件加载,再提取内容:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 初始化浏览器
driver = webdriver.Chrome()
driver.get("https://runelite.net/plugin-hub")

# 循环滚动到底部,直到没有新内容加载
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(1)  # 等待加载
    current_scroll_height = driver.execute_script("return document.body.scrollHeight")
    if current_scroll_height == last_scroll_height:
        break
    last_scroll_height = current_scroll_height

# 提取所有插件名称
plugin_elements = driver.find_elements(By.CSS_SELECTOR, ".plugin-name")
plugin_names = [elem.text.strip() for elem in plugin_elements if elem.text.strip()]

# 验证结果
print(f"抓取到的插件总数: {len(plugin_names)}")
print("是否包含Spirit Tree Map:", "Spirit Tree Map" in plugin_names)

driver.quit()

2. 直接调用官方API(最高效)

打开浏览器开发者工具的Network面板,刷新页面后筛选XHR请求,能找到网站公开的插件数据接口,直接请求即可拿到完整列表,无需爬页面:

import requests

response = requests.get("https://runelite.net/plugin-hub/data/plugins.json")
plugin_data = response.json()

# 提取插件名称
plugin_names = [item["name"] for item in plugin_data]

print(f"API返回的插件总数: {len(plugin_names)}")
print("是否包含Spirit Tree Map:", "Spirit Tree Map" in plugin_names)

3. 优化静态请求(仅针对反爬导致的不全)

如果是网站反爬机制限制了初始请求内容,可添加浏览器请求头模拟正常访问:

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

response = requests.get("https://runelite.net/plugin-hub", headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

plugin_names = [elem.text.strip() for elem in soup.select(".plugin-name") if elem.text.strip()]
print(f"静态抓取的插件总数: {len(plugin_names)}")

注意:此方法无法解决动态加载问题,仅适用于反爬导致的内容缺失。

关键说明

time.sleep()无效的核心原因:它只是等待初始页面加载完成,但不会触发页面的滚动加载逻辑——缺失的插件需要用户滚动页面时才会通过AJAX请求加载,静态爬虫无法触发该行为,必须用浏览器自动化工具或直接调用API。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:20:15