requests库获取指定关键词的图片,并保存到本地

var code = “45f4267f-9476-44ca-ac68-6d32aad2d4e1”

源码地址:https://gitee.com/myrensheng/data_analysis

import os
import string
import requests

# 百度图片搜索地址
url = "https://image.baidu.com/search/acjson"
# 构造请求头数据
header = {
    
    
    'Accept': 'text/plain, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Host': 'image.baidu.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}
# 构造请求参数
param = {
    
    
    'tn': 'resultjson_com',
    'ipn': 'rj',
    'ct': '201326592',
    'fp': 'result',
    'queryWord': '',
    'cl': '2',
    'lm': '-1',
    'ie': 'utf-8',
    'oe': 'utf-8',
    'st': '-1',
    'ic': '0',
    'word': '',
    'face': '0',
    'istype': '2',
    'nc': '1',
    'pn': '60',
    'rn': '30',
    'gsm': '1e',
}


def get_json(query_word=None, page_num=None):
    """
    根据查询的关键词及查询的页面返回 json 数据
    :param query_word: 输入的关键词
    :param page_num: 查询的页面数
    :return: 对应的 json 数据
    """
    # 参数列表中添加 queryWord 关键词
    param["queryWord"] = query_word
    param["word"] = query_word
    # 参数列表中添加 pn 关键词
    param["pn"] = f'{
      
      30 * page_num}'
    # 请求百度图片网站,将返回的 json 数据转换为 dict 数据
    res = requests.get(url=url, headers=header, params=param)
    res_dict = dict(res.json())
    return res_dict


def save_picture(query_word=None, pic_name=None, pic_url=None):
    """
    将图片保存在以 query_word 为名创建新的文件夹
    :param query_word:输入的关键词
    :param pic_name: json 中解析出来的图片名称
    :param pic_url: json 中解析出来的图片地址
    :return: None
    """
    # 获取当前 py 文件所在的绝对地址
    cwd = os.getcwd()
    # 拼接 images 文件夹地址
    images_path = os.path.join(cwd, "images")
    query_word_path = os.path.join(images_path, query_word)
    # 如果没有 images 文件夹,就新建一个
    if "images" not in os.listdir(cwd):
        os.mkdir(images_path)
    # 在 images 文件夹下,新建以 query_word 为名的文件夹
    if query_word not in os.listdir(images_path):
        os.mkdir(query_word_path)
    # 根据 pic_url 读取图片
    pic = requests.get(pic_url, stream=True)
    # 构造图片地址
    pic_path = os.path.join(query_word_path, pic_name)
    # 保存图片
    with open(pic_path, "wb") as f:
        for c in pic.iter_content(chunk_size=10240):
            f.write(c)


def get_pic_info(res=None):
    """
    解析 get_json 函数返回的 json 数据
    :param res: get_json 函数返回的 json 数据
    :return: 重新构造的图片数据,包含图片名称,图片地址
    """
    # 多张图片的信息列表
    pic_info = []
    # 图片数据存放在 data 中
    for data in res["data"]:
        # 获取图片名称
        pic_name = data.get("fromPageTitleEnc", None)
        # 获取图片地址
        pic_url = data.get("hoverURL", None)
        # 判断图片名称和图片地址是否存在
        if pic_name and pic_url:
            # 替换图片名称中的特殊字符
            pic_name = pic_name.replace(" ", '')
            for p in string.punctuation:
                pic_name = pic_name.replace(p, '')
            # 用图片名称命名图片
            if "png" in pic_url:
                pic_name += ".png"
            if "jpg" in pic_url:
                pic_name += ".jpg"
            if "gif" in pic_url:
                pic_name += ".gif"
            if "jpeg" in pic_url:
                pic_name += ".jpeg"
            if "bmp" in pic_url:
                pic_name += ".bmp"
            else:
                pic_name += ".jpg"
            pic_info.append({
    
    "pic_name": pic_name, "pic_url": pic_url})
    return pic_info


def main():
    # 程序运行的主函数
    while True:
        # 多次下载,直到输入 q 退出
        query_word = str(input("输入要下载的图片名(q退出):"))
        if query_word == "q":
            break
        while True:
            # 当输入的数量不为整数,循环输入
            pic_num = input("输入需要下载的页数(q退出):")
            if pic_num == "q":
                break
            try:
                pic_num = int(pic_num)
            except:
                continue
            # 下载量不超过 30 就下载第一页图片
            page_num = 1 if int(pic_num / 30) == 0 else int(pic_num / 30)
            for i in range(1, page_num + 1):
                # 获取 json 数据
                res = get_json(query_word=query_word, page_num=i)
                # 获取图片名和图片地址
                pic_info = get_pic_info(res=res)
                # 保存图片
                for pic in pic_info:
                    print(pic["pic_name"], "下载完成")
                    save_picture(query_word=query_word, pic_name=pic["pic_name"], pic_url=pic["pic_url"])
            break


if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/weixin_42060598/article/details/123061465