文章目录
- 前言
- 1. 环境准备
- 1.1Python安装
- 1.2选择Python开发环境
- 1.3安装必要库
- 2. 编写爬虫代码
- 3. 代码解释
- 4. 注意事项
- 5. 进阶优化
前言
以下是一个使用 Python 编写爬虫来抓取网页图片的详细教程,将以requests库发送 HTTP 请求,BeautifulSoup库解析 HTML 页面为例进行介绍。
1. 环境准备
1.1Python安装
访问 Python 官方网站,根据你的操作系统(Windows、Mac 或 Linux)下载并安装 Python 3.x 版本。安装时勾选 “Add Python to PATH”,方便在命令行中使用 Python。
Python 3.11安装教程:https://blog.csdn.net/u014164303/article/details/145549489
Python 3.13安装教程:https://blog.csdn.net/u014164303/article/details/146024500
Python 3.11下载地址:https://pan.quark.cn/s/9c44793cb24c
Python 3.13下载地址:https://pan.quark.cn/s/bce37ebd7f70
1.2选择Python开发环境
PyCharm 社区版(免费)或专业版(需付费或申请教育版)。安装完成后,打开 PyCharm,创建一个新的项目,在项目设置中选择之前创建的虚拟环境作为项目的 Python 解释器。PyCharm 功能强大,提供代码自动补全、调试等功能,适合开发大型项目。
Pycharm安装教程:https://blog.csdn.net/u014164303/article/details/145674773
PyCharm下载地址:https://pan.quark.cn/s/5756c8cf8b2a
1.3安装必要库
在开始之前,你需要安装requests和beautifulsoup4库。可以使用以下命令进行安装:
pip install requests beautifulsoup4
2. 编写爬虫代码
import requests
from bs4 import BeautifulSoup
import os# 定义要抓取的网页 URL
url = 'https://example.com' # 替换为实际要抓取的网页 URL# 定义保存图片的文件夹
save_folder = 'downloaded_images'
if not os.path.exists(save_folder):os.makedirs(save_folder)# 发送 HTTP 请求获取网页内容
try:response = requests.get(url)response.raise_for_status() # 检查请求是否成功
except requests.RequestException as e:print(f"请求网页时出错: {e}")
else:# 使用 BeautifulSoup 解析 HTML 内容soup = BeautifulSoup(response.text, 'html.parser')# 查找所有的图片标签img_tags = soup.find_all('img')for img in img_tags:# 获取图片的 src 属性img_url = img.get('src')if img_url:# 处理相对 URLif not img_url.startswith('http'):img_url = url.rsplit('/', 1)[0] + '/' + img_urltry:# 发送请求下载图片img_response = requests.get(img_url)img_response.raise_for_status()# 提取图片文件名img_filename = os.path.join(save_folder, img_url.split('/')[-1])# 保存图片到本地with open(img_filename, 'wb') as f:f.write(img_response.content)print(f"成功下载图片: {img_filename}")except requests.RequestException as e:print(f"下载图片 {img_url} 时出错: {e}")
3. 代码解释
- 导入必要的库:requests库用于发送 HTTP 请求,BeautifulSoup库用于解析 HTML 页面,os库用于处理文件和文件夹操作。
定义要抓取的网页 URL 和保存图片的文件夹:将url替换为你实际要抓取的网页 URL,代码会自动创建一个名为downloaded_images的文件夹来保存下载的图片。 - 发送 HTTP 请求:使用requests.get()方法发送 GET 请求获取网页内容,并使用raise_for_status()方法检查请求是否成功。
- 解析 HTML 内容:使用BeautifulSoup解析 HTML 内容,查找所有的标签。
处理图片 URL:获取每个标签的src属性,处理相对 URL 使其成为完整的 URL。
下载图片:发送请求下载图片,并将图片内容保存到本地文件中。
4. 注意事项
反爬虫机制:许多网站都有反爬虫机制,可能会对频繁的请求进行限制或封禁 IP。为了避免这种情况,可以设置合适的请求头(如User-Agent),模拟浏览器行为,或者设置适当的请求间隔时间。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
图片链接有效性:有些图片链接可能是无效的或者指向其他资源,代码中已经进行了简单的错误处理,但在实际应用中可能需要更完善的处理逻辑。
法律合规:在进行网页抓取时,要确保遵守相关法律法规和网站的使用条款,不要进行非法或未经授权的抓取行为。
5. 进阶优化
如果需要处理动态加载的图片(例如使用 JavaScript 动态加载的图片),可以使用Selenium库结合浏览器驱动来模拟浏览器行为,获取完整的页面内容。以下是一个简单的示例:
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import os# 定义要抓取的网页 URL
url = 'https://example.com' # 替换为实际要抓取的网页 URL# 定义保存图片的文件夹
save_folder = 'downloaded_images'
if not os.path.exists(save_folder):os.makedirs(save_folder)# 创建浏览器驱动实例
driver = webdriver.Chrome() # 需要安装 Chrome 浏览器和对应的 ChromeDrivertry:# 打开网页driver.get(url)# 获取页面源代码page_source = driver.page_source# 使用 BeautifulSoup 解析 HTML 内容soup = BeautifulSoup(page_source, 'html.parser')# 查找所有的图片标签img_tags = soup.find_all('img')for img in img_tags:# 获取图片的 src 属性img_url = img.get('src')if img_url:# 处理相对 URLif not img_url.startswith('http'):img_url = url.rsplit('/', 1)[0] + '/' + img_urltry:# 发送请求下载图片img_response = requests.get(img_url)img_response.raise_for_status()# 提取图片文件名img_filename = os.path.join(save_folder, img_url.split('/')[-1])# 保存图片到本地with open(img_filename, 'wb') as f:f.write(img_response.content)print(f"成功下载图片: {img_filename}")except requests.RequestException as e:print(f"下载图片 {img_url} 时出错: {e}")
except Exception as e:print(f"发生错误: {e}")
finally:# 关闭浏览器driver.quit()
以上代码使用Selenium库打开网页,获取完整的页面源代码,然后再进行图片的抓取和下载。需要注意的是,使用Selenium需要安装对应的浏览器驱动(如 ChromeDriver)。