使用BeautifulSoup爬取Minecraft dynmap仅输出DIV标签名,如何获取完整HTML
问题解决:爬取Minecraft Dynmap页面无法获取完整内容
问题原因
你当前使用的requests库只能获取服务端返回的初始静态HTML内容,而Dynmap的地图元素、玩家信息等所有核心数据,都是页面加载后由JavaScript异步请求后端接口、再动态渲染到页面中的,初始静态HTML里id为mcmap的div本身就是空容器,所以你只能拿到标签本身,拿不到内部渲染后的内容。
解决方法
方法1:使用无头浏览器获取渲染后的完整HTML(适合需要完整页面内容的场景)
用Selenium这类工具模拟浏览器运行,等待页面JS执行完成、内容全部渲染后再提取HTML,示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time URL = "http://play.fantasycraftmc.eu:25570/?worldname=kingdom&mapname=flat&zoom=0&x=3904&y=64&z=2176#/" # 配置无头模式,不弹出浏览器窗口 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") driver = webdriver.Chrome(options=chrome_options) driver.get(URL) # 等待3秒让页面完全加载,也可以用显式等待判断元素加载完成进一步提升效率 time.sleep(3) # 获取渲染后的完整页面HTML full_html = driver.page_source soup = BeautifulSoup(full_html, "html.parser") div = soup.find(id="mcmap") print(div) driver.quit()
使用前需要先安装依赖:pip install selenium beautifulsoup4
方法2:直接调用Dynmap公开接口获取玩家数据(更高效,推荐)
不需要爬取页面解析HTML,Dynmap本身有公开的JSON接口返回实时玩家信息,你可以在浏览器F12控制台的「网络」选项卡中过滤XHR请求,找到返回玩家列表的接口直接请求即可,不需要渲染页面,速度更快、数据解析更简单。多数Dynmap的玩家数据接口格式为http://dynmap地址/up/world/{世界名}/,返回的JSON中直接包含players字段,可直接提取信息。
内容的提问来源于stack exchange,提问作者Chappies Wereld
相关产品推荐
相关产品推荐

