《爬虫》爬取页面图片并保存

news/2024/7/19 12:14:30 标签: 爬虫

爬虫

  • 前言
  • 代码
  • 效果


简单的爬取图片

前言

这几天打算整理与迁移一下博客。因为 CSDN 的 Markdown 编辑器很好用 ,所以全部文章与相关图片都保存在 CSDN。而且 CSDN 支持一键导出自己的文章为 markdown 文件。但导出的文件中图片的连接依旧是 url 连接。为了方便将图片保存到本地,在这里保存一下爬虫代码。

只要修改正则匹配代码,同样适用于博客园爬取。

代码

为了提高效率,该脚本将从保存的本地 markdown 文件读取图片链接。当然脚本中也保留了爬取某个页面所有图片的函数。

脚本名:spider.py

import urllib.request 
import urllib.parse
import sys
import os
import re 


def open_url(url):
    '''
    用于网页爬取。这里不采用这个函数
    '''
    req = urllib.request.Request(url) 
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0')
    # 访问url,并将页面的二进制数据赋值给 page
    page = urllib.request.urlopen(req)
    # 将page中的内容转换为utf-8编码
    html = page.read().decode('utf-8')

    return html


def read_file(file):
    print('\n正在读取文件...')
    with open(file, 'rb') as my_file:
        content = my_file.read()
        content = content.decode('utf-8')

    print('已读取文件.')

    return content


def get_img(content, file_path):

    # 正则匹配图片链接
    # p=r'<img src="([^"]+\.png)"'  # 可用于网页爬取
    p=r'https://img-blog\.csdnimg\.cn/[\w\-/]+\.png'

    #返回正则表达式在字符串中所有匹配结果的列表
    print('\n正在读取图片链接...')
    img_list=re.findall(p, content)
    list_len = str(len(img_list))
    print('已读取图片链接.\n')

    for img_url in img_list:
        print(img_url)
    print('\n共 ' + list_len + ' 条数据')

    # 图片保存位置。如果文件夹不存在则创建
    save_path = file_path + '/assets/'

    if not os.path.exists(save_path):
        os.makedirs(save_path)

    print('\n正在保存图片...\n')
    num = 0  # 用于记录进度
    for each in img_list:
        #以 / 为分隔符,-1返回最后一个值
        photo_name=each.split("/")[-1]

        #访问 each,并将页面的二进制数据赋值给photo
        photo=urllib .request .urlopen(each)

        w=photo .read()

        f=open(save_path + photo_name + '.png', 'wb')
        f.write(w)
        f.close()

        # 展示进度
        print(num % 10, end="")
        if (num + 1) % 10 == 0 and num != 0:
            print('    进度: ' + str(num + 1) + '/' + list_len)
        sys.stdout.flush()  # 刷新输出缓冲
        num += 1

    print('\n\n完成!\n')


if __name__=='__main__':
    if len(sys.argv) != 2:
        print("\nUsage:   python spider.py <file>")
        print('example: python spider.py "F:\\T\\test.md"')
        sys.exit()

    file = str(sys.argv[1])

    file_name = os.path.basename(file)
    file_path = os.path.dirname(file)
    print('\nfile_name: ' + file_name)
    print('file_path: ' + file_path)

    # 读取文件内容
    content = read_file(file)

    # 爬取图片
    get_img(content, file_path)

效果

在这里插入图片描述

在这里插入图片描述


别后相思人似月,云间水上到层城。

——《明月夜留别》(唐)李冶


http://www.niftyadmin.cn/n/4929184.html

相关文章

【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles

文章目录 摘要IntroductionRevisiting Video Object Detection BaselinePractice for Mobiles Model Architecture for MobilesLight Flow 摘要 尽管在桌面GPU上取得了视频目标检测的最近成功&#xff0c;但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算…

maven Jar包反向install到本地仓库

maven Jar包反向install到本地仓库 需求实现 需求 项目打包时报错&#xff0c;缺少一个jar包。 但是在maven仓库都找不到此jar包&#xff0c;其他人提供了这个jar包。 需要把这个jar包install到本地仓库&#xff0c;使项目能正常打包运行。 实现 使用git bash命令执行以下脚…

dotNet 之数据库sqlite

Sqlite3是个特别好的本地数据库&#xff0c;体积小&#xff0c;无需安装&#xff0c;是写小控制台程序最佳数据库。NET Core是同样也是.NET 未来的方向。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 D…

Ozone命令行接口详解

命令行接口简介 Ozone Shell是命令行与Ozone交互的主要界面&#xff0c;底层用的是Java。 有些功能只能通过Ozone Shell进行操作&#xff1a; 创建带有限额限制的Volume管理内部ACLs&#xff08;访问控制列表&#xff09;创建带有加密密钥的存储桶 大部分操作除了Shell操作…

Jenkins自动化打包脚本

一、背景 jenkins可以设置定时任务打包&#xff0c;也已手动点按钮打包&#xff0c;还可以通过执行http请求打包&#xff0c;今天我们就通过shell脚本&#xff0c;通过curl命令进行jenkins打包。 二、步骤 2.1 在jenkins上构建项目 设置触发器 2.2 通过shell脚本触发远程构…

selenium官网文档阅读总结(day 4)

1.selenium的工作原理 selenium的工作原理涉及以下主要组件和步骤&#xff1a; &#xff08;1&#xff09;WebDriver:这是selenium的核心组件&#xff0c;它是一个用于控制浏览器的API。WebDriver提供了许多方法&#xff0c;用于在浏览器中模拟用户操作。不同的浏览器需要相应…

【Flutter】【基础】CustomPaint 绘画功能(一)

功能&#xff1a;CustomPaint 相当于在一个画布上面画画&#xff0c;可以自己绘制不同的颜色形状等 在各种widget 或者是插件不能满足到需求的时候&#xff0c;可以自己定义一些形状 使用实例和代码&#xff1a; CustomPaint&#xff1a; 能使你绘制的东西显示在你的ui 上面&a…

Objective-C获取变量类型的方法

在Objective-C中&#xff0c;要获取一个对象的类型&#xff0c;可以使用[object class]方法。这将返回一个Class对象&#xff0c;表示该对象的类型。 另外&#xff0c;typeid是C中的关键字&#xff0c;用于获取一个变量的类型信息。在Objective-C中&#xff0c;typeid并不适用于…