一次批量修改部落格文章的經驗(下) 操作過程

2021-09-05 22:26:24 字數 2560 閱讀 3276

metaweblog api並不提供獲取所有文章id的介面,但這並不影響我們從網頁上直接進行抓取。我們從提供的「月份彙總」頁面入手,即這樣的一張頁面。的月份彙總的url非常有規律,獲得它的html內容之後即可使用正規表示式來捕獲文章id了。您可能會想,一篇文章可能會取別名(這樣url上就不顯示id了),而網頁上各種url也很多,有什麼辦法可以準確而方便地分析出文章id嗎?其實這個問題很簡單,因為為每篇文章都放置了乙個「編輯」鏈結,它的url是.../editposts.aspx?postid=1633416,對我們來說再方便不過了。

type webclient with 

member c.getstringasync(url) =

async

let downloadpostidsasync (beginmonth : datetime) (endmonth : datetime) =

let downloadpostidsasync' (m : datetime) =

async

async

system.net.servicepointmanager.defaultconnectionlimit <- 10

blogging.downloadpostidsasync (new datetime(2006, 9, 1)) (new datetime(2008, 12, 1))

|> async.runsynchronously

由於webclient基於webrequest物件實現,而webrequest受到servicepointmanager控制,因此我們要設定其defaultconnectionlimit屬性來開啟對單個網域名稱的限制——並控制對併發連線的數量進行限制,以免對伺服器產生太大壓力(當然我們其實工作量本不大,且也不會那麼脆弱)。當然,這個限制也可以通過配置進行更改。

這個任務要比之前簡單許多,因為metaweblog api已經提供了可以直接使用的介面。

let apiurl = ""

let username, password = "jeffreyzhao", "..."

let downloadpostsasync() =

let downloadpostasync id =

async

file.readalllines("postids.txt")

//|> seq.take 10

|> seq.map downloadpostasync

|> async.parallel

|> async.ignore

呼叫:

blogging.downloadpostsasync() |> async.runsynchronously
let updatelocalposts() =

let regex = @"(?i)(]*>) ? ?"

let target = "$1"

let updatepost (post : metaweblog.post) =

post.content <- regex.replace(post.content, regex, target)

let file = sprintf @"updated\%i.xml" post.postid

let xml = xmlserialization.serialize post

file.writealltext(file, xml);

directory.getfiles(@"posts\", "*.xml")

|> seq.map (fun f -> file.readalltext(f))

|> seq.map xmlserialization.deserialize|> seq.filter (fun p -> regex.ismatch(p.content, regex))

|> seq.iter updatepost

let updateremoteposts() = 

let updatefromfile file =

async

directory.getfiles(@"updated\", "*.xml")

|> seq.map updatefromfile

|> async.parallel

|> async.ignore

呼叫:

blogging.updatelocalposts()

blogging.updateremotepostsasync() |> async.runsynchronously

如此,我們的批量更新任務就完成了。

除了「去除段首空格」之外,我還做了其他一些修改,例如調整以前不太好的**貼上方式等等,這些只需要對**進行簡單修改就行了。在實際執行任務時,我也並非一蹴而就,也使用了少數幾篇文章進行試驗,確定沒有問題之後才作了批量提交。總體來說,整個過程沒有遇到什麼麻煩,現在那些舊文章的格式終於也得到了一定程度的清理。

可惜的是,我最早的幾十篇文章中,分段簡直是亂來的,一會兒是div,一會兒又用

,甚至連用多個……真是只要「所見即所得」就不顧一切了。對於這種問題,有機會再想辦法做調整吧。

本文**

一次批量修改部落格文章的經驗(上) 準備工作

這幾天賦閒在家,除了看書和還債 如rss訂閱 終於把一直以來想做卻拖著的事情完成了 批量去除部落格文章段首的空格。這個過程並不難,只需要按部就班地去做就行了,一切資料都可以在網際網路上搜尋到。不過我還是打算記錄一下,也是為了今後再做類似工作時有個參考,少走一些彎路。我是個略有些強迫症的人,希望很多東...

一次批量操作的優化

最近在做賬務系統的批量核銷介面的優化,該介面的功能抽象來說就是暴露給另乙個系統,每次呼叫會進行計算並更新庫里的值 感覺好普通的樣子 假設我這邊的系統是r received 對方系統是s send 那麼現在的工作流程是這樣的 1.請求分充值請求和消費請求。充值請求是商戶維度的,而消費是訂單維度的。而商...

第一次爬蟲的經驗

事先宣告哈,這不是什麼教程 博主也不會 只是記錄我自己的學習經歷中的點點滴滴,如果對讀者有一丁點的作用,我也會感覺很開心。博主目前剛上大學,軟工專業的,對專案開發那是十分神往,然後進了大學就加入了乙個專案組,正準備大施拳腳,專案導師的第乙個任務就讓我傻眼了 做乙個爬蟲。要知道那時博主連python的...