通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片

2023-11-07

通过re、requests、urlib、BeautifulSoup、os模块实现从百度下载指定类别图片。包含代码逐行解析。

import re
# 进行http请求的第三方库
import requests
from urllib import error
# 解析HTML和XML文档的库
from bs4 import BeautifulSoup
import os
 
num = 0
numPi = 0
file = ''
List = []
 
def makefile(word):
    file = word + '文件'
    file_na = os.path.exists(file)
    if file_na == 1:
        print('该文件已存在,请重新输入')
        file = input('请建立一个存储图片的文件夹,输入文件夹名称即可: ')
        os.mkdir(file)
    else:
        os.mkdir(file)
    return file

 
# 根据地址去查找 对应的图片的信息
# 获取网页中图片URL函数
# url是目标网页的URL,A是用来发送http请求的类,通常是Request对象
def Find(url, A):
    global List  # 保存信息的列表,保存获取图片的URL
    t = 0           # 请求时间
    i = 1           # 请求次数
    s = 0           # 当前获取到的图片总数
    while t < 60000:
        # 时间戳 不间断刷新访问网址
        # 目标网页的URL与当前时间戳t拼接,形成一个新的url
        Url = url + str(t)
        try:
            # get获取数据,访问拼接后的url
            Result = A.get(Url, timeout=7, allow_redirects=False)
        # 捕获所有请求超时、URL错误等异常
        except BaseException:
            # 每一页有60张图片所以
            t = t + 60
            continue
        else:
            # 拿到网站的数据,捕获到的网页内容给result变量
            result = Result.text
            # 找到图片url,使用正则表达式从网页内容中提取图片url,并将结果赋值给pic_url变量
            pic_url = re.findall('"objURL":"(.*?)",', result, re.S)
            # 图片总数
            # 提取到的图片url数量加到s变量上
            s += len(pic_url)
            # 如果提取到的图片URL数量为 0,表示网页中没有图片,跳出循环
            if len(pic_url) == 0:
                break
            else:
                # 将提取到的图片 URL 添加到 List 列表中。
                List.append(pic_url)
                #  将时间戳 t 增加 60 秒,然后继续循环
                t = t + 60
    return s
 
 
# 记录相关数据
def recommend(url):
    Re = []
    try:
        # 向网页发送一个请求并返回响应
        html = requests.get(url, allow_redirects=False)
    except error.HTTPError as e:
        return
    else:
        html.encoding = 'utf-8'
        # html文件解析,解析响应的文件内容,html.text 是 HTML 文档的源代码,
        # 'html.parser' 是解析器,用于指定如何解析 HTML 文档
        bsObj = BeautifulSoup(html.text, 'html.parser')
        # 找到页面中id为topsRS的div元素
        div = bsObj.find('div', id='topRS')
        # 从该div元素中找到所有a的标签,并提取其中文本内容
        if div is not None:
            listA = div.findAll('a')
            for i in listA:
                if i is not None:
                    Re.append(i.get_text())
        return Re
 
 
# 下载图片
def dowmloadPicture(html, keyword):
    # 记录已经下载的图片数量
    global num
    # 找到图片url
    # 正则表达式从 HTML 中提取所有包含图片 URL 的字符串。re.S 参数表示使正则表达式对大小写不敏感。
    # (.*?):这是一个捕获组,用于匹配括号内的内容。点号(.)表示匹配任意字符,*? 表示匹配任意数量的字符,匹配一个引号、匹配一个逗号
    # 查找 html 中所有以 "objURL" 开头,并且以双引号和逗号结尾的字符串,并将这些字符串作为匹配结果返回
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
    print('找到:' + keyword + '的图片,开始下载....')
    # 遍历图片的url
    for each in pic_url:
        print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))
        # 处理异常,主要处理图片下载失败的情况
        try:
            if each is not None:
                # 请问时间不能超过7s
                pic = requests.get(each, timeout=7)
            else:
                continue
        except BaseException:
            print('错误,当前图片无法下载')
            continue
        else:
            # 构建图片保存路径
            string = file + r'\\' + str(num) + '.jpg'
            # 以二进制写入模式打开新建文件
            fp = open(string, 'wb')
            # 将下载的图片内容写入文件
            fp.write(pic.content)
            # 关闭文件
            fp.close()
            # 已经下载一张图片加1
            num += 1
        # 检查是否已经下载所有需要下载的图片
        if num >= numPi:
            return
 
 
