Python网页抓取问题:Bitbox资产列表抓取返回空字典求排查
问题分析与解决方案
核心问题
- 定位逻辑错误:你用全局
soup.find()仅获取第一个匹配元素,且依赖不稳定的style属性定位,同时未在目标表格容器内查找,无法批量抓取所有资产。 - 未遍历表格行:目标资产按
coin-row行结构组织,你没有遍历所有行,仅抓取了单个(甚至非表格内的)元素。 - 潜在动态加载问题:如果
requests返回的HTML不含表格内容,说明网站通过JavaScript动态渲染数据,静态请求无法获取完整内容。
修正后的代码(静态抓取场景)
若网站返回的HTML包含完整表格内容,用以下代码批量抓取所有资产:
import requests from bs4 import BeautifulSoup from urllib.parse import urlencode import pandas as pd API_KEY = '7bbcbb39-029f-4075-97bc-6b57b6e9e68b' def get_scrapeops_url(url): payload = {'api_key': API_KEY, 'url': url} proxy_url = 'https://proxy.scrapeops.io/v1/?' + urlencode(payload) return proxy_url # 发送请求并检查状态 r = requests.get(get_scrapeops_url('https://bitbox.swiss/coins/')) r.raise_for_status() response = r.text data = [] soup = BeautifulSoup(response, 'html.parser') # 定位表格容器 coins_table = soup.find('div', class_='coins-table') if coins_table: # 遍历所有资产行 coin_rows = coins_table.find_all('div', class_='coin-row') for row in coin_rows: # 基于稳定class定位资产名称和交易代码 coin_name_container = row.find('div', class_='coin-name') if coin_name_container: name_elem = coin_name_container.find('strong') ticker_elem = coin_name_container.find('span') name = name_elem.text.strip() if name_elem else None # 去除交易代码前后的括号 ticker = ticker_elem.text.strip().strip('()') if ticker_elem else None data.append({'name': name, 'ticker': ticker}) # 保存为CSV data_df = pd.DataFrame(data) data_df.to_csv("coins_scrape.csv", index=False) print(data_df)
动态加载场景处理(静态请求无数据时)
若上述代码返回空数据,说明网站通过JavaScript加载资产:
- 打开浏览器开发者工具(F12)→ 网络标签,刷新页面。
- 查找XHR/fetch请求,找到返回资产列表的API接口(如
/api/coins类地址)。 - 直接请求API获取JSON数据:
import requests import pandas as pd API_KEY = '7bbcbb39-029f-4075-97bc-6b57b6e9e68b' def get_scrapeops_url(url): payload = {'api_key': API_KEY, 'url': url} proxy_url = 'https://proxy.scrapeops.io/v1/?' + urlencode(payload) return proxy_url # 替换为实际找到的API地址 api_url = 'https://bitbox.swiss/api/coins' r = requests.get(get_scrapeops_url(api_url)) r.raise_for_status() coins_data = r.json() # 提取name和ticker(根据API返回结构调整) data = [{'name': item['name'], 'ticker': item['ticker']} for item in coins_data] data_df = pd.DataFrame(data) data_df.to_csv("coins_scrape.csv", index=False) print(data_df)
关键优化点
- 用稳定的class属性替代
style定位,避免网站样式修改导致抓取失效。 - 在表格容器内遍历所有行,实现批量抓取。
- 添加
r.raise_for_status()快速排查请求错误。
内容的提问来源于stack exchange,提问作者Zer0chance_
相关产品推荐
相关产品推荐

