鱼C论坛

 找回密码
 立即注册
查看: 2151|回复: 2

[作品展示] 用Python抓取百度图片json数据包的图片地址

[复制链接]
发表于 2018-1-27 23:29:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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下面。
后面根据网址下载图片就好了
QQ截图20180127231913.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-27 23:40:35 | 显示全部楼层
厉害,学习啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-28 06:22:21 | 显示全部楼层
嗯,这json网址确实挺难找的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-6 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表