if __name__ == '__main__':  # 主函数入口
    # 模拟浏览器 请求数据 伪装成浏览器向网页提取服务,有的网站识别出你是python就会拒绝
    # 请求头是在发送http请求时,由客户端向服务器发送一些元数据,描述请求的特性和客户端的能力
    # 请求头通常由浏览器自动设置,也可由程序(python)脚本手动设置
    # 返回的文档语言,客户端和服务端建立一个持久的连接,客户端的身份,客户端是否愿意升级不安全的请求
    headers = {
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
        'Upgrade-Insecure-Requests': '1'
    }
 
    # 创建一个请求的会话
    A = requests.Session()
    # 设置头部信息
    A.headers = headers
    choice = int(input("请问需要搜索多类图片还是单类图片?如果是单类请输入0,如果是多类请输入1:"))
    if choice == int(0):
        word = input("输入要搜索的关键词:")
        numPi = int(input('输入要下载的数量:'))
        # 拼接路径
        url = 'https://image.baidu.com/search/flip?ct=201326592&cl=2&st=-1&lm=-1&nc=1&ie=utf-8&tn=baiduimage&ipn=r&rps=1&pv=&fm=rs1&word=' + word
 
        # 根据路径去查找
        total = Find(url, A)
        # 记录相关推荐图片
        Recommend = recommend(url)
        print('经过检测%s类图片共有%d张' % (word, total))
        file = makefile(word)

        t = 0
        tmp = url
    
        while t < numPi:
            try:
                url = tmp + str(t)
                result = requests.get(url, timeout=10)
                print(url)
            except error.HTTPError as e:
                print('网络错误,请调整网络后重试')
                t = t + 60
            else:
                dowmloadPicture(result.text, word)
                t = t + 60

    else: 
        tm = int(input('请输入每类图片的下载数量 '))
        numPi = tm
        line_list = []
        with open('./name.txt', encoding='utf-8') as file:
            line_list = [k.strip() for k in file.readlines()]  # 用 strip()移除末尾的空格
        for word in line_list:
            #url = 'https://image.baidu.com/search/flip?ct=201326592&cl=2&st=-1&lm=-1&nc=1&ie=utf-8&tn=baiduimage&ipn=r&rps=1&pv=&fm=rs1&word=' + word
            url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='
            tot = Find(url,A)
            Recommend = recommend(url)  # 记录相关推荐
            print('经过检测%s类图片共有%d张' % (word, tot))
            file = makefile(word)
            
            t = 0
            tmp = url
            while t < numPi:
                try:
                    url = tmp + str(t)
                    result = A.get(url, timeout=10, allow_redirects=False)
                    print(url)
                except error.HTTPError as e:
                    print('网络错误,请调整网络后重试')
                    t = t + 60
                else:
                    dowmloadPicture(result.text, word)
                    t = t + 60

            numPi = numPi + tm
        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片 的相关文章

