图像作为信息传播的重要载体,在日常生活和各行各业的应用越来越广泛。网络图片爬取成为了数据挖掘和分析领域的一项重要技术。本文将探讨在网络环境中爬取图片的实现步骤以及代码。
效果展示
代码运行后,输入关健字
等待片刻后桌面会自动创建一个名为picture的文件夹随后开始爬取数据,
等到爬取的数据足够是,可以自行停止代码的运行,随后查看爬取的图片,根据关键字在picture中创建子文件夹,不同的图片则会在相应的文件夹中。
这里我们进入小狗的文件夹查看网页爬取的照片
准备阶段
环境配置
首先,您需要确保您的计算机上安装了Python以及必要的库。这里假设您已经安装了Python 3.x。我这里使用的坂本为3.11。想要在终端运行的同学也可以自己去系统那里配置环境变量。
安装Python
如果您还没有安装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.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