baidu_35920590
快乐的小猪哥哥
采纳率71.4%
2021-02-20 14:13

python爬取json并写入mongodb

50

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

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

谢谢。

  • 点赞
  • 收藏
  • 复制链接分享

6条回答

  • weixin_42145856 扬帆向阳 2月前
    >>> 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'}
    >>> 
    点赞 评论 复制链接分享
  • xufive 天元浪子 2月前
    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)
    点赞 评论 复制链接分享
  • yixinluobo 一心萝卜 2月前
    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)
    

    这。。。

    点赞 1 评论 复制链接分享
  • gdyflxw Sevan_Li 2月前

    这样就行了

    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)
    点赞 评论 复制链接分享
  • xufive 天元浪子 2月前

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

    >>> 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了,代码应该是正确的,请自行调试。

    点赞 评论 复制链接分享
  • DomicZhong DomicZhong 2月前

    建议使用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()
    点赞 评论 复制链接分享

为你推荐