|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 mingminglm 于 2018-1-27 23:31 编辑
在python抓取图片的时候,有时候却找不到对应的网址,可能存在json中,所以如何用python解析json数据,小白看了几个论坛后自己总结一些以便加深印象。
1.requests.get(url,params) 获得请求数据
import requests
def get_many_pages(keyword, page):
params = []#收集不同页面的json数据
for i in range(30, 30*page, 30):#动态加载,每页30个
params.append({
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': keyword,
'cl': 2,
'lm': -1,
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': '',
'word': keyword,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': 0,
'istype': 2,
'qc': '',
'nc': '' ,
'fr': '',
'pn': i,
'rn': 30,
'gsm': '1e',
'1517048369666': ''
}) #json的Query String paramters 是动态的
json_url = 'https://image.baidu.com/search/acjson'#json的init地址
json_datas = []#用于收集所有页面的json数据
for param in params:#分别取出每个动态的参数,是一个字典形式
res = requests.get(json_url, params = param)#获取json地址
res.encoding = 'utf-8'#转化为utf-8格式
json_data = res.json().get('data')#解析json数据成字典,通过get方法找出data中的值
json_datas.append(json_data)#把所有页的json数据取回
return json_datas
def get_url():
json_datas = datalist#获取所有页的json数据
#print(json_datas)
for each_data in json_datas:#解开列表嵌套
for each_dict in each_data:#解开列嵌套直到出现字典
each_url = each_dict.get('thumbURL')#获取字典中的地址
print(each_url)
datalist = get_many_pages('暴漫表情包',3)
get_url()
2. urllib.request + json 获得请求数据
# -*- coding: utf-8 -*-
''' Created on Sat Jan 27 22:39:15 2018 @author: zhuxueming'''
import urllib.request
import json
def get_many_pages(page):
json_datas = []
for i in range(30,30*page,30):#这里由于网址中有多个%所以采用.format不能用%来格式化,根据json的地址发现,只有1517056200441=后面的数字变化在不同的页面中,所以单独改这一个就可以
json_url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E6%9A%B4%E6%BC%AB%E8%A1%A8%E6%83%85%E5%8C%85&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&word=%E6%9A%B4%E6%BC%AB%E8%A1%A8%E6%83%85%E5%8C%85&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&pn={0}&rn=30&gsm=3c&1517056200441='.format(i)
res = urllib.request.urlopen(json_url)#获得网址数据
html = res.read().decode('utf-8')#读取数据并转化为utf-8
json_data = json.loads(html).get('data')#用json转化为字典获取data里的数据
json_datas.append(json_data)#合并不同页面的数据
return json_datas
def get_url():
json_datas = datalist#获取所有页的json数据
#print(json_datas)
for each_data in json_datas:#解开列表嵌套
for each_dict in each_data:#解开列嵌套直到出现字典
each_url = each_dict.get('thumbURL')#获取字典中的地址
print(each_url)
datalist = get_many_pages(3)
get_url()
综上两个方式都可以使用,只是第二种不能直接关键词搜索,但不同关键次需要修改json参数,所以也无妨,主要就是找到这个动态的json数据包比较困难,一般在js下货XHR下面。
后面根据网址下载图片就好了
|
-
|