首页 > 编程语言 >【Python爬虫】批量爬取图片的简单案例

【Python爬虫】批量爬取图片的简单案例

时间:2024-08-24 20:17:26浏览次数:9  
标签:return Python self 爬虫 爬取 URL url image 图片

@

目录


1.原理

网页中的图片有自己的URL,访问这些URL可以直接得到图片,譬如,访问下面这个URL,你就能得到一张图片:

/i/ll/?i=a3bad4725ba94301b7cba7dd8209fea4.png#pic_center

所以,批量爬取图片的过程,就是批量获取URL的过程

2.寻找批量的图片URL的储存地址

  • 各个网站批量获得图片URL的方式略有不同,此处先以必应举例。

2.1 百度

  • 打开百度进行图片搜索,并按下F12打开开发者模式

在这里插入图片描述

  • 在更多工具中打开“网络”

在这里插入图片描述

  • 找到这类请求

在这里插入图片描述

  • 相应的描述如图

在这里插入图片描述

  • 事实上,百度图片的URL信息都储存在这类请求中。这类请求的完整URL如下:
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=9612443976471669297&ipn=rj&ct=201326592&is=&fp=result&fr=&word=%E5%B7%A5%E7%A8%8B%E5%B8%88&queryWord=%E5%B7%A5%E7%A8%8B%E5%B8%88&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn=30&rn=30&gsm=1e&1681996706325=
  • 其中的pn参数,决定了展示的图片个数,且是30的倍数
  • queryWord参数和word参数,是搜索的关键词
  • 访问这个URL,会得到如下杂乱的信息

在这里插入图片描述

  • 只要把这些信息进行恰到的处理,就可以从中提取出所有图片的URL

2.2 搜狗

  • 搜狗与百度存储图片URL的请求头名字不同,如下:

在这里插入图片描述

2.3 必应

必应存储图片URL的请求头如下:
在这里插入图片描述

2.4 总结

  • 只要找到了网站批量存储图片URL的请求头,就可以通过访问这个请求头,获得其中的文本数据。接下来,我将以必应为例,讲解如何从杂乱的信息中,批量提取图片URL。

3.处理存储图片URL的请求头

  • 上文中我们提及,这类请求头中的信息非常的杂乱。但是,我们可以用正则化筛选出图片的URL,如图:

在这里插入图片描述
在这里插入图片描述

  • 可以看到,通过这个正则表达式,所有图片的URL都被提取出来

4.完整demo

有了批量的图片URL,下载已经易如反掌。使用urlretrieve函数可以直接将远程数据下载到本地。详情请看接下来的完整demo:

# Created by Han Xu
# email:[email protected]
import requests
import urllib.request
import urllib.parse
import os
import re

class Spider_bing_image():
    def __init__(self):
        """
        @:brief
        @:return
        """
        self.path=input("type in the path where you want to reserve the images:")
        self.url = 'https://www4.bing.com/images/async?'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48'}
        self.keyword = input("type in the keywords used to search in bing:")
        self.paginator = int(input("Type in the number of pages you want.Each page has almost 30 images:"))

    def get_urls(self):
        """
        @:brief Get the URLs that you need to visit.
        @:return return a list of the URLs
        """
        keyword = urllib.parse.quote(self.keyword)
        params = []
        for i in range(1, self.paginator + 1):
            params.append(
                "q={}&first={}&count=35&cw=1233&ch=946&relp=35&datsrc=I&layout=RowBased_Landscape&apc=0&mmasync=1&dgState=x*303_y*1355_h*185_c*1_i*36_r*8&IG=6A228D01DCE044E685557DE143D55D91&SFX=2&iid=images.5554".format(
                    keyword,30 * i))
        urls = []
        for i in params:
            urls.append(self.url + i)
        return urls


    def get_path(self):
        """
        @:brief Get the path where you want to reserve the images.
        @:return
        """
        dirname="./"+self.path
        dirname_origin = dirname
        int_index = 0
        while(True):
            IsExist = os.path.exists(dirname)
            if (IsExist==False):
                os.mkdir(dirname)
                IsCreate=True
                break
            else:
                int_index+=1
                dirname=dirname_origin+"({})".format(int_index)

        return dirname+"/"

    def get_image_url(self, urls):
        """
        @:brief Get the URLs of images.
        @:return a list of URLs of images
        """
        image_url = []
        pattern_string="http[^%&]+.jpg"
        pattern = re.compile(pattern=pattern_string)
        for url in urls:
            url_txt = requests.get(url, headers=self.headers).text
            url_list=pattern.findall(url_txt)
            for i in url_list:
                if i:
                    image_url.append(i)
        return image_url

    def get_image(self,image_url):
        """
        @:brief download the images into the path you set just
        @:return
        """
        m = 1
        for img_url in image_url:
            #定义一个flag用于判断下载图片是否异常
            flag=True
            try:
                #urlretrieve() 方法直接将远程数据下载到本地
                print("第{}张图片的URL是{}".format(m,img_url))
                print("保存于{}".format(os.getcwd()+self.path[1:]))
                urllib.request.urlretrieve(img_url, self.path + str(m) + '.jpg')
            except BaseException as error:
                    flag=False
                    print(error)
            if(flag):
                #下载完成提示
                print('**********第'+str(m)+'张图片下载完成********')
                #每下载完后一张,m累加一次
                m = m + 1
        print('下载完成!')
        return

    def __call__(self, *args, **kwargs):
        """
        @brief the constrcution of the class
        @:return
        """
        self.path=self.get_path()
        urls = self.get_urls()
        image_url = self.get_image_url(urls)
        self.get_image(image_url)
        return

