python爬取json并写入mongodb

用python爬取https://py.btc126.com/json/markets.json 这个json,

写入到mongodb数据库,同时以 json中的 id为唯一字段, mongodb里如果没有就插入,已经存在就更新。

谢谢。

from pymongo import MongoClient
import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
}
# 获取json数据
response = requests.get("https://py.btc126.com/json/markets.json", headers=headers)
data = response.json()
# 建立MongoDB数据库连接
client = MongoClient('127.0.0.1', 27017)
# 连接所需数据库,test为数据库名
db = client.test
# 连接所用集合,也就是我们通常所说的表,json为表名
collection = db.json
# 读出集合中所有数据
json_datas = collection.find()
for json_data in data:
    for item in json_datas:
        if json_data.get("id") == item.get("id"):
            # 更新
            collection.update({"id":json_data.get("id")},json_data)
            break
    else:
        # 插入
        collection.insert(json_data)

这。。。

建议使用sqlite database,结合python 中的sqlite3这个库使用很方便。

import sqlite3

# 连接数据库
conn1 = sqlite3.connect('Individual.db')
c1 = conn1.cursor()

# 创建表和字段
c1.execute('''CREATE TABLE uni_user
       (userid INT     NOT NULL,
        data    text     NOT NULL,
        weeks INT     NOT NULL,
        percent REAL     NOT NULL,
        records INT     NOT NULL);''')

# 插入数据
c1.executemany('''INSERT INTO uni_user (userid,data,weeks,percent,records) VALUES (?,?,?,?,?)''', data_all)

# 关闭数据库
conn1.commit()
conn1.close()

 

这样就行了

import requests
import json
import pymongo

r = requests.get('https://py.btc126.com/json/markets.json')
j = json.loads(r.text)

mc = pymongo.MongoClient('mongodb://localhost:27017')
mydb = mc['test']
mycol = mydb['btc']

for i in j:
    mycol.update_one({'id':i['id']},{'$set':i},True)
import requests
import pymongo

# host              - 数据库地址或IP,字符串
# port              - 数据库端口,整型
# db_name           - 数据库名,字符串
# collection_name   - 集合名,字符串

resp = requests.get('https://py.btc126.com/json/markets.json')
conn = pymongo.MongoClient(host, port)
for item in resp.json():
    conn[db_name].collection_name.update({'id':item['id']}, item, True)

 

>>> import requests
>>> resp = requests.get('https://py.btc126.com/json/markets.json')
>>> resp.ok
True
>>> data = resp.json()
>>> type(data)
<class 'list'>
>>> len(data)
250
>>> type(data[0])
<class 'dict'>
>>> data[0]
{'id': 'bitcoin', 'symbol': 'btc', 'name': 'Bitcoin', 'image': 'https://assets.coingecko.com/coins/images/1/large/bitcoin.png?1547033579', 'current_price': 55902, 'market_cap': 1041652415473, 'market_cap_rank': 1, 'fully_diluted_valuation': 1173936562602, 'total_volume': 73284961698, 'high_24h': 56613, 'low_24h': 51724, 'price_change_24h': 4166.19, 'price_change_percentage_24h': 8.05286, 'market_cap_change_24h': 77682036302, 'market_cap_change_percentage_24h': 8.05855, 'circulating_supply': 18633631.0, 'total_supply': 21000000.0, 'max_supply': 21000000.0, 'ath': 56613, 'ath_change_percentage': -1.04844, 'ath_date': '2021-02-20T01:05:32.622Z', 'atl': 67.81, 'atl_change_percentage': 82513.24931, 'atl_date': '2013-07-06T00:00:00.000Z', 'roi': None, 'last_updated': '2021-02-20T06:38:13.636Z'}
>>> 

 

这个问题可以分成下载和入库两部分。数据下载很简单,代码如下:

>>> import requests
>>> resp = requests.get('https://py.btc126.com/json/markets.json')
>>> resp.ok
True
>>> data = resp.json()
>>> type(data)
<class 'list'>
>>> len(data)
250
>>> type(data[0])
<class 'dict'>
>>> data[0]
{'id': 'bitcoin', 'symbol': 'btc', 'name': 'Bitcoin', 'image': 'https://assets.coingecko.com/coins/images/1/large/bitcoin.png?1547033579', 'current_price': 55902, 'market_cap': 1041652415473, 'market_cap_rank': 1, 'fully_diluted_valuation': 1173936562602, 'total_volume': 73284961698, 'high_24h': 56613, 'low_24h': 51724, 'price_change_24h': 4166.19, 'price_change_percentage_24h': 8.05286, 'market_cap_change_24h': 77682036302, 'market_cap_change_percentage_24h': 8.05855, 'circulating_supply': 18633631.0, 'total_supply': 21000000.0, 'max_supply': 21000000.0, 'ath': 56613, 'ath_change_percentage': -1.04844, 'ath_date': '2021-02-20T01:05:32.622Z', 'atl': 67.81, 'atl_change_percentage': 82513.24931, 'atl_date': '2013-07-06T00:00:00.000Z', 'roi': None, 'last_updated': '2021-02-20T06:38:13.636Z'}
>>> 

 

不难看出,下载得到数据data是一个长度为250的列表,列表元素是字典,字典包含id键。遍历这个列表,将每一个字典(在MongoDB中被称为文档)保存到MongoDB。若库中已存在id相同的文档,则更新文档,否则,插入新文档——这种模式叫做upsert,在update方法中配合upsert参数就可以实现。假如MongoDB的连接对象是conn,库名是db_name,集合名是collection_name,入库代码如下:

 

for item in data:
    conn[db_name].collection_name.update({'id':item['id']}, item, True)

 

好多年不用MongoDB了,代码应该是正确的,请自行调试。