随机推荐

  • 吸水间最低动水位标高_对《消水规》关于消防水池最低有效水位确定的理解

    消防水池是人工建造的供固定式或移动式消防水泵吸水的储水设施 根据 消防给水及消火栓系统技术规范 GB 50974 2014第4 3 9条规定 消防水池的出水管应保证消防水池的有效容积能全部被利用 消防水池的有效水深是设计最高水位至消防水池最
  • [1175]hive函数greatest、least多列取最大最小值

    文章目录 greatest函数 least函数 用多了 max min 今天刚好遇到了需要取连续6年中营收最大的逻辑 6列 greatest函数 取多列最大值 select greatest 99 0 73 73 存在 null 或者字符串
  • ld.exe: cannot find -l?eclipse上用C/C++时,如何链接静态库?

    对g 和静态库不熟悉的人可能会搞不清楚问题所在 因为我自己在网上很久找不到直接的解决方案 为了方便各大g 初学者学习 我将我的犯错经历和解决办法写在这里 节约时间 可以直接看最后的结果 犯错和解决经历 学习socket的使用的时候 想自己在
  • Canvas 原生实现图片涂抹打马赛克功能

    先看效果 上图是一段打码过后的代码截图 简单说一下实现思路 就是通过创建多个canvas 一个用来绘制原图 一个用来绘制全马赛克图 一个用来绘制笔迹或者叫打码的区域 最后一个canvas用来将三个canvas绘制到一个canvas之上 主要
  • 关于解决IDEA中git的commit无效的解决方法

    关于解决IDEA中git的commit无效的解决方法 在开发中我们偶尔会遇到点击idea中commit无效的情况 点击完commit后 进度条一闪而过缺没有将代码提交上去 下面是本人总结的几种方法 一 重启IDEA 重启大法 俗话说的好 重
  • 算法与数据结构技术书籍从入门到进阶推荐适合大神小白附技术书阅读方法论【附网盘链接】

    转载自某大佬博客 https pymlovelyq github io 2018 10 06 Algorithm 前言 技术书阅读方法论 一 速读一遍 最好在1 2天内完成 人的大脑记忆力有限 在一天内快速看完一本书会在大脑里留下深刻印象
  • ubuntu安装英伟达显卡驱动

    文章目录 1 通过PPA安装 2 手动安装 3 通过ubuntu官方方法安装 4 相关命令 1 通过PPA安装 1 卸载系统里低版本的英伟达驱动 sudo apt get purge nvidia 2 把显卡驱动加入PPA sudo add
  • redis 五种数据类型的底层数据结构

    为了拿捏 Redis 数据结构 我画了 40 张图 完整版 Redis 数据结构并不是指 String 字符串 对象 List 列表 对象 Hash 哈希 对象 Set 集合 对象和 Zset 有序集合 对象 因为这些是 Redis 键值对
  • Docker安装RabbitMQ

    1 首先确保自己的虚拟机安装了Docker环境 可以通过docker v 查看自己的docker是否安装了 docker v Docker未安装可以通过下面的教程安装Docker CentOS7安装Docker教程 2 通过命令安装Rabb
  • 现代文翻译成古文_把现代文翻译成古文诗词,太雅致了!

    1 今文 身不由己古译 向来心是看客心 奈何人是剧中人 2 今文 我们越来越陌生了古译 相達何必曾相识 再看君卿已陌路 3 今文 我也不想你 你也就别想我了 古译 我断不思量 你莫思量我 4 今文 物是人非 我们回不去了 古译 柳絮随风各西
  • 关于计算机视觉中的深度信息概念

    引用 https blog csdn net a1059682127 article details 80503378 https www zhihu com question 406919125 answer 1338670936 单独使
  • kettle抽取数据中文乱码

    kettle如何解决也有一两篇谈到在建数据库连接时加characterEncoding来解决 在kettle中 数据链接中添加属性 数据源和目标 都要添加
  • 使用Vue创建一个商品展示首页

    使用Vue创建项目实现一个商品展示首页 在这篇博客中 我们将使用Vue来创建一个简单的商品展示首页 我们已经有一个后端API提供了商品信息 接口地址为 http localhost 8080 api products 返回的数据格式是JSO
  • C++猜数字小游戏-通过循环实现

    C 猜数字小游戏 通过循环实现 题目 系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错提示玩家数字过大或过小 如果猜对恭喜玩家胜利 并且退出游戏 每局游戏只能猜5次 实现 通过循环和if判断 源码 include
  • 基于SUSAN算法的边缘检测方法研究(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 SUSAN算子原理 1 2 SUSAN边缘检测算法 2 运行结果 3 Ma
  • Temporary failure in name resolution

    在启动nexus war包时出现以下提示错误 2016 05 04 13 50 12 ERROR main net sf ehcache Cache Unable to set localhost This prevents creatio
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • Word里如何打出带有上下横杠的大写字母i

    换成新罗马就行了
  • Linux系统中关于/etc/rc.d/rc.local中部分命令不执行的问题

    最近遇到了个奇怪的问题 费了一番周折才最终解决 在此给遇到类似问题的同学提供一条思路 在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行 此时我们会想到利用文件 etc rc d rc local 按照正常逻辑 只需要将相应的
  • 通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片

    通过re requests urlib BeautifulSoup os模块实现从百度下载指定类别图片 包含代码逐行解析 import re 进行http请求的第三方库 import requests from urllib import