首页 > 编程语言 >入门级小白超实用的python爬虫爬取网页图片

入门级小白超实用的python爬虫爬取网页图片

时间:2024-09-14 19:26:19浏览次数:3  
标签:keyword python 爬取 URL 小白超 path os 图片

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

效果展示

代码运行后,输入关健字

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

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

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

准备阶段

环境配置

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

安装Python

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

 ​​https://www.python.org/

根据您的操作系统选择合适的版本进行下载和安装。安装过程中请注意勾选“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.com' + 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.com/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)

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

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

标签:keyword,python,爬取,URL,小白超,path,os,图片
From: https://blog.csdn.net/m0_64031432/article/details/142178008

相关文章

  • Python基础语法(2)
    顺序语句默认情况下,Python的代码执行顺序是按照从上到下的顺序,依次执行的print("1")print("2")print("3")执行结果一定为“123”,而不会出现“321”或者“132” 等,这种按照顺序执行的代码,我们称为顺序语句这个顺序是很关键的,编程是一件明确无歧义的事情,安排......
  • Python基础语法(1)下
    输入输出和用户交互程序需要和用户进行交互。用户把信息传递给程序的过程,称为"输入",也就是用户给计算机下命令就叫做输入。程序把结果展示给用户的过程,称为"输出",也就是计算机在向用户汇报工作。输入输出的最基本的方法就是控制台,用户通过控制台输入一些字符串,程序再通......
  • Python的Scapy库详解
    目录前言一、Scapy简介二、基本功能1.构建数据包2.发送与接收数据包3.捕获数据包三、高级功能1.协议栈与数据包叠加2.网络扫描3.数据包注入与攻击模拟四、应用场景五、总结前言Python的Scapy库是一个强大且灵活的网络数据包处理库,常用于网络安全、渗透测......
  • 基于python+flask框架的农民工综合信息管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着我国城市化进程的加速推进,农民工群体作为城市建设的重要力量,其规模日益庞大,对社会经济发展起到了不可替代的作用。然而,农民工的流动性......
  • 基于python+flask框架的社区公共卫生疫情防控管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球公共卫生事件的频发,特别是新冠疫情的爆发,社区作为疫情防控的第一线,其公共卫生管理能力直接关乎到疫情控制的成效与居民的生命安全......
  • 基于python+flask框架的乡镇医院门诊系统设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗卫生事业的快速发展和人民群众健康意识的不断提升,乡镇医院作为农村医疗服务体系的重要组成部分,其诊疗效率和服务质量直接关系到广......
  • [Python数据采集]Playwright爬虫数据采集代码示例!!值得深入学习代码
    【Playwright爬虫数据采集代码示例!!值得深入学习代码】为了提高反爬虫的稳定性,代理池和模拟真实用户行为是常见的优化手段。以下我将给出代理池的实现方式,并结合模拟真实用户行为的代码示例。1.代理池实现:通过代理池,可以定期切换IP,避免因同一个IP频繁请求而被封锁。代理池可......
  • 盘点一个Python自动化办公实战问题
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公实战的问题,问题如下:大佬们,我有个难度高的问题,我有个文件夹,里面呢有一堆文件,然后我要寻找至少2个关键字相同的文件,然后提取文件中第二列中的数字,第一列名称保留,譬如图片中,只要是有......
  • DuckDB简单使用及Python操作
    DuckDB简介DockDB官网DuckDB是一款开源免费类似Sqlite的嵌入式数据库,支持直接使用内存或单个文件作为数据库。DuckDB着重于数据处理和分析,是一个款OLAP(联机分析处理)类型的数据库,主要特点如下:开源免费,MIT协议功能完善,支持标准SQL、事务、二级索引等高性能,低消耗(内存/文件占用小)灵......
  • 2024年06月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析
    青少年软件编程(Python)等级考试试卷(一级)分数:100 题数:37一、单选题(共25题,共50分)1.在使用turtle绘制图形时,如果要控制小海龟移动到x坐标为200,y坐标为150的位置,以下代码能够实现效果的是?()A.turtle.go(150,200)B.turtle.go(200,150)C.turtle.goto(150,200)D.......