当前位置: 首页 > news >正文

Python爬虫实战:批量下载校园风光图

🎯 场景:学校官网的列表翻页 + 图片批量下载
🛠 工具:requests+BeautifulSoup4+ 随机延时反爬
📦 产出:图片自动保存到指定文件夹,命名格式序号-标题.jpg

一、项目背景

找到学生时代的作业,心血来潮重新又写了一遍。

关键还是定位标签,转成BeautifulSoup后,找到标签特征,不断通过find下探。把网页内容获取,网页内容解析,网页图片下载三个模块写成了三个方法,只要有下一页就不断下载。

找下一页时,发现下一页是部分替换,直接省下一大步。剩下的就是不断遍历,查找有没有下一页了

二、代码整体思路

步骤函数名作用
1️⃣getCpageNpage(url)请求当前页,解析HTML,提取下一页链接
2️⃣getImageUrl(soup)从当前页解析所有图片的URL + 标题
3️⃣downloadImage(page_url_dict, folder)遍历字典,逐张下载图片到指定文件夹
🔄while url:循环不断翻页,直到没有下一页为止

三、完整代码

import requests from bs4 import BeautifulSoup import os from time import sleep import random def getCpageNpage(url): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0' } page = requests.get(url=url, headers=headers) # 设置编码,要不然文本会显示乱码 page.encoding = "utf-8" soup = BeautifulSoup(page.text, 'html.parser') try: next_page_href = (soup.find('div', class_='right n_tupian') .find('div', class_='pb_sys_common pb_sys_normal pb_sys_style1') .find('span', 'p_next p_fun') .find('a')['href']) # 查看到当前网址与下一页网址的关系。当前网址最后一个"\"之后的内容进行替换,即可得到下一页网址 replace_str = url.split("/")[-1] next_page_url = url.replace(replace_str, next_page_href) except Exception as e: next_page_url = None return soup, next_page_url def getImageUrl(soup): div = soup.find('div', class_='right n_tupian') div_ul_li = div.find('ul').find_all('li') page_url_dict = {} for li in div_ul_li: title = li.find(class_='img').find("a")["title"] src = li.find(class_='img').find("img")["src"] page_url = "https://www.gzgs.edu.cn/" + src # print(title, page_url) page_url_dict[page_url] = title return page_url_dict def downloadImage(page_url_dict, folder="./images"): global index os.makedirs(folder, exist_ok=True) for img in page_url_dict: response = requests.get(img) # print(response.content) print(f"下载第 {index} 张{page_url_dict[img]}中,图片链接{img}") image_name = folder + "/" + str(index) + "-" + page_url_dict[img] + ".jpg" # 图片得用二进制字节流读取保存 with open(image_name, 'wb') as f: f.write(response.content) index += 1 sleep(round(random.uniform(0.5, 1), 2)) if __name__ == '__main__': url = '学校网址' folder = '保存路径' index = 1 while url: print(url) try: soup, url = getCpageNpage(url) except Exception as e: soup = "" print("网页请求失败") print(e) try: page_url_dict = getImageUrl(soup) except Exception as e: page_url_dict = "" print("获取url失败") print(e) try: downloadImage(page_url_dict, folder) except Exception as e: print("下载失败") print(e) sleep(round(random.uniform(2, 4), 1))
http://www.rkmt.cn/news/1418622.html

相关文章:

  • 百年名校焕新光智底座,华为“领航”光智共融
  • 打破大模型 KV Cache 魔咒:一种让跨模型 Agent 缓存 99% 命中的动态工具注入方案
  • Windows电脑也能玩转AI大模型!6G显存就能本地部署,免费无限用!
  • 3D点云处理新思路:ParSeNet如何用“聚类+拟合”两阶段网络搞定复杂曲面重建?
  • 用鼠标单击我的电脑桌面图标或单击文件夹会自动变成重命名状态
  • Unity 2019.3+ 项目从内置管线迁移到URP的保姆级避坑指南(含材质修复)
  • 别再只用欧氏距离了!用Python实战Hausdorff距离,搞定图像匹配与异常检测
  • 不只是安装:用ArcSWAT做水文分析前,你最好先调整好这3个界面设置
  • Majorana量子码原理与容错计算实践指南
  • 别再手动调动画了!用Unity Timeline + Animation Track制作过场动画的5个高效技巧
  • UGV多传感器融合:时钟同步与标定技术解析
  • 【免费领】历史典故系列Scratch源码《投鼠忌器》+ 6.1 儿童节源码
  • 终极免费.brd文件查看器:OpenBoardView完整解决方案
  • 东北大学 Open6G 被指定为 AI-RAN 联盟认可的实验室
  • 从OCR到工业质检:图像骨架提取(Thinning)的隐藏技能与实战避坑指南
  • 别再问卖家了!手把手教你用ESP-IDF和esptool查询ESP32的Flash和PSRAM大小(附代码)
  • Python描述符协议深入
  • 告别Jenkins手动扫描!手把手教你用CoBOT SAST搭建自动化代码安全流水线
  • Unity TextMeshPro字体突然不显示?别慌,可能是你的动态字体图集满了(附三种解决方案)
  • Win10安装报‘缺驱动’?可能是你的U盘启动盘制作工具该升级了(附最新Ventoy/Rufus避坑指南)
  • 宿舍网速跑不满?可能是PPPoE的锅!实测OpenWrt切换DHCP+深澜认证,轻松跑满校园百兆宽带
  • 跟AI说话这件事,芯片工程师可能一直做错了
  • 告别HAL库默认初始化:手写STM32 RTC驱动实现串口终端时间设置与掉电记忆
  • Altium Designer实战:用xSignals搞定DDR内存的Fly-By等长布线(附详细步骤)
  • 火爆分享Taotoken在个人项目中的多模型灵活调用实践
  • 毕业设计用K8s智能调度器:基于DQN的Go语言插件化实现
  • 从彩票赔率到保险定价:手把手教你用‘数学期望’做日常决策分析
  • QT开发避坑指南:隐藏标题栏后窗口拖不动?手把手教你重写鼠标事件
  • Cadence Virtuoso实战:手把手教你完成一个完整的BG带隙基准电压源版图(从原理图到GDSII)
  • 16.Hermes缺的,可能就是这个Workspace