进军Json,以战养战 -- 爬取搜狗图片代码分析

爬取搜狗图片代码分析

代码

代码功能

从搜狗网页下载 n 张指定分类的图片并保存到指定的文件夹。

代码

# 导入相关的库
import requests
import json
import urllib
import os

# 爬取图片的保存路径
output_dir = "./images/"


# 爬取搜狗搜图的函数
def getSogouImag(category, length, path):
    '''
    参数category:指要爬取图片的类型,字符串格式,如:'壁纸'
    参数length:指要爬取多少张,整型
    参数path:存储路径
    '''
    n = length
    cate = category
    # http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E7%BE%8E%E5%A5%B3&tag=%E5%85%A8%E9%83%A8&start=0&len=15
    imgs = requests.get(
        'http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=' + cate + '&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(
            n) + '&width=1536&height=864')

    jd = json.loads(imgs.text)

    jd = jd['all_items']
    i = 0
    imgs_url = []
    for j in jd:
        imgs_url.append(j['pic_url'])
        print(imgs_url[i])
        i = i+1
    m = 0
    for img_url in imgs_url:
        print('***** ' + str(m) + '.jpg *****' + '   Downloading...')
        urllib.request.urlretrieve(img_url, path + str(m) + '.jpg')
        m = m + 1
    print('Download complete!')


# 检查是否存在路径,若不存在,则创建
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 爬取图片
getSogouImag('壁纸', 10, output_dir)

代码解析

整个代码逻辑是:
1.网络请求数据
2.解析数据得到图片地址
3.根据图片地址请求数据
4.将图片保存到指定文件夹。

  • 模块导入
# 导入相关的库
import requests
import json
import urllib
import os

其中 requests 是网络相关的库,用于模拟浏览器打开网址 get 网络数据,json 库用于解析得到的网络数据。urllib 和 requests 库差不多,requests 将 urlib 进行了更高级的封装,不用人为的编码解码,将其自动化。os 库是Python标准库,包含几百个函数,常用的有路径操作、进程管理、环境参数等,在这里我们用于路径管理。

  • 拼接网络地址,请求网络数据
# 爬取搜狗搜图的函数
def getSogouImag(category, length, path):
    '''
    参数category:指要爬取图片的类型,字符串格式,如:'壁纸'
    参数length:指要爬取多少张,整型
    参数path:存储路径
    '''
    n = length
    cate = category
    # http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E7%BE%8E%E5%A5%B3&tag=%E5%85%A8%E9%83%A8&start=0&len=15
    imgs = requests.get(
        'http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=' + cate + '&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(
            n) + '&width=1536&height=864')

    jd = json.loads(imgs.text)

这里我们定义了 getSogouImag(category, length, path): 函数,参数为图片类型,数量,保存地址。
然后将 category 和 length 替换到链接里。
使用 requests.get 发起网络请求,此时 imgs 存储了反馈的数据。
通过 json.loads 将反馈数据载入到 jd 变量中。此时我们使用 printf 将jd打印出来。内容如下:


{
	"category": "壁纸",
	"tag": "全部",
	"startIndex": 0,
	"maxEnd": 1112,
	"items": null,
	"all_items": [{
		"id": 10749526,
		"did": 0,
		"thumbUrl": "https://img04.sogoucdn.com/app/a/100520020/6a793eed6c92347c74e6e2aa765782e0",
		"thumb_width": 480,
		"thumb_height": 360,
		"thumb_size": 0,
		"sthumbUrl": "https://img03.sogoucdn.com/app/a/100520024/4dd204bb180a72b824bcce2fdb3ed271",
		"sthumb_width": 400,
		"sthumb_height": 300,
		"bthumbUrl": "https://img03.sogoucdn.com/app/a/100520076/1c325e6f44154738b51a1986e143167f",
		"bthumb_width": 160,
		"bthumb_height": 120,
		"pic_url": "https://img01.sogoucdn.com/app/a/100520021/48472f2b887d712605029363865daa27",
		"width": 1024,
		"height": 768,
		"size": 256556,
		"ori_pic_url": "http://b.zol-img.com.cn/desk/bizhi/image/5/1024x768/1419384721150.jpg",
		"ext_url": null,
		"page_title": null,
		"page_url": "http://desk.zol.com.cn/bizhi/4892_60766_2.html",
		"title": "可爱猫咪壁纸桌面",
		"tags": ["动物", "可爱", "优质"],
		"group_mark": null,
		"group_index": 0,
		"publish_time": null,
		"surr1": null,
		"surr2": null,
		"category": null,
		"weight": 0,
		"deleted": 0,
		"pfrom": 0,
		"wapLink": null,
		"webLink": null
	}, 
	{...}, 
	{...}, 
	{...}, 
	{...}, 
	{...}, 
	{...}, 
	{...}, 
	{...}, 
	{...}],
	"newsResult": null,
	"itemsOnPage": 0,
	"fromItem": null,
	"groupList": null,
	"resolution": {
		"width": 1024,
		"height": 768
	}
}

