利用python批量爬取百度图片的详细步骤及示例代码介绍

在信息爆炸的时代,很多人在工作学习中有批量获取百度上特定类别的图片的需求。掌握这种爬取方法,能使你的图片收集工作收到事半功倍的效果。下面我会详细介绍其实现步骤。

设置类别名字

在爬取百度任何类别的图片之前,首先要做的是明确你想要的类别名称。要是你是一名设计工作者,或许会需要“自然风光”“卡通形象”这类的类别;要是你是历史爱好者,“古建筑”“古文物”等便是合适的选择。精确地设置类别名称,能够让后续的爬取工作目标清晰。

同时,要留意类别名字的表述,做到简洁又准确。比如说,把“可爱风格的猫咪图片”简化成“可爱猫咪”,如此一来,既方便后续编写代码,又有助于搜索引擎识别,还能提高爬取效率。

设置类别数目

设置每一类别的图片数量相当重要。这由你的实际需求决定。比如说做样本研究,每类或许只需100到200张图片;要是用于大数据训练,每类可能就得要上千张。拿一个宠物行为研究项目来讲,为了分析不同品种狗的行为特点,可能会给每个狗品种爬取500张图片。

确定数量的时候,要考虑网站的反爬机制,还要考虑网络负载。要是设置的数量过大,可能会引起百度的反爬限制,进而导致爬取失败。所以初次尝试时,可以适当设置较小的数量,等熟悉流程后再根据需求调整。

准备txt文件

编辑一个txt文件,将其命名为name.txt,这是整个爬取工作的重要环节。你需要在这个文件里输入你想要爬取的类别,这些类别是爬取时的关键字。比如你想爬取“花卉”“鸟类”等图片,就在文件里依次输入“花卉”“鸟类”。

并且,要确保txt文件与源代码处在同一个目录里。这是由于在代码运行期间,程序需要从txt文件读取关键字信息。要是两者不在同一个目录,程序就没办法准确找到文件。如此一来,便会致使爬取失败。所以一定要仔细检查并操作。

图片[1]-利用python批量爬取百度图片的详细步骤及示例代码介绍-东山笔记

源代码准备

实现批量爬取图片,源代码是核心。当下,有多种编程语言能实现此功能,比如Python。Python有丰富的库,其中Requests可用于发送网络请求,BeautifulSoup能用于解析网页内容。借助这些库编写的代码,能灵活控制爬取过程。

要确保源代码准确无误且具备兼容性,下载的代码或自己编写的代码都要经过测试,查看能否正常运行,还要检查是否契合你的需求。要是代码是从网上获取的,还得留意其版权以及使用范围,防止引发法律问题。

代码调试运行

编写好源代码后,不要立刻进行大规模爬取,而是要先开展调试运行。要选择少量类别以及较少数量的图片来进行测试,比如说选择两个类别,每个类别仅爬取10张图片。通过这样做,能够迅速发现代码中有可能存在的问题,像是网络连接错误、关键字识别错误等等。

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 13 21:35:34 2020
@author: ydc
"""
import re
import requests
from urllib import error
from bs4 import BeautifulSoup
import os
num = 0
numPicture = 0
file = ''
List = []
def Find(url, A):
  global List
  print('正在检测图片总数,请稍等.....')
  t = 0
  i = 1
  s = 0
  while t < 1000:
    Url = url + str(t)
    try:
      # 这里搞了下
      Result = A.get(Url, timeout=7, allow_redirects=False)
    except BaseException:
      t = t + 60
      continue
    else:
      result = Result.text
      pic_url = re.findall('"objURL":"(.*?)",', result, re.S) # 先利用正则表达式找到图片url
      s += len(pic_url)
      if len(pic_url) == 0:
        break
      else:
        List.append(pic_url)
        t = t + 60
  return s
def recommend(url):
  Re = []
  try:
    html = requests.get(url, allow_redirects=False)
  except error.HTTPandroidError as e:
    return
  else:
    html.encoding = 'utf-8'
    bsObj = BeautifulSoup(html.text, 'html.parser')
    div = bsObj.find('div', www.cppcns.comid='topRS')
    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
  # t =0

图片[2]-利用python批量爬取百度图片的详细步骤及示例代码介绍-东山笔记

pic_url = re.findall('"objURL":"(.*?)",', html, re.S) # 先利用正则表达式找到图片url print('找到关键词:' + keyword + '的图片,即将开始下载图片...') for each in pic_url: print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each)) try: if each is not None: pic = requests.get(each, timeout=7) else: continue except BaseException: print('错误,当前图片无法下载') continue else: string = file + r'\' + keyword + '_' + http://www.cppcns.comstr(num) + '.jpg' fp = open(string, 'wb') fp.write(pic.content) fp.close() num += 1 if num >= numPicture: return if __name__ == '__main__': # 主函数入口 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 ############################### tm = int(input('请输入每类图片的下载数量http://www.cppcns.com ')) numPicture = 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?tn=baiduimage&ie=utf-8&word=' + word + '&pn=' tot = Find(url, A) Recommend = recommend(url) # 记录相关推荐 print('经过检测%s类图片共有%d张' % (word, tot)) file = word + '文件' y = os.path.exists(file) if y == 1: print('该文件已存在,请重新输入') file = word + '文件夹2' os.mkdir(file) else: os.mkdir(file) t = 0 tmp = url while t < numPicture: try: url = tmp + str(t) # result = requests.get(url, timeout=10) # 这里搞了下 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 # numPicture = numPicture + tm print('当前搜索结束,感谢使用')

调试时,需详细记录错误信息,依据错误提示逐步排查代码并修改。要反复测试,直到代码能准确且稳定地爬取图片。调试结束后,再依照实际需求调整类别与数量,然后正式开展大规模的图片爬取工作。

注意事项与拓展

爬取图片的时候,必须遵守法律法规以及网站规定。百度存在自身的反爬虫机制与使用协议,过度频繁地爬取,有可能导致IP地址被封禁。并且,要是将爬取到的图片用于商业用途,就得保证有合法的版权来源。

它还具备拓展功能,例如能够对爬取到的图片开展分类整理工作,进行数据清洗,将重复或质量不高的图片去除。它还可以与机器学习算法相结合,针对图片实施特征提取以及分析操作,从而让爬取到的数据发挥出更大的价值。

看完这些内容后,你是不是已经迫不及待,准备用代码批量爬取百度图片了?要是有问题,欢迎在评论区留言,可别忘了点赞并分享这篇文章!

© 版权声明
THE END
喜欢就支持一下吧
分享