【问题标题】:Scrape Highcharts data to CSV file将 Highcharts 数据抓取到 CSV 文件
【发布时间】:2018-06-06 20:56:18
【问题描述】:

我想使用 Python 从CoinMarketCap website 中抓取特定硬币的历史数据。我想要尽可能细化的数据。我认为数据来自以下字符串:

我想使用 BeautifulSoup 来获取这些数据并将其保存到 CSV 文件,但我不知道如何。

【问题讨论】:

  • 看看journalistsresource.org/tip-sheets/research/…,它应该让您了解您需要的东西。
  • 在 Chrome/Firefox 中使用 DevTool(选项卡 Network->XHR)我看到 JavaScript 从 https://graphs.coinmarketcap.com/currencies/verge/ 以 JSON 格式读取一些数据 - 也许这是您需要的。
  • 顺便说一句:如果页面使用 JavaScript 在页面上添加元素(大多数页面都这样做),那么 BeautifulSoup 可能没用,因为 reuqests/BeautifulSoup 无法运行 JavaScript。然后您可能必须使用Selenium 来控制将打开页面并运行 JavaScript 的 Web 浏览器。或者您可以尝试不同的方法:大多数 JavaScript 从某个 url 读取数据,因此您可以尝试使用 DevToool 找到该 url

标签: python highcharts web-scraping beautifulsoup export-to-csv


【解决方案1】:

它似乎使用了使用 url 的 JavaScript

https://graphs.coinmarketcap.com/currencies/verge/1513624444000/1514229244000/

以 JOSN 格式获取数据,以便您可以轻松地将其作为 python 字典获取

编辑: 它在 url 中使用 timestamp*1000 来获取历史数据。它写在csv

import requests
import datetime
import csv

date1 = '2016.01.01'
date2 = '2017.01.01'

date1 = datetime.datetime.strptime(date1, '%Y.%m.%d')
date2 = datetime.datetime.strptime(date2, '%Y.%m.%d')

date1 = int(date1.timestamp() * 1000)
date2 = int(date2.timestamp() * 1000)

print('dates:', date1, date2)
print('-----')

url = 'https://graphs.coinmarketcap.com/currencies/verge/{}/{}/'.format(date1, date2)

response = requests.get(url)
data = response.json()

for key in data.keys():
    print('key:', key)
print('-----')

f = open('output.csv', 'w')
csv_writer = csv.writer(f)

row = ('date', 'price_btc', 'price_usd', 'volume_usd')
csv_writer.writerow(row)

for item1, item2, item3 in zip(data['price_btc'], data['price_usd'], data['volume_usd']): #[:10]:

    date = datetime.datetime.fromtimestamp(item1[0]//1000)
    date = date.strftime('%Y.%m.%d %H:%M:%S')

    print('date:', date)
    print(' btc:', item1[1])
    print(' usd:', item2[1])
    print(' vol:', item3[1])
    print('-----')

    row = (date, item1[1], item3[1], item3[1])
    csv_writer.writerow(row)

f.close()    

部分结果:

dates: 1451602800000 1483225200000
-----
key: market_cap_by_available_supply
key: price_btc
key: price_usd
key: volume_usd
-----
date: 2016.01.01 00:04:19
 btc: 3.00032e-08
 usd: 1.29262e-05
 vol: 548
-----
date: 2016.01.02 00:04:19
 btc: 2.1964e-08
 usd: 9.52678e-06
 vol: 246
-----
date: 2016.01.03 00:04:19
 btc: 2.67174e-08
 usd: 1.15926e-05
 vol: 2805
-----

编辑:循环读取

import requests
import datetime
import csv
import webbrowser


def get_data(name, timestamp1, timestamp2, csv_writer):

    url = 'https://graphs.coinmarketcap.com/currencies/{}/{}/{}/'.format(name, timestamp1, timestamp2)

    response = requests.get(url)

    try:
        data = response.json()
    except Exception:
        with open('output.html', 'w') as f:
            f.write(response.text)
        webbrowser.open('output.html')
        exit()

    for item1, item2, item3 in zip(data['price_btc'], data['price_usd'], data['volume_usd']): #[:10]:

        date = datetime.datetime.fromtimestamp(item1[0]//1000)
        date = date.strftime('%Y.%m.%d %H:%M:%S')

        row = (date, item1[1], item3[1], item3[1])
        csv_writer.writerow(row)


def scrape(name, start_date, finish_date):

    f = open(name + '.csv', 'w')
    csv_writer = csv.writer(f)

    row = ('date', 'price_btc', 'price_usd', 'volume_usd')
    csv_writer.writerow(row)

    one_day = datetime.timedelta(days=1)

    start_date = datetime.datetime.strptime(start_date, '%Y.%m.%d')
    finish_date = datetime.datetime.strptime(finish_date, '%Y.%m.%d')

    date1 = start_date
    date2 = start_date + one_day

    while date1 < finish_date:
        print(name, date1, date2)

        date1_timestamp = int(date1.timestamp() * 1000)
        date2_timestamp = int(date2.timestamp() * 1000)

        get_data(name, date1_timestamp, date2_timestamp, csv_writer)

        date1 = date2
        date2 += one_day

    f.close()    

# --- main ---

scrape('verge', '2016.01.01', '2017.01.01')
scrape('bitcoin', '2016.01.01', '2017.01.01')
scrape('ethereum', '2016.01.01', '2017.01.01')

【讨论】:

  • 非常感谢!你知道我怎么能把它变成 csv 吗?
  • python有模块csv写入CSV或者你可以使用pandas创建DataFrame然后使用to_csv()
  • 另外,我似乎没有得到所有数据(只有一部分)。您知道如何获取所有历史数据点吗?感谢一百万
  • 在 url 中查看 /1513624444000/1514229244000/ - 它是以毫秒为单位的时间戳。
  • 查看获取'2016.01.01', '2017.01.01'范围内数据并保存在csv文件中'date', 'price_btc', 'price_usd', 'volume_usd'列中的新代码
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多