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

