Python 将Highcharts数据刮取到CSV文件
我想使用Python从数据库中获取特定硬币的历史数据。我想要尽可能精确的数据。我认为数据来自以下字符串: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中
我想使用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()
。而且,我似乎没有得到所有的数据(只是其中的一部分)。将