翼度科技»论坛 编程开发 python 查看内容

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

14

主题

14

帖子

42

积分

新手上路

Rank: 1

积分
42
@
目录

1.原理

网页中的图片有自己的URL,访问这些URL可以直接得到图片,譬如,访问下面这个URL,你就能得到一张图片:
  1. https://img-blog.csdnimg.cn/a3bad4725ba94301b7cba7dd8209fea4.png#pic_center
复制代码
所以,批量爬取图片的过程,就是批量获取URL的过程
2.寻找批量的图片URL的储存地址


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


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


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


  • 找到这类请求


  • 相应的描述如图


  • 事实上,百度图片的URL信息都储存在这类请求中。这类请求的完整URL如下:
  1. 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:
  1. # Created by Han Xu
  2. # email:736946693@qq.com
  3. import requests
  4. import urllib.request
  5. import urllib.parse
  6. import os
  7. import re
  8. class Spider_bing_image():
  9.     def __init__(self):
  10.         """
  11.         @:brief
  12.         @:return
  13.         """
  14.         self.path=input("type in the path where you want to reserve the images:")
  15.         self.url = 'https://www4.bing.com/images/async?'
  16.         self.headers = {
  17.             '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'}
  18.         self.keyword = input("type in the keywords used to search in bing:")
  19.         self.paginator = int(input("Type in the number of pages you want.Each page has almost 30 images:"))
  20.     def get_urls(self):
  21.         """
  22.         @:brief Get the URLs that you need to visit.
  23.         @:return return a list of the URLs
  24.         """
  25.         keyword = urllib.parse.quote(self.keyword)
  26.         params = []
  27.         for i in range(1, self.paginator + 1):
  28.             params.append(
  29.                 "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(
  30.                     keyword,30 * i))
  31.         urls = []
  32.         for i in params:
  33.             urls.append(self.url + i)
  34.         return urls
  35.     def get_path(self):
  36.         """
  37.         @:brief Get the path where you want to reserve the images.
  38.         @:return
  39.         """
  40.         dirname="./"+self.path
  41.         dirname_origin = dirname
  42.         int_index = 0
  43.         while(True):
  44.             IsExist = os.path.exists(dirname)
  45.             if (IsExist==False):
  46.                 os.mkdir(dirname)
  47.                 IsCreate=True
  48.                 break
  49.             else:
  50.                 int_index+=1
  51.                 dirname=dirname_origin+"({})".format(int_index)
  52.         return dirname+"/"
  53.     def get_image_url(self, urls):
  54.         """
  55.         @:brief Get the URLs of images.
  56.         @:return a list of URLs of images
  57.         """
  58.         image_url = []
  59.         pattern_string="http[^%&]+.jpg"
  60.         pattern = re.compile(pattern=pattern_string)
  61.         for url in urls:
  62.             url_txt = requests.get(url, headers=self.headers).text
  63.             url_list=pattern.findall(url_txt)
  64.             for i in url_list:
  65.                 if i:
  66.                     image_url.append(i)
  67.         return image_url
  68.     def get_image(self,image_url):
  69.         """
  70.         @:brief download the images into the path you set just
  71.         @:return
  72.         """
  73.         m = 1
  74.         for img_url in image_url:
  75.             #定义一个flag用于判断下载图片是否异常
  76.             flag=True
  77.             try:
  78.                 #urlretrieve() 方法直接将远程数据下载到本地
  79.                 print("第{}张图片的URL是{}".format(m,img_url))
  80.                 print("保存于{}".format(os.getcwd()+self.path[1:]))
  81.                 urllib.request.urlretrieve(img_url, self.path + str(m) + '.jpg')
  82.             except BaseException as error:
  83.                     flag=False
  84.                     print(error)
  85.             if(flag):
  86.                 #下载完成提示
  87.                 print('**********第'+str(m)+'张图片下载完成********')
  88.                 #每下载完后一张,m累加一次
  89.                 m = m + 1
  90.         print('下载完成!')
  91.         return
  92.     def __call__(self, *args, **kwargs):
  93.         """
  94.         @brief the constrcution of the class
  95.         @:return
  96.         """
  97.         self.path=self.get_path()
  98.         urls = self.get_urls()
  99.         image_url = self.get_image_url(urls)
  100.         self.get_image(image_url)
  101.         return
复制代码
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/UnderTurrets/p/18378194
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具