为什么使用Python+BeautifulSoup无法抓取该ArcGIS站点的超链接URL
问题原因
- 你原有代码里的
headers变量没有提前定义,直接运行会先触发变量未定义的报错 - 最核心的问题是你要爬取的网站属于前端动态渲染站点,所有文件链接都是页面加载完成后通过JavaScript异步请求接口渲染生成的。你直接用
requests请求拿到的是未经过JS渲染的初始HTML源码,里面根本不存在你要的<a>标签,所以就算补全请求头也抓不到目标结果。
解决方法
有两种常用方案可以解决这个问题:
方案1:使用Selenium模拟浏览器渲染(简单易实现)
这种方案直接模拟真实浏览器加载页面,等页面全部渲染完成后再提取元素,不需要手动找接口。
依赖安装
你需要先安装对应的依赖库:
pip install selenium webdriver-manager
完整代码示例
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time url = "https://riwayat-file-covid-19-dki-jakarta-jakartagis.hub.arcgis.com/" # 自动配置Chrome驱动初始化浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) # 等待页面完全加载,可根据自身网络情况调整等待时长 time.sleep(3) # 获取渲染完成后的完整页面源码 soup = BeautifulSoup(driver.page_source, 'html.parser') # 关闭浏览器 driver.quit() links = soup.find_all('a') for link in links: if "href" in link.attrs: print(link.attrs['href'] + "\n")
方案2:直接调用站点公开接口(运行效率更高)
你可以打开浏览器控制台的「网络」标签,筛选XHR类请求找到站点获取文件列表的官方接口,直接请求接口解析数据即可,不需要启动浏览器渲染页面,运行速度更快资源占用更低。
内容的提问来源于stack exchange,提问作者Chriz
相关产品推荐
相关产品推荐

