使用影刀快速迁移博客

前言

搜索打开很多博客迁移的工具,但是大部分需要写代码或是通过一些脚本读取html进行转存,这样的话会导致我的博客出现一些数据混乱,一直没有找到一个比较合适方法进行快速迁移。

八月份接触了影刀和n8n各种RPA工具,这次创建了新的博客想着一口气把之前CSDN的170篇文章来一次整体搬家,虽然AI写代码会减少自己造轮子的情况,但是我使用CursorTraeAntigravity , 他们给出的答案都是爬虫读取,效果一般 ,所以决定尝试使用PRA工具,结果在简单debug的情况下,大概可以三十分钟写完脚本,开始自动存入读取。

影刀

机缘巧合之下接触了影刀,用着感觉非常方便,既方便有变成经验的人写一些脚本,也方便一些非变成经验的人进行编程工作,之前帮助货代公司编写上传一飞或者获取ETA工具的脚本都是用影刀编写,速度和整体应用都很顺畅。

最重要的是个人版免费,对于个人或者小型团队足够了。当然,当程序复杂度上去后还是使用纯代码会方便,所以这个场景在我看来就是应用于demo,固定重复性劳动(Web , Client端没有尝试)

逻辑

原因

我希望能够完整的将我所有的博客迁移,但是由于之前一直没有博客文件的备份,大部分都找不到当时的图片和md文件,但是csdn会在平台自动转存到他的云端cdn中进行存储。

并且我测试了一下cdn的链接是不允许站外访问,通过附加我的博客域名 xlx.dev会导致解析错误。

结果

所以通过梳理,我确定路线为:

  1. 登陆我后台的个人主页

  2. 找到所有的文章列表

    image-20260107103919300

  3. 获得上传时间 (此处会出现两种情况,CSDN的时间采用了两种标签的样式,导致影刀抓取失败,所以这里需要设置一个try...catch...获取两个的数据)

    image-20260107103945237

  4. 点击编辑

  5. 获得编辑页面的title和context

    image-20260107104022837

  6. 分析context中的所有网址,尤其是csdn的cdn头,替换成本地路径或是我自己的cdn路径

    • cdn的头包含两种:

      1
      2
      https://i-blog.csdnimg.cn/direct/*
      https://i-blog.csdnimg.cn/blog_migrate/*
  7. 保存图片到本地

  8. 保存context和文章主题及时间到文件中

  9. 将图片与文章分别存储到每个以Title为标题的文件夹中

    image-20260107104321926

    image-20260107104327217

  10. 同时将图片存储到一个统一的位置,用于后期上传自己的cdn

步骤

1. 安装

国内推荐直接安装影刀工具, 官网 : https://www.yingdao.com/ , 下载安装包

image-20260107102834849

2. 创建应用

  1. 新建一个网页自动化应用程序

image-20260107104413019

  1. 根据上面提到的逻辑开始放置功能模块,首先完成获取文章列表的模块

    1. 打开后台网页,后面为了方便我直接使用的google浏览器登陆账户后使用

      image-20260107104616190

    2. 选择相似元素列表,点击右侧的校验元素可以看到数据是否正确

      image-20260107104751818

      1. 由于文章数量多,影刀又是基本上仿照手动操作来做,所以还需要滚动滚动条到底部,但是由于是动态加载所以需要滚动多次完整所有文章的主页缓存,我这里直接设置了十次滚动,进行设置,通过这个节点可以确保获取所有的文章数据

      image-20260107105228175

      image-20260107105233890

      1. 通过这样我再没有滚动的情况下可以拿到60篇文章,设置完默认滚动后可以直接获取到所有的162篇文章
  2. 遍历文章,获取文章数据

    1. 获取到每个文章的超链接,并打开新的网页从里面获取数据,浏览器需要设置为google浏览器

      image-20260107105843149

      1. 拿到时间数据

      image-20260107110126196

      1. 由于获取到的不是单纯的时间字符串还是有其他的文字部分,所以需要借助一个正则表达式处理一下数据

        1
        \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}

        image-20260107110805937

      2. 需要再点击编辑,从而进入编辑状态,最终网页获取时间及点击编辑的模块

        image-20260107110819937

  3. 获取文章内部Title和Context正文

    1. 获取到title后,需要按照title创建一个文件夹和同名的文件用于作为博客的本地存储地址

      1. 由于title中会有不少非法地址 , [\\/:*?"<>|] . 所以同样需要一个正则表达式对title进行过滤,从而拿到一个能正确创建的文件名字

        image-20260107123209674

        1. 组合地址

      image-20260107123433016

    2. 获取到正文后,提取正文中的网址贴,目的是将cdn的图片网址提取出来,注意这里需要将节点中的只找第一个匹配项取消勾选,不然节点只会返回第一个item

      1. csdn的cdn使用两种不同的cdn网站存储图片,所以需要对两者都进行分辨,两种判定分别是:

        1
        2
        https://i-blog.csdnimg.cn/direct/*
        https://i-blog.csdnimg.cn/blog_migrate/*

        正则表达式提取文本:

        1
        https://i-blog\.csdnimg\.cn/(?:direct|blog_migrate)/.+?\.[a-zA-Z]{3,4}

      image-20260107111544923

    3. 创建循环,因为csdn的cdn设置允许空referer,所以可以利用这个机制下载图

      1. 同样通过一个正则表达式获取所有的图片名字

        1
        https://i-blog\.csdnimg\.cn/(?:direct|blog_migrate)/(.+?\.(?:png|jpg|jpeg|gif|webp))
      2. 对图片进行两次保存,保存路径为 : folder // images 和 folder // title 中

  4. 每次循环结束后,都关闭网页,并且点选 忽略确认离开选择框 ,因为影刀的特性会触发CSDN的保存触发器

    image-20260107124009988

    最终效果

    image-20260107140112244