2018.7.10爬xichain

合并字典;

dic_all=(dic1,**dic2)

如果有多个数据,一定是用列表先存,然后在转化成字典,自己起个键名

而且字典不能append

list_jy=[]#列表形式存储

for i in range(1,count):

    list_jy.append(dic_json[key][i][key1])

dic_jy={"jy":list_jy}#字典形式存储

列表是为了存储多组数据,加一个自己命名的键就可以把列表存到字典中,这样就可以和其他字典合并了


postman用法

f12得到url(不是网页地址注意)

用request header不是response header选bulk edit直接复制粘贴,注意,requests header第一行可能不是键值对不要选

然后切换到key_value edit可以选哪些header要或者不要(点对勾)

如果是post请求,需要playload,在网页f12最下面,粘贴到postman 的body选项里的raw,

如果选get请求则不用,不同网页要用不同的方式爬,不然可能得不到正确结果


点击send获得相应

点击code生成代码


sav可以储存整个操作并命名,添加描述


对于url,playload要动态改变参数的,1是得到这个变化的参数,2是在url/playload="{  bulabula  }"中替换相应代码换成“str(要替换的内容)”

payload1 = "{\"blockHash\":\"" + str(dict_json['blockHash']) + "\",\"txId\":\"" + str(dict_json['txList'][j]['txId']) + "\",\"transCode\":\"XE0008\",\"clientToken\":\"12345678\"}"

playload比较难搞,postman里可以自动生成,可以看到在上面的例子中,是\"transCode\",有下划线,而且是\"   \"这样的像字典但是有下划线,替换时要注意

对于url,playload需要上一个相应的结果中的数据的,1是提取2是要把后面的url,playload,response的定义写在第一个的response后

像这样

for i in range(1,2000000):
    url1 = "http://io.inchain.org/block/height/"+str(i)

    headers1 = {
        'Cache-Control': "no-cache",
        'Postman-Token': "4e1cf563-351a-4c4c-b2a7-174f484542c0"
        }
    headers2 = {
        'Cache-Control': "no-cache",
        'Postman-Token': "364d761b-19a0-4239-9a7a-3d09836ebb03"
        }
    headers3 = {
        'Accept-Language': "zh-CN,zh;q=0.9",
        'Cache-Control': "no-cache",
        'Postman-Token': "1025c6e7-2662-4e72-b3a7-542103fce393"
        }
    response1 = requests.request("GET", url1, headers=headers1)
    json_str1 = response1.content.decode()
    dict_json1 = json.loads(json_str1)#response1的三行代码
#这是下面两个url要用的第一个响应中的信息,提取出来
    addres=dict_json1['block']['consensusAddress']
    hashh=dict_json1['block']['merkleHash']

    url2 = "http://io.inchain.org/address/hash/"+str(addres)
    url3 = "http://io.inchain.org/transaction/hash/"+str(hashh)#下面是第二个和第三个的三行代码
    response2 = requests.request("GET", url2, headers=headers2)
    response3 = requests.request("GET", url3, headers=headers3)
    json_str2 = response2.content.decode()
    dict_json2 = json.loads(json_str2)
    json_str3 = response3.content.decode()
    dict_json3 = json.loads(json_str3)



对于{

”key“:value,

"key1":[

”kkey1":value,

...

],

}

获取格式是dic_json["key1"][0/1/2/3]["kkey1"]


postman 生成后

response = requests.request("POST", url, data=payload, headers=headers)
json_str = response.content.decode()
dict_json = json.loads(json_str)

三行代码获得json的dict形式



键一定是加单引号的


5行代码写入mongdb

rent_info 下面有xichain2

client = pymongo.MongoClient('localhost', 27017)
rent_info = client['rent_info']  # 给数据库命名
xichain2 = rent_info['xichain2']  # 创建表单
for item in datas:
    # 将数据存入数据库
    xichain2.insert_one(item)

datas是要存进去的所有信息,是一个列表,对xichain这个例子,把每个区块的信息做成一个字典然后存到列表里,

另外想说,可以自己做一个大字典一个一个提取,当然也可以获得dic_json后直接传到datas里面是一样的除非你不想要一些数据自己整理一下(dic_json以后就表示dict形式的json相应)doc_json本身就是字典,不然你也没法提取数据

dic = {'blockHash': dict_json['blockHash'],
       'previousBlockHash':dict_json['previousBlockHash'],
       'nextBlockHash': dict_json['nextBlockHash'],
       'transTime': dict_json['transTime'],
       'clientToken': dict_json['clientToken'],
       'blockHeight': dict_json['blockHeight'],
       'blockTime': dict_json['blockTime'],
       'returnMsg': dict_json['returnMsg'],
       'transactionCount': dict_json['transactionCount'],
       'transCode': dict_json['transCode'],
       'txList':jydata
       }

(自己做的大字典,一个一个提取)

txlist是一个列表,用了jydata大都拎出来弄一个列表

jydata=[]
for j in range (0,dict_json['transactionCount']):
    jydata.append(dict_json['txList'][j])

(定义一定写在循环外面)



猜你喜欢

转载自blog.csdn.net/qq_38445415/article/details/80982166