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

@Author:Runsen

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

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

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

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

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

学妹问我:怎么从网页下载所有图片?我答:天机不可泄露_第2张图片
首先,我们需要一些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")

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

学妹问我:怎么从网页下载所有图片?我答:天机不可泄露_第4张图片
或者,你觉得代码比较复杂,当然,也有小白白的做法,正所谓:天机不可泄露。

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

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

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

你可能感兴趣的:((1-1)Python系列,python,java,opencv,数据分析,html5)