ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

python-mini-projects 实战:基于 Selenium + BeautifulSoup 的网站图片批量下载器

python-mini-projects 实战:基于 Selenium + BeautifulSoup 的网站图片批量下载器 示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载导读本文以 python-mini-projects 仓库中的 Download_images_from_website 示例项目 为核心完整讲解如何通过 ChromeDriver 驱动真实浏览器渲染页面再借助 BeautifulSoup 解析 DOM 中的img标签并批量下载图片。读完本文你将掌握一条Selenium 渲染页面 → 提取图片链接 → requests 下载到本地的完整技术链路并了解其底层源码实现、环境配置要点与常见坑点。一、项目概览从网页到本地的四步流水线该项目位于 projects/Download_images_from_website/整个爬取流程由三个 Python 模块协同完成模块职责Selenium ChromeDriver启动真实 Chrome 浏览器加载目标 URL获取渲染完成后的完整 DOM含 JavaScript 动态生成的内容BeautifulSouplxml 解析器从 HTML 中解析出所有带src属性的img标签requests逐个请求图片地址将二进制内容写入本地output目录对应到源码 scrap-img.py 中的三个核心函数get_url()负责渲染页面、get_img_links()负责解析图片链接、download_img()负责下载落盘。三者在main流程中串联执行构成了一个可复用的网页图片抓取最小实现。二、环境准备依赖安装与 ChromeDriver 获取2.1 Python 依赖仓库在 requirements.txt 中锁定了核心依赖selenium3.141.0需要说明的是源码 scrap-img.py 实际还导入了requests、os、time与bs4BeautifulSoup四个模块其中requests和bs4并未写入 requirements.txt。因此实际运行前建议一并安装pip install selenium3.141.0 requests beautifulsoup4 lxmllxml是 BeautifulSoup 指定的解析器源码中BeautifulSoup(res, lxml)速度优于 Python 内置的html.parser需单独安装。2.2 下载 ChromeDriver原文档 Readme.md 的第一步即为从 Chrome 官方渠道下载 ChromeDriver。配置时注意两点版本匹配ChromeDriver 的主版本号必须与本机 Chrome 浏览器版本一致否则 Selenium 启动浏览器时会报版本不匹配错误路径记录下载后解压得到chromedriver.exe请记下其完整绝对路径后续运行时需要手动输入例如原文档给出的E:\webscraping\chromedriver_win32\chromedriver.exe。兼容性提示源码 scrap-img.py 使用webdriver.Chrome(executable_path...)这是 Selenium 3.x 的经典 API在 Selenium 4 中该参数已被移除改由 Service 对象传入若升级 Selenium 大版本需同步改造此行代码。三、运行步骤三个交互输入完成抓取按照 Readme.md 的指引运行方式非常直接在项目目录下执行py scrap-img.pyWindows 下若使用其他 Python 环境也可替换为python scrap-img.py程序会提示Enter Path :输入 ChromeDriver 的完整路径例如E:\webscraping\chromedriver_win32\chromedriver.exe程序继续提示Enter URL :输入目标网页地址例如原文档示例https://dribbble.com/程序随后自动完成启动浏览器 → 打开页面 → 等待渲染 → 解析图片 → 在项目目录下创建output文件夹并逐个下载。终端会持续输出Downloading...全部完成后打印Download Complete!!。四、源码级原理剖析4.1get_url()用真实浏览器换取完整 DOMdef get_url(path, url): driver webdriver.Chrome(executable_pathr{}.format(path)) driver.get(url) print(loading.....) res driver.execute_script(return document.documentElement.outerHTML) return res这段代码scrap-img.py有三个值得注意的设计原始字符串r{}由于 Windows 路径含反斜杠如E:\webscraping\...直接嵌入字符串会被当作转义字符因此用r{}.format(path)将输入原样交给 ChromeDriver规避转义问题execute_script注入 JavaScriptreturn document.documentElement.outerHTML返回页面渲染完成后的完整 HTML 源码这一点是纯requests请求无法做到的——对 Dribbble 这类依赖 JS 动态渲染图片的站点只有浏览器执行完脚本后图片节点才会出现在 DOM 中主流程中的time.sleep(60)scrap-img.py 在拿到 HTML 后等待 60 秒为网络慢、图片懒加载的场景留出缓冲时间确保后续解析出的src链接真实有效。4.2get_img_links()BeautifulSoup 提取图片节点def get_img_links(res): soup BeautifulSoup(res, lxml) imglinks soup.find_all(img, srcTrue) return imglinks对应源码 使用find_all(img, srcTrue)精确筛选出带src属性的img标签天然过滤掉data-src懒加载或空 src 的节点。返回的是 Tag 对象列表后续通过img_link[src]取出真实图片地址。4.3download_img()扩展名识别与二进制落盘def download_img(img_link, index): try: extensions [.jpeg, .jpg, .png, .gif] extension .jpg for exe in extensions: if img_link.find(exe) 0: extension exe break img_data rq.get(img_link).content with open(output \\ str(index 1) extension, wb) as f: f.write(img_data) f.close() except Exception: pass对应源码 的处理逻辑是扩展名探测维护.jpeg/.jpg/.png/.gif四个白名单在 URL 字符串中查找扩展名并以此作为保存格式找不到时回退为.jpg流式写入rq.get(img_link).content一次性取得图片二进制以wb模式写入output目录文件名按顺序编号1.jpg、2.png、3.gif…异常吞没except Exception: pass让单个图片下载失败如 404、反爬拦截时不影响整体流程程序会跳过坏链接继续下载后续图片。4.4 主流程串联result get_url(path, url) time.sleep(60) img_links get_img_links(result) if not os.path.isdir(output): os.mkdir(output) for index, img_link in enumerate(img_links): img_link img_link[src] print(Downloading...) if img_link: download_img(img_link, index) print(Download Complete!!)主流程 先创建output目录已存在则跳过再遍历所有图片节点并下载整体调用链为ChromeDriver 渲染页面 → outerHTML → BeautifulSoup 解析 → img src 提取 → requests 下载 → output/ 目录落盘五、实战注意事项与可扩展方向5.1 已知局限源自源码结构相对路径图片无法下载代码直接用rq.get(img_link)请求src原值scrap-img.py若页面图片使用/images/a.png这类站点相对路径requests 会因缺少域名而请求失败。可推断改进方向是用urljoin将相对路径与当前页面 URL 拼接后再下载output目录固定输出目录硬编码为项目目录下的output多次运行会覆盖同名文件可考虑按时间戳或 URL 域名建立子目录单页抓取脚本只处理当前 URL不包含翻页、滚动加载等逻辑适合图片集中在首屏或单页的静态场景反爬与合规Dribbble 等站点可能对高频请求有限制实际使用时应控制频率、遵守目标站点 robots 协议与版权要求。5.2 可扩展方向将time.sleep(60)改为显式等待WebDriverWait 条件判断按需缩短等待时间扩展 download_img 支持webp、svg、avif等更多格式引入concurrent.futures多线程并发下载提升大批量图片的抓取速度为download_img增加重试与日志记录便于排查被跳过的失败链接。六、小结本文围绕 projects/Download_images_from_website/ 的 Readme.md 与 scrap-img.py完整还原了ChromeDriver 渲染 BeautifulSoup 解析 requests 下载的图片批量抓取方案。原文档三步操作装驱动 → 运行脚本 → 输入路径与 URL背后是 Selenium 对动态 DOM 的掌控、lxml 解析器的高效提取以及异常隔离带来的流程健壮性。对于想要掌握网页自动化抓取入门技术的开发者这是一个体量小、链路完整、便于二次改造的理想范本。赞分享示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载相关推荐LiveKit终极配置与部署指南5分钟搭建你的实时音视频服务器LiveKit终极配置与部署指南5分钟搭建你的实时音视频服务器 LiveKit是一个强大的开源WebRTC媒体服务器专为构建实时音视频应用而设计。无论你是想后端音视频即时通讯AI Agent使用 Selenium Headless Chrome 对指定网站整页截图python-mini-projects 快照工具实战解析使用 Selenium Headless Chrome 对指定网站整页截图python mini projects 快照工具实战解析 本文以 python m示例工程基于 CSV 批量发送 Gmail 邮件python-mini-projects 中 Send_email_from_csv 脚本实战解析基于 CSV 批量发送 Gmail 邮件python mini projects 中 Send_email_from_csv 脚本实战解析 本文围绕 pyth示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表