一次批量修改博客文章的经验(下):操作过程

获取所有文章ID

首先,我们便要下载所有文章了,这又该怎么做呢?虽然MetaWeblog API提供了 getRecentPosts方法用来获取最近的文章,但是这个接口却并不好用。例如,它只能用来 获取最新的几篇文章内容,但对我来说,我想修改的其实是很久之前的文章。那么,难道 要我下载全部500多篇文章才行吗?后来我统计了一下,所有文章大小存成文本文件大约 有10M,一个请求下载 10M内容还是有些夸张的——而且还看不到进度。因此,我最后打 算“曲线救国”,先着手获得所有公开文章的ID,再通过getPost接口获得文章内容。

MetaWeblog API并不提供获取所有文章ID的接口,但这并不影响我们从网页上直接进 行抓取。我们从博客园提供的“月份汇总”页面入手,即这样的一张页面。博客园的月份 汇总的URL非常有规律,获得它的HTML内容之后即可使用正则表达式来捕获文章ID了。您 可能会想,一篇文章可能会取别名(这样URL上就不显示ID了),而网页上各种URL也很多 ,有什么办法可以准确而方便地分析出文章ID吗?其实这个问题很简单,因为博客园为每 篇文章都放置了一个“编辑”链接,它的URL是.../EditPosts.aspx?postid=1633416,对 我们来说再方便不过了。

于是下载和捕获文章ID的方法可谓手到擒来:

type WebClient with

   member c.GetStringAsync(url) =
     async {
       let completeEvent = c.DownloadStringCompleted 
       do c.DownloadStringAsync(new Uri(url))
       let! args = Async.AwaitEvent(completeEvent)
       return args.Result
     }

let downloadPostIdsAsync (beginMonth : DateTime) (endMonth :  DateTime) =

   let downloadPostIdsAsync' (m : DateTime) =
     async {
       let webClient = new WebClient()
       let url = sprintf  "http://www.cnblogs.com/JeffreyZhao/archive/%i/%i.html" m.Year  m.Month

       let! html = webClient.GetStringAsync(url)

       let regex = @"EditPosts\.aspx\?postid=(\d+)"
       return [ for m in Regex.Matches(html, regex) ->  m.Groups.Item(1).Value |> Int32.Parse ]
     }

   async {
     let! lists =
       Seq.initInfinite (fun i -> beginMonth.AddMonths(i))
       |> Seq.takeWhile (fun m -> m <= endMonth)
       |> Seq.map downloadPostIdsAsync'
       |> Async.Parallel

     lists
     |> List.concat
     |> List.sort
     |> List.map (fun i -> i.ToString())
     |> fun lines -> File.WriteAllLines("postIds.txt",  lines)
   }

下载文章ID的任务由downloadPostIdsAsync函数完成,它接受beginMonth和endMonth 两个DateTime参数来表示月份的区间,我们将从中获取所有的文章ID。 downloadPostIdsAsync函数会生成一个异步工作流,执行这个工作流便会将所有的文章 ID进行排序,并保存至postIds.txt文件中去,一行一个。获取单月的文章ID由内部的 downloadPostIdsAsync'这个辅助函数负责,它会构造出下载单个月份文章ID的异步工作 流,再由外部函数合并而成——换句话说,所有月份的文章将同时进行异步下载,提高效 率。

我们可以在main方法中执行downloadPostIdsAsync函数,这样postIds.txt文件中便会 出现所有的文章ID了:

System.Net.ServicePointManager.DefaultConnectionLimit <-  10

Blogging.downloadPostIdsAsync (new DateTime(2006, 9, 1)) (new  DateTime(2008, 12, 1))
|> Async.RunSynchronously

由于WebClient基于WebRequest对象实现,而WebRequest受到ServicePointManager控 制,因此我们要设置其DefaultConnectionLimit属性来打开对单个域名的限制——并控制 对并发连接的数量进行限制,以免对服务器产生太大压力(当然我们其实工作量本不大, 且博客园也不会那么脆弱)。当然,这个限制也可以通过配置进行更改。

时间: 2024-10-27 15:41:54

一次批量修改博客文章的经验(下):操作过程的相关文章

一次批量修改博客文章的经验(上):准备工作

