当前位置: 首页 > 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.jsqmd.com/news/907319/

相关文章:

  • 10427条密码产品证书全部收集到,我发现几个数据跟认知完全对不上
  • 如何查物种的12S基因片段是否存在于NCBI公共数据库?
  • 别再傻傻用软件SPI了!实测STM32硬件SPI驱动GC9A01屏幕,速度提升10倍(附完整代码)
  • 打破大模型 KV Cache 魔咒:一种让跨模型 Agent 缓存 99% 命中的动态工具注入方案
  • 从音响制造到AI家庭娱乐生态:不见不散AI智能K歌音响亮相第二十届深圳国际金融博览会
  • 百年名校焕新光智底座,华为“领航”光智共融
  • Windows电脑也能玩转AI大模型!6G显存就能本地部署,免费无限用!
  • 北斗导航“指路”申通西安转运中心让特产寄递跑出“加速度”
  • 3D点云处理新思路:ParSeNet如何用“聚类+拟合”两阶段网络搞定复杂曲面重建?
  • Arduino电子钢琴DIY:从电路设计到C++编程的嵌入式音乐项目实践
  • 用鼠标单击我的电脑桌面图标或单击文件夹会自动变成重命名状态
  • Unity 2019.3+ 项目从内置管线迁移到URP的保姆级避坑指南(含材质修复)
  • 别只盯着地图!深度解析ArcGIS Pro内容窗格的5个隐藏选项卡(选择、编辑、捕捉…)
  • 手把手教你用阿里云服务器本地部署AWS DeepRacer训练环境(避坑指南)
  • 量子采样经典算法:突破NISQ时代组合优化瓶颈
  • 0104摩尔定律死亡终审:性能提升唯一路径——放弃几何微缩,转向场域升维+时间重构
  • 亚控组态数据导出踩坑实录:报表保存为Excel时文件名乱码、数据错位的解决办法
  • docker 实战:将一个多组件应用完整容器化
  • 新手也能搞定的TPS5430电源设计:从24V到15V,手把手教你选对每个元器件(附完整BOM清单)
  • 别再只用欧氏距离了!用Python实战Hausdorff距离,搞定图像匹配与异常检测
  • Unity游戏特效实战:用LineRenderer复刻红警磁暴闪电(附完整C#源码)
  • ArcMap新手必看:三种要素选择方法(按属性、位置、图形)的保姆级图文教程
  • 不只是安装:用ArcSWAT做水文分析前,你最好先调整好这3个界面设置
  • 从实验室到产线:Imatest枯叶图在摄像头批量质检中的实战应用与自动化脚本思路
  • Arm CoreLink NIC-400与NI/NoC动态调频技术详解
  • STM32CubeMX外部中断实战:从按键消抖到串口打印,一个完整项目带你避坑
  • Majorana量子码原理与容错计算实践指南
  • 别再手动调动画了!用Unity Timeline + Animation Track制作过场动画的5个高效技巧
  • 0105【天尊法典】晶体管微缩路径全域锁死:脱离尺寸缩减,算力提升的全域实证与唯一解法
  • Sora 2多视角时空对齐难题攻克,360°视频生成延迟降至117ms——内部Benchmark独家解析