如何用Python抓取网站中的Blob URL并获取对应CSV文件?
抓取Blob URL中CSV内容的解决方案
问题原因
- 静态HTML中不存在Blob链接:
requests获取的是服务器返回的原始静态HTML,而Blob URL是页面加载完成后由前端JavaScript动态生成的,因此BeautifulSoup无法在静态源码中找到该链接。 - Blob URL无法直接请求:
blob:是浏览器内部协议,仅用于引用内存中的二进制数据,并非标准网络请求协议,requests库不支持解析该协议,直接请求必然报错。
解决方法
方法一:用无头浏览器模拟执行JS(直观易实现)
通过Playwright或Selenium模拟浏览器加载页面,等待JavaScript执行完成后获取CSV内容。以下是Playwright的实现示例:
- 先安装依赖:
pip install playwright playwright install chromium
- 代码实现:
from playwright.sync_api import sync_playwright import pandas as pd import io with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://worldpopulationreview.com/country-rankings/exports-by-country") # 等待下载按钮加载完成,触发下载并监听 page.wait_for_selector('a[download="csvData.csv"]') with page.expect_download() as download_info: page.click('a[download="csvData.csv"]') download = download_info.value # 读取下载的CSV内容并转为DataFrame csv_content = download.read().decode('utf-8') df = pd.read_csv(io.StringIO(csv_content)) print(df.head()) browser.close()
方法二:直接请求数据源API(高效推荐)
通过浏览器抓包找到生成CSV的原始API接口,直接请求接口获取数据,无需模拟浏览器:
抓包步骤:
- 打开浏览器开发者工具(F12),切换到「Network」标签;
- 点击页面的下载CSV按钮,观察新增的网络请求,找到返回CSV/JSON数据的接口;
- 复制接口URL及必要的请求头(如
User-Agent、Referer)。
代码实现(示例,需替换为实际抓包的API地址):
import requests import pandas as pd import io # 替换为实际抓包得到的API接口URL api_url = "https://api.worldpopulationreview.com/v1/countries/exports" 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", "Referer": "https://worldpopulationreview.com/country-rankings/exports-by-country" } response = requests.get(api_url, headers=headers) # 若接口返回JSON,转为DataFrame处理 data = response.json() df = pd.DataFrame(data) print(df.head()) # 保存为CSV文件 df.to_csv("exports.csv", index=False)
内容的提问来源于stack exchange,提问作者Riku
相关产品推荐
相关产品推荐