本文由博客一文多发平台 OpenWrite 发布!

标签:return,Python,self,爬虫,爬取,URL,url,image,图片
From: https://www.cnblogs.com/UnderTurrets/p/18378194

相关文章

  • Python 潮流周刊#66:Python 的预处理器(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,1则音视频,全文2100字。以下是本期摘要:......
  • 基于python+flask框架的物流管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和全球贸易的日益紧密,物流行业已成为现代经济不可或缺的重要组成部分。然而,传统物流管理模式在应对海量订单、复杂......
  • 基于python+flask框架的中小学生心理平台管理系统的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着社会竞争的加剧和生活节奏的加快,中小学生的心理健康问题日益凸显,成为社会各界关注的焦点。学生面临着学业压力、人际关系困扰、......
  • 基于python+flask框架的在线课程查询管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着前所未有的变革。在线教育以其灵活性、便捷性和资源共享的优势,逐渐成为人们获取知识的重要途径......
  • 基于python+flask框架的金融投资管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着金融市场的日益繁荣与复杂化,个人及机构投资者对于金融投资管理的需求日益增长。传统的手工管理方式已难以满足投资者对投资信息实时性......
  • 基于python+flask框架的基于Web的社区失物招领系统的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,社区作为人们日常生活的重要组成部分,其内部的物品遗失与寻找问题日益凸显。传统的失物招领方式往往依赖于社区公告板......
  • 基于python+flask框架的基于多模态医学知识的医疗诊断专家系统设计与实现(开题+程序+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗技术的不断进步和医疗数据量的急剧增长,医学知识的复杂性和多样性日益凸显。传统的医疗诊断主要依赖于医生的经验和专业知识,但在面......
  • 基于python+flask框架的医院医疗设备维修管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗技术的不断进步,医院所配备的医疗设备日益复杂和精密,这些设备在提升医疗服务质量的同时,也对设备的维护与管理提出了更高要求。然而......
  • Python编程 - 函数基础
    前言上篇文章咱们主要讲了Python的容器,容器主要有列表,元组,集合和字典,接下来讲讲函数,函数也是Python中也是很重要的。一、函数的定义函数就是具有一定功能的代码块,以下就是最简单的函数;defprint_info():print("测试")定义函数后还需要通过"函数名()"调用该函数,函数才......
  • C++调用Python和numpy第三方库计算MFCC音频特征实现封装发布
    目录项目简介程序/数据集下载环境准备执行步骤1.新建python虚拟环境2.虚拟环境运行下python代码3.迁移虚拟环境4.编写Cmakelists.txt5.编写C++代码6.编译项目7.测试项目简介深度学习程序的边缘部署以性能绝佳的C++为主(⊙﹏⊙),但遇到项目开发周期短,则以功能优先,一些复杂的算法和......