You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python网页抓取问题:Bitbox资产列表抓取返回空字典求排查

问题分析与解决方案

核心问题

  1. 定位逻辑错误:你用全局soup.find()仅获取第一个匹配元素,且依赖不稳定的style属性定位,同时未在目标表格容器内查找,无法批量抓取所有资产。
  2. 未遍历表格行:目标资产按coin-row行结构组织,你没有遍历所有行,仅抓取了单个(甚至非表格内的)元素。
  3. 潜在动态加载问题:如果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加载资产:

  1. 打开浏览器开发者工具(F12)→ 网络标签,刷新页面。
  2. 查找XHR/fetch请求,找到返回资产列表的API接口(如/api/coins类地址)。
  3. 直接请求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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:00:00