分析数据可知,图片的地址都存在 all_items 的 json 数组对象中。

  • 获取图片地址
    jd = jd['all_items']
    i = 0
    imgs_url = []
    for j in jd:
        imgs_url.append(j['pic_url'])
        print(imgs_url[i])
        i = i+1

将上面得到的网络数据的 all_items 数组提取出来。
定义 for 循环去轮询数组,提取出图片的 pic_url 地址存储到 imgs_url 数组中。
我们用 printf 将 imgs_url 数组打印出来,结果如下:

https://img01.sogoucdn.com/app/a/100520021/48472f2b887d712605029363865daa27
https://img02.sogoucdn.com/app/a/100520021/da5a7df38125a56e447a819759088716
https://img04.sogoucdn.com/app/a/100520021/e074ebc04b637e770d3ed053b7df7f87
https://img02.sogoucdn.com/app/a/100520021/819998b5533c43c3980cb9fe65aed7ab
https://img01.sogoucdn.com/app/a/100520021/ff199ed325c200ad1fb4850ab5307712
https://img02.sogoucdn.com/app/a/100520021/9815f5e941ebea12c67f978230949f5e
https://img04.sogoucdn.com/app/a/100520021/c57392860425a763252ee211abfa882b
https://img01.sogoucdn.com/app/a/100520021/bf55778452fcce54cb6bc6a3bb51d257
https://img02.sogoucdn.com/app/a/100520021/dedb945a337f3f32287783887c54e3fb
https://img01.sogoucdn.com/app/a/100520021/68b6b51aee44130ba7748fb4a9adc54c

  • 根据地址,下载图片到指定位置
    m = 0
    for img_url in imgs_url:
        print('***** ' + str(m) + '.jpg *****' + '   Downloading...')
        urllib.request.urlretrieve(img_url, path + str(m) + '.jpg')
        m = m + 1
    print('Download complete!')

定义 for 循环去轮询地址,下载图片数据。
这里主要用到的方法是 urlretrieve 函数,其用法如下:

urlretrieve(url, filename=None, reporthook=None, data=None)
 * 参数url:下载链接地址
 * 参数filename:指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
 * 参数reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
 * 参数data:指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头
  • 创建图片保存路径,调用爬取函数下载图片
# 检查是否存在路径,若不存在,则创建
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 爬取图片
getSogouImag('壁纸', 10, output_dir)

首先判断文件夹路径是否存在,保证文件夹存在,然后调用函数下载图片。

总结

由此代码可以看出 Python 的特点:

  • 开发快
    以较少的代码量完成需要的功能。

  • 第三方库齐全
    各种功能都有第三方的库,我们只需要熟悉其API函数用法即可使用其功能。

  • 接近于自然语言
    由于各种库的封装,python 已经非常接近英语,其含义打都可以从其命名理解。因此对于新手来说,尤其是掌握一种其他编程语言的程序员,更容易入门。

综上所述,Python 很适合做工作的工具使用,可以帮助你更快速的处理工作。人和动物的区别就在于人会制造并使用各种工具。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值