admin 管理员组

文章数量: 887017

图像作为信息传播的重要载体,在日常生活和各行各业的应用越来越广泛。网络图片爬取成为了数据挖掘和分析领域的一项重要技术。本文将探讨在网络环境中爬取图片的实现步骤以及代码。

效果展示

代码运行后,输入关健字

等待片刻后桌面会自动创建一个名为picture的文件夹随后开始爬取数据,

等到爬取的数据足够是,可以自行停止代码的运行,随后查看爬取的图片,根据关键字在picture中创建子文件夹,不同的图片则会在相应的文件夹中。

这里我们进入小狗的文件夹查看网页爬取的照片

准备阶段

环境配置

首先,您需要确保您的计算机上安装了Python以及必要的库。这里假设您已经安装了Python 3.x。我这里使用的坂本为3.11。想要在终端运行的同学也可以自己去系统那里配置环境变量。

安装Python

如果您还没有安装Python,可以从官网下载安装包:

 ​​https://www.python/

根据您的操作系统选择合适的版本进行下载和安装。安装过程中请注意勾选“Add Python to PATH”选项,以便在命令行中直接使用Python。

安装必要的库

接下来,您需要安装几个库requests, beautifulsoup4 和 lxml这些库可以通过pip安装。打开命令提示符或终端(cmd或者直接到),然后输入以下命令:

pip install requests beautifulsoup4 lxml

这将安装用于发送HTTP请求的requests库,用于解析HTML文档的beautifulsoup4 库及其解析器lxml

创建Python文件

打开一个文本编辑器或者IDE(如VSCode、PyCharm等),这里我使用的是PyCharm。首先新建一个Python文件,比如命名为baidu_image_crawler.py

编写爬虫代码:

 导入模块

import os
import requests
import urllib.parse
from bs4 import BeautifulSoup
import re

这部分代码导入了必要的模块:

  • os:用于处理文件路径。
  • requests:用于发送HTTP请求。
  • urllib.parse:用于URL编码。
  • BeautifulSoup:用于解析HTML文档。
  • re:用于正则表达式匹配。

全局变量初始化

ImageCount = 0

这里定义了一个全局变量ImageCount,用来记录下载的图片数量。

定义函数 GetPageURL

def GetPageURL(URLStr):
    # 获取一个页面的所有图片的URL+下页的URL
    if not URLStr:
        print('现在是最后一页啦!爬取结束')
        return [], ''
    try:
        header = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
        }
        response = requests.get(URLStr, headers=header)
        response.encoding = 'utf-8'
        html = response.text
    except Exception as e:
        print("err=", str(e))
        return [], ''

    # 使用正则表达式提取图片URL
    ImageURL = re.findall(r'"objURL":"(.*?)",', html, re.S)

    # 使用BeautifulSoup解析HTML,提取下一页的URL
    soup = BeautifulSoup(html, 'html.parser')
    NextPageURLS = soup.find('a', class_='n', text='下一页')
    if NextPageURLS:
        NextPageURL = 'http://image.baidu' + NextPageURLS['href']
    else:
        NextPageURL = ''

    return ImageURL, NextPageURL

此函数用于获取一个页面中的所有图片URL以及下一页的链接。具体步骤如下:

  • 发送GET请求到指定URL。
  • 解析返回的HTML,提取图片URL和下一页链接。

定义函数 DownLoadImage

def DownLoadImage(pic_urls, ImageFilePath):
    """给出图片链接列表, 下载所有图片"""
    global ImageCount
    for i, pic_url in enumerate(pic_urls):
        try:
            pic = requests.get(pic_url, timeout=15)
            ImageCount += 1
            string = os.path.join(ImageFilePath, f"{ImageCount}.jpg")
            with open(string, 'wb') as f:
                f.write(pic.content)
                print(f'已下载第{ImageCount}张图片: {pic_url}')
        except Exception as e:
            print(f'下载第{ImageCount}张图片失败: {e}')
            ImageCount -= 1
            continue

这是主爬虫函数,接受一个关键词参数,负责整个爬取流程。主要工作包括:

  • 获取用户的桌面路径,并创建保存图片的目录。
  • 创建以关键词命名的子文件夹。
  • 初始化爬取标志和起始URL。
  • 循环获取图片URL并下载图片,直到没有下一页为止。

定义函数 CreateDirectory

def CreateDirectory(path):
    """创建目录,如果不存在的话"""
    if not os.path.exists(path):
        os.makedirs(path)

此函数检查给定路径是否存在,如果不存在则创建该目录。

定义函数 CrawlPicture

def CrawlPicture(keyword):

    # 获取用户的桌面路径,并创建保存图片的目录
    desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop')
    picture_path = os.path.join(desktop_path, 'picture')
    CreateDirectory(picture_path)

    # 创建以关键字命名的子文件夹
    keyword_path = os.path.join(picture_path, keyword)
    CreateDirectory(keyword_path)

    # 初始化爬取标志
    CrawlFlag = True
    NextPageURL = f"https://image.baidu/search/flip?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word={urllib.parse.quote(keyword, safe='/')}"

    while CrawlFlag:
        ImageURL, NextPageURL = GetPageURL(NextPageURL)
        if ImageURL:
            DownLoadImage(list(set(ImageURL)), keyword_path)
        if not NextPageURL:
            CrawlFlag = False

这是主爬虫函数,接受一个关键词参数,负责整个爬取流程。主要工作包括:

  • 获取用户的桌面路径,并创建保存图片的目录。
  • 创建以关键词命名的子文件夹。
  • 初始化爬取标志和起始URL。
  • 循环获取图片URL并下载图片,直到没有下一页为止。

主函数

if __name__ == '__main__':
    keyword = input("请输入要爬取的关键词: ")
    CrawlPicture(keyword)

这是程序的入口点,当直接运行该脚本时执行。它从用户那里获取一个关键词,然后启动爬虫。

这段代码实现了一个基本的爬虫,能够根据用户输入的关键词爬取百度图片搜索的结果,并将图片保存到用户的桌面上的一个特定目录里。

本文标签: 爬虫 入门级 网页 图片 python