学妹问我:怎么从网页下载所有图片?我答:天机不可泄露

Posted 刘润森!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学妹问我:怎么从网页下载所有图片?我答:天机不可泄露相关的知识,希望对你有一定的参考价值。

@Author:Runsen

最近,有一个学妹关注我,想让我帮她把一个网页的所有图片下载下来。

正所谓,私信找我,那是看得起我,虽然不知道是男还是女,这不,我就解决了这个简单的问题。

如果您曾经想在某个网页上下载所有图像?那么本次教程中,将带你学习如何在某个网页上下载所有图像。

这里,我选择CSDN的首页吧:

在这里插入图片描述
首先,我们需要一些Python依赖模块,让我们安装它们:

pip install requests bs4 tqdm

打开一个新的Python文件并导入必要的模块:

import requests
import os
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin, urlparse

首先,我们需要做一个URL验证器,主要是确保传递的URL是一个有效的URL,因为有些网站将编码数据放在URL的位置。

def is_valid(url):
    """
    检查url是否为有效的url。
    """
    parsed = urlparse(url)
    return bool(parsed.netloc) and bool(parsed.scheme)

urlparse()函数将URL解析为六个部分,我们只需要查看netloc(域名)和scheme(协议)是否存在。

下面编写捕获网页所有图像URL的核心功能:使用bs4解析所有的img。

def get_all_images(url):
    """
    返回单个url上的所有图像url
    """
    soup = bs(requests.get(url).content, "html.parser")

网页的HTML内容在soup对象中,要提取HTML中的所有img标签,我们需要使用soup.find_all("img")方法:

    urls = []
    for img in tqdm(soup.find_all("img"), "Extracting images"):
        img_url = img.attrs.get("src")
        if not img_url:
            # 如果img不包含src属性,只需跳过
            continue

这将检索所有img元素作为Python列表。

然后将其包装在tqdm对象中只是为了打印进度条。要获取img标签的URL ,有一个src属性。但是,有些标记不包含src属性,我们可以使用上面的continue语句跳过这些标记。

还有我们需要确保URL是绝对的:

        # 保证url是绝对的
        img_url = urljoin(url, img_url)

有一些URL包含我们不喜欢的HTTP GET键值对(以这样的结尾:“ /image.png?XXXXX”),让我们把这样删除:

        try:
            pos = img_url.index("?")
            img_url = img_url[:pos]
        except ValueError:
            pass

现在,确保每个URL有效,并返回所有图像URL:

        if is_valid(img_url):
            urls.append(img_url)
    return urls

最后,我们通过requests进行图片的下载,下面是完整代码

# @Author:Runsen
import requests
import os
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin, urlparse

def is_valid(url):
    """
    检查url是否为有效的url。
    """
    parsed = urlparse(url)
    return bool(parsed.netloc) and bool(parsed.scheme)

def get_all_images(url):
    """
    返回单个url上的所有图像url
    """
    soup = bs(requests.get(url).content, "html.parser")
    urls = []
    for img in tqdm(soup.find_all("img"), "Extracting images"):
        img_url = img.attrs.get("src")
        if not img_url:
            # 如果img不包含src属性,跳过
            continue
        # 保证url是绝对的
        img_url = urljoin(url, img_url)
        try:
            pos = img_url.index("?")
            img_url = img_url[:pos]
        except ValueError:
            pass
        if is_valid(img_url):
            urls.append(img_url)
    return urls

def download(url, pathname):
    """
    下载给定URL的文件并将其放入文件夹“路径名”中
    """
    # 如果路径不存在,则将该路径设为dir
    if not os.path.isdir(pathname):
        os.makedirs(pathname)
    response = requests.get(url, stream=True)

    # 获取总文件大小
    file_size = int(response.headers.get("Content-Length", 0))
    # 获取文件名
    filename = os.path.join(pathname, url.split("/")[-1])
    # 进度条,将单位改为字节(tqdm的默认值)
    progress = tqdm(response.iter_content(1024), f"Downloading {filename}", total=file_size, unit="B", unit_scale=True,unit_divisor=1024)
    with open(filename, "wb") as f:
        for data in progress.iterable:
            # 将读取的数据写入文件
            f.write(data)
            # 手动更新进度条
            progress.update(len(data))


def main(url, path):
    # 获取所有图像
    imgs = get_all_images(url)
    for img in imgs:
        # 下载图片
        download(img, path)

if __name__ == "__main__":
    main("https://www.csdn.net/", "CSDN-images")

下载内容
或者,你觉得代码比较复杂,当然,也有小白白的做法,正所谓:天机不可泄露。

算了,Runsen还是简单的告诉你们天机,记得给我点赞加关注。

图片助手插件是一款Chrome浏览器中用于嗅探、分析网页图片、图片筛选、下载等功能的扩展程序。

在这里插入图片描述

以上是关于学妹问我:怎么从网页下载所有图片?我答:天机不可泄露的主要内容,如果未能解决你的问题,请参考以下文章

❤有学妹问我Java架构师怎么入门,我甩出12k亲身体验的学习视频推荐给她

学妹问我单元测试怎么写,我把阿里大牛偷偷教我的知识塞给她。

学妹问我的终端为什么这么好看———windows命令行美化指南(从cmd到oh-my-posh)

学妹问我Java异常是怎么回事,讲了半夜才明白,速度收藏!!!记得点赞和关注

学妹问我Java异常是怎么回事,讲了半夜才明白,速度收藏!!!记得点赞和关注

❤️大数据专业的学妹问我大数据怎么入门,我总结了亲身体验的学习路线推荐给她推荐收藏❤️