【python】【爬虫】妖精的爬虫学习之路——用requests下载百度图片

import requests
import os

def getPages(keyword,pages):
    params = []
    for i in range(0, pages*30 + 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': '',
                        'hd': '',
                        'latest': '',
                        'copyright':'',
                        'word': keyword,
                        's':'',
                        'se':'',
                        'tab':'',
                        'width':'',
                        'height':'',
                        'face': 0,
                        'istype': 2,
                        'qc':'',
                        'nc': 1,
                        'fr':'',
                        'expermode':'',
                        'force':'',
                        'pn': i,
                        'rn': 30,
                        'gsm': '3c',
                        '1554124009275':''
        })
    url = 'https://image.baidu.com/search/acjson'
    urls = []
    for i in params:
        urls.append(requests.get(url,params = i).json().get('data'))
    return urls
def getImages(urls):
    if not os.path.exists("陈钰琪妹纸"):
        os.mkdir("陈钰琪妹纸")
    x = 0
    for list in urls:
        for i in list:
            if i.get('middleURL') != None:
                print("downloading: %s" % i.get('middleURL'))
                ir = requests.get(i.get('middleURL'))
                open("./陈钰琪妹纸/" + '%d.jpg' % x, 'wb').write(ir.content)
                x += 1
            else:
                print('error')

getImages(getPages("陈钰琪 倚天屠龙记",10))

随便拿了最近很火的新版倚天来练手,示例中保存了300张百度图片搜索结果,因为网上教程纷繁,各有各的优点各有各的不足,这是最终我本人实验成功的最简单的版本。

Tips:
  1. params 这个参数,里面用的是 acjson 页面的请求头,因为百度图片下拉会加载新的json文件,每一页的不同在于pn以30的速度增加,为了方便加载任意多的页面,所以使用 https://image.baidu.com/search/acjson 页面发送请求,params自然也是对应页面的参数(上面pni和下面requests的参数i不要混淆,上面的i是第一个for循环的,是页数,下面的ii in params的,是一套参数) acjson页面解析如下:
    【python】【爬虫】妖精的爬虫学习之路——用requests下载百度图片

  2. 使用get “middleURL” 是因为我们获取的是 .json().get('data') 在源码中 app.setData 可以看到,每张图片有四个地址。分别是 thumbURLmiddleURLhoverURL ,还有 ObjURL 如下图:
    【python】【爬虫】妖精的爬虫学习之路——用requests下载百度图片
    【python】【爬虫】妖精的爬虫学习之路——用requests下载百度图片
    【python】【爬虫】妖精的爬虫学习之路——用requests下载百度图片
    (ps:这里的截图用的是把上面代码的 print("downloading: %s" % i.get('middleURL'))改为 print("downloading: %s" % i),网页元素实在看的眼晕= =排好格式出来就好看多了)

    其中thumbURL middleURL 是百度图片上的图,相对middle大一点,hoverURL 是鼠标移动过后显示的版本,ObjURL是原始大图,可以看到后面还带了源地址。B U T! 这个ObjURL,并不能直接访问,所以我们选择了下载百度图片的 middleURL

  3. 写文件的那两
    ir = requests.get(i.get(‘middleURL’))
    open("./陈钰琪妹纸/" + ‘%d.jpg’ % x, ‘wb’).write(ir.content)

    ir.content 是图片的二进制形式,保存为图片格式可以直接转换成图片