前言 我是个略有些强迫症的人,希望很多东西可以统一.例如,几个月前我才在RSS订阅里 输出了全文--那是因为博客园终于提供这个统一设置的选项了.其实在此之前就有很多 朋友建议我开放全文,但我一直没有做.不是我追求PV,而是我只能做到所有的新文章输 出全文,对于旧文章则必须一篇一篇地去修改--如果不修改,不就不统一了吗?但手动 修改实在太繁琐,于是便一直没有去做. 同样的,在我以前的文章中,每段段首都是空两格的,但是现在感觉没有什么必要, 于是最近的几十篇文章都顶格写了.这个"不统一"我

防止博客文章被恶意转载的方法

所谓"恶意转载",指的是一些不合常规和不文明的转载行为.包括批量的转载很多文章,通过程序自动转载,转载后删除署名或者原文链接等等,很多博客都遇到过这种情况,大量的不注明出处的转载,会使得原创作者处于非常尴尬的处境,辛苦创作的文章得不到应有的回报.下面我就介绍一些针对这类恶意转载的应对措施. 通过技术方式提醒 增加这样一段JavaScript代码,当别人复制你文章内容的时候,系统会自动将版权信息和原文地址加入到复制内容中,以提醒复制的人注意版权,这时别人要是还要手动将版权信息和原文地址删

SQL Sever 博客文章目录(2016-07-06更新)

SQL Server方面的博客文章也陆陆续续的写了不少了,顺便也将这些知识点整理.归纳一下下.方便自己和他人查看.   MS SQL 数据类型   三大数据库对比研究系列--数据类型   MS SQL 表和视图   数据库表的基本信息,你知道吗? 数据查询表,列名对比 MS SQL 建表SQL的脚本 查看数据库.表.索引的物理存储情况 慎用SELECT INTO复制表   MS SQL 索引约束 [翻译] 聚集索引表 VS 堆表 SQL SERVER 中is null 和 is not null

挂据修改博客标题title对搜索引擎的影响

我们都知道网站标题标签title和描述标签description是SEO中一个重要的优化因素,在站内优化环节中我们SEOer都会考虑到这一优化要素,特别是对于新网站是不可以频繁修改的.很多资深SEOer的建议是网站标题title一旦确定之后非必要时尽可能不要去做title修改. 标题title是网页优化第一步因素,是搜索引擎判断页面相关性最重要的提示.对于新站来说,网站刚上线不久,搜索引擎对于新站都会有一个观察期,对于新站搜索引擎会格外关注和敏感.而且新站对搜索引擎还没建立一定信任度的情况下,如

使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理

原文:使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理 摘要 通过对博客文章的管理,实现外键操作. 目录[-] 八.博客文章管理 1.查看文章 2.添加博客        3.查看博文详情 4.修改博客内容 5.删除博客文章 九.尾声         1.如何部署 2.进一步的学习 3.ENDING 转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: 使用IntelliJ IDEA开发SpringMVC网站(一

为什么百度1分钟内收录我的博客文章

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在站长网,看了那么多关于百度收录和优化的文章,大家众说纷纭,各有所长.至于何为真理,那只有百度知道了,我们要做的就是无限接近真理.今天我也以博客为例谈几点自己的看法. 关于伪原创.伪原创的方法很多,比如改标题法,段落调换法,同义词替换法,文章来源注明法,文章摘要法等等,各有妙处.本文标题说了,我博客现在发的文章基本上是一分钟内便被百度收录,有

在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能

本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了一个在Web应用中利用作业调度来进行消息发送的业务模型. Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)

有人很好奇我博客文章的默认展图是怎么弄的?

有人很好奇我博客文章的默认展图是怎么弄的? 其实很简单,就是一个思路:www.dkill.net 我肯定懒得每次都传,那就随机生成(类似于自动化) 看2张图就清楚了:

如何在博客文章中添加背景图片

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 博客文章中添加背景图片 一.blog贴图(仅限网易博客) 其实贴图的显示问题和图片的来源有关.如果blog中插入的图片是来自网易相册的,就可以在主页显示,其它来源的图片就不能了.因此,大家想要贴图在主页显示,只要把图片先存入网易相册,再调用相册里的图片链接就ok了!(贴图应在设计视图完成!)设计图可以到我图网里下载http://www.ooo