Python 将Highcharts数据刮取到CSV文件

Python 将Highcharts数据刮取到CSV文件,python,highcharts,web-scraping,beautifulsoup,export-to-csv,Python,Highcharts,Web Scraping,Beautifulsoup,Export To Csv,我想使用Python从数据库中获取特定硬币的历史数据。我想要尽可能精确的数据。我认为数据来自以下字符串: 我想使用BeautifulSoup获取此数据并将其保存到CSV文件中,但我不知道如何使用。它似乎使用了使用url的JavaScript https://graphs.coinmarketcap.com/currencies/verge/1513624444000/1514229244000/ 以JOSN的形式获取数据,这样就可以轻松地以python字典的形式获取数据 编辑:它使用url中

我想使用Python从数据库中获取特定硬币的历史数据。我想要尽可能精确的数据。我认为数据来自以下字符串:


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

它似乎使用了使用url的JavaScript

https://graphs.coinmarketcap.com/currencies/verge/1513624444000/1514229244000/
以JOSN的形式获取数据,这样就可以轻松地以python字典的形式获取数据

编辑:它使用url中的
时间戳*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
导入网络浏览器
def get_数据(名称、时间戳1、时间戳2、csv_写入器):
url='1〕https://graphs.coinmarketcap.com/currencies/{}/{}/{}/'.format(名称、时间戳1、时间戳2)
response=requests.get(url)
尝试:
data=response.json()
除例外情况外:
将open('output.html','w')作为f:
f、 写(response.text)
webbrowser.open('output.html')
退出()
对于zip中的第1项、第2项、第3项(数据['price_btc']、数据['price_usd']、数据['volume_usd']):
date=datetime.datetime.fromtimestamp(item1[0]//1000)
日期=日期。strftime(“%Y.%m.%d%H:%m:%S”)
行=(日期,项目1[1],项目3[1],项目3[1])
csv_writer.writerow(行)
def刮洗(名称、开始日期、完成日期):
f=打开(名称+'.csv',w')
csv_writer=csv.writer(f)
行=(‘日期’、‘价格’、‘价格’、‘数量’)
csv_writer.writerow(行)
一天=datetime.timedelta(天=1)
开始日期=datetime.datetime.strtime(开始日期,%Y.%m.%d)
完成日期=datetime.datetime.strtime(完成日期,%Y.%m.%d)
日期1=开始日期
日期2=开始日期+一天
日期1<完成日期:
打印(名称、日期1、日期2)
date1_timestamp=int(date1.timestamp()*1000)
date2_timestamp=int(date2.timestamp()*1000)
获取数据(名称、日期1时间戳、日期2时间戳、csv写入器)
date1=date2
日期2+=一天
f、 关闭()
#---梅因---
刮伤('verge'、'2016.01.01'、'2017.01.01')
刮取(‘比特币’、‘2016.01.01’、‘2017.01.01’)
刮擦('ethereum'、'2016.01.01'、'2017.01.01')

它似乎使用了使用url的JavaScript

https://graphs.coinmarketcap.com/currencies/verge/1513624444000/1514229244000/
以JOSN的形式获取数据,这样就可以轻松地以python字典的形式获取数据

编辑:它使用url中的
时间戳*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
导入网络浏览器
def get_数据(名称、时间戳1、时间戳2、csv_写入器):
url='1〕https://graphs.coinmarketcap.com/currencies/{}/{}/{}/'.format(名称、时间戳1、时间戳2)
response=requests.get(url)
尝试:
data=response.json()
除例外情况外:
将open('output.html','w')作为f:
f、 写(response.text)
webbrowser.open('output.html')
退出()
对于zip中的第1项、第2项、第3项(数据['price_btc']、数据['price_usd']、数据['volume_usd']):
date=datetime.datetime.fromtimestamp(item1[0]//1000)
日期=日期。strftime(“%Y.%m.%d%H:%m:%S”)
行=(日期,项目1[1],项目3[1],项目3[1])
csv_writer.writerow(行)
def刮洗(名称、开始日期、完成日期):
f=打开(名称+'.csv',w')
csv_writer=csv.writer(f)
行=(‘日期’、‘价格’、‘价格’、‘数量’)
csv_writer.writerow(行)
一天=datetime.timedelta(天=1)
开始日期=datetime.datetime.strtime(开始日期,%Y.%m.%d)
完成日期=datetime.datetime.strtime(完成日期,%Y.%m.%d)
日期1=开始日期
日期2=开始日期+一天
日期1<完成日期:
打印(名称、日期1、日期2)
date1_timestamp=int(date1.timestamp()*1000)
date2_timestamp=int(date2.timestamp()*1000)
获取数据(名称、日期1时间戳、日期2时间戳、csv写入器)
date1=date2
日期2+=一天
f、 关闭()
#---梅因---
刮伤('verge'、'2016.01.01'、'2017.01.01')
刮取(‘比特币’、‘2016.01.01’、‘2017.01.01’)
刮擦('ethereum'、'2016.01.01'、'2017.01.01')

看看它,你会对你需要的东西有所了解。在Chrome/Firefox(tab Network->XHR)中使用
DevTool
,我看到JavaScript从
https://graphs.coinmarketcap.com/currencies/verge/
-也许这正是您所需要的。顺便说一句:如果页面使用JavaScript在页面上添加元素(大多数页面都这样做)然后,
BeautifulSoup
可能是无用的,因为
reuqests
/
BeautifulSoup
无法运行JavaScript。然后您可能需要使用
Selenium
来控制web浏览器,它将打开页面并运行JavaScript。或者你可以尝试不同的方法:大部分JavaScript从某个url读取数据,这样你就可以尝试使用
DevTool
查找此url。查看一下它,应该可以了解你需要的内容。在Chrome/Firefox(tab Network->XHR)中使用
DevTool
我看到JavaScript从
https://graphs.coinmarketcap.com/currencies/verge/
-也许这正是您所需要的。顺便说一句:如果页面使用JavaScript在页面上添加元素(大多数页面都这样做),那么
BeautifulSoup
可能毫无用处,因为
reuqests
/
BeautifulSoup
无法运行JavaScript。然后您可能需要使用
Selenium
来控制web浏览器,它将打开页面并运行JavaScript。或者您可以尝试不同的方法:大部分JavaScript从某个url读取数据,因此您可以使用
DevToool
来尝试查找此url,非常感谢!你知道如何将其放入csv吗?python有模块
csv
来写入
csv
,或者你可以使用
pandas
来创建
DataFrame
,然后使用
来创建
csv()
。而且,我似乎没有得到所有的数据(只是其中的一部分)。将