小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
前言
本篇文章中,将通过requests和urllib.request库,获取某url中所有的图片,可适用于所有通过静态渲染页面。
思路
获取html
构建一个get_html函数,输入url以及请求方法,返回html文本:
def get_html(url: str, request_type: str) -> str:
"""
获取html
:param url: 访问地址
:param request_type: 请求方式: urllib.request 或 urllib.request 或相应缓存
:return: html
"""
if request_type == "urllib.request":
# urllib.request
return urllib.request.urlopen(url).read().decode("utf-8")
elif request_type == "requests":
# requests
response = requests.get(url)
return response.text
else:
# 读取缓存文件
with open(f'./.cache/{request_type}.html', 'r', encoding='utf-8') as f:
return f.read()
复制代码
解析图片
使用正则匹配的方式,将所有的标签内的src提取出来:
imgList = re.findall(r'<img.*?src="(.*?)"', html, re.S)
复制代码
注意: 这里需要设置使用re.S模式方法,否则对于跨行图片,将无法进行识别提取。
图片保存
文件内容即请求图片url返回内容,使用with open创建文件管理对象,并将模式设置为wb(二进制写入模式):
resp = requests.get(img_url)
with open(f'./download/{img.split("/")[-1]}', 'wb') as f:
f.write(resp.content)
复制代码
使用字符串分割从url中提取出文件的名称(保证后缀名无误):
img.split("/")[-1]
# 或以"."进行分割,仅提取后缀名,自己对文件进行标号命名。
复制代码
最后使用f.write(resp.content)即可实现保存。
def get_imgs(html:str, download=True) -> None:
"""
获取所有图片地址,可选择下载
:param html: 输入html
:param download: 是否下载
:return: None
"""
imgList = re.findall(r'<img.*?src="(.*?)"', html, re.S)
print(imgList)
print(f'共有{len(imgList)}张图片')
if download:
for i, img in enumerate(imgList):
img_url = "http://news.fzu.edu.cn" + img
print(f"正在保存第{i + 1}张图片 路径:{img_url}")
resp = requests.get(img_url)
with open(f'./download/{img.split("/")[-1]}', 'wb') as f:
f.write(resp.content)
复制代码
运行结果
保存的图片:




近期评论