使用BeautifulSoup爬取Sydbank利率遇阻:数据存于JavaScript求方案
动态渲染页面利率数据爬取方案
直接提取页面JS中的数据
打开网页源码,搜索currency、rate这类和利率相关的关键词,定位存储数据的JS变量(通常是JSON格式)。用正则表达式把变量内容提取出来,再转成JSON解析就行。
示例代码:import requests import re import json url = "https://www.sydbank.dk/omsydbank/priser/rente" resp = requests.get(url) # 这里的正则要根据实际找到的JS变量名调整,比如假设变量是window.rateData data_match = re.search(r'window\.rateData\s*=\s*(.*?);', resp.text) if data_match: rate_data = json.loads(data_match.group(1)) # 从rate_data里提取各币种利率用浏览器自动化工具渲染页面
用Selenium模拟浏览器加载页面,等JS把数据渲染出来后再抓取内容。这种方法能应对绝大多数动态渲染场景,就是速度比直接抓接口慢一点。
示例代码:from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup # 初始化浏览器驱动,需提前下载对应浏览器的驱动文件 driver = webdriver.Chrome() driver.get("https://www.sydbank.dk/omsydbank/priser/rente") # 等待利率表格加载完成,超时时间10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table")) ) # 获取渲染后的页面源码,用BeautifulSoup解析 soup = BeautifulSoup(driver.page_source, "html.parser") # 提取表格里的币种和利率数据 driver.quit()抓包找数据接口
这是最高效的方法:打开浏览器F12开发者工具,切换到「Network」标签,刷新页面,找XHR/Fetch类型的请求,查看响应内容,定位返回利率数据的API接口。之后直接用requests请求这个接口,就能拿到结构化的JSON数据,不需要处理页面渲染。注意请求时可能需要带上原页面的请求头(比如User-Agent、Referer),避免被拦截。
内容的提问来源于stack exchange,提问作者A.500
相关产品推荐
相关产品推荐

