@Author:Runsen
最近,有一个学妹关注我,想让我帮她把一个网页的所有图片下载下来。
正所谓,私信找我,那是看得起我,虽然不知道是男还是女,这不,我就解决了这个简单的问题。
如果您曾经想在某个网页上下载所有图像?那么本次教程中,将带你学习如何在某个网页上下载所有图像。
这里,我选择CSDN的首页吧:
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浏览器中用于嗅探、分析网页图片、图片筛选、下载等功能的扩展程序。