[Python数据采集]页面图片爬取与保存

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

前言

本篇文章中,将通过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)
复制代码

运行结果

  

  保存的图片: