把時光網的電影評分遷移到豆瓣上

之前看了很多電影都在mtime上打了分,最近感覺時光網人氣下降,轉移到豆瓣了。

回頭一看時光網上幾百本電影,於是想寫個腳本遷移一下。

之前工作上一直用nodejs,順手就開搞了:

1、從時光網拉取數據

http://my.mtime.com/movie/seen/

在這個頁面通過翻頁 在chrome 開發者模式Network欄目下查看請求 找到

http://my.mtime.com/movie/seen/?sort=2&pageIndex=X

輸出的是收藏的頁面HTML,其中X是頁數

在chrome中右鍵請求-選擇 Copy as Curl(Bash) ,複製命令到自己的VPS裡面測試一下,可以正確返回HTML

2、解析時光網頁面HTML

嘗試寫了一個基本的node腳本解析返回的HTML。

一開始嘗試了 HTMLparse 、 jsdom 、 node-jquery(都是NPM上隨便搜到) 操作起來都有點繞,或者要自己再去循環嵌套找需要的內容,後來發現神器 Cheerio GitHub - cheeriojs/cheerio: Fast, flexible, and lean implementation of core jQuery designed specifically for the server. 看到那github上那 8000+的start知道這個絕壁靠譜了,果斷試了一下,太尼瑪好用,分分鐘就提取了頁面中的需要的模塊,找到時候用chrome開發者模式切到source模塊,然後在不同的DIV上滑鼠滑動可以快速定位需要內容對應的HTML。

這裡可以根據class來過濾,類似jquery選擇器的語法進行篩選,出來的結果直接用map或者each方法進行遍歷和求總數。

var $ = cheerio.load(rawHtml);var obj = $(ul.mt25.col2.clearfix).html();var movies = $(#seenMoviesRegion).find(ul.mt25.col2.clearfix);movies.map(function(i,elem) { var m_img = $(elem).find(.movie_75img); var moiveObj = m_img[0].attribs; var m_score = $(elem).find(.c_green.bold).html(); console.log( %s - %s - %d,moiveObj.title,moiveObj.href,m_score); var addLine = moiveObj.title + | + m_score +
; fs.appendFileSync(./full_line.txt,addLine);});

3、頁面動態數據獲取

在拉取單個頁面的結果時發現直接curl出來的html結果只有電影名字列表,而沒有打分數據。在chrome中禁用JavaScript一看果然如此。

也懶得繼續去翻到底是哪個JS怎麼渲染的,直接上大殺器 PhantomJS | PhantomJS ,直接npm install 裝完之後 照著文檔寫了一個頁面拉取,發現被跳轉到了時光網的登錄頁面,還需要登錄cookie,因為是一次性的工具,就不費力去做登錄了,直接瀏覽器登錄完之後把cookie抄過來即可。

經過phantomjs渲染完之後的頁面HTML中已經有完整的電影名字和打分數據。

4、保存結果到文件

循環遍歷每一頁,把parse結果存文件,直到頁面返回列表為空。

記錄下的是 mtime電影中文名 英文名 年份 打分(10分制轉為5分制)

5、在豆瓣完成打分

需要根據電影名字搜索到在豆瓣對應的電影ID,豆瓣有直接的API,

https://developers.douban.com/wiki/?title=movie_v2#simple-subject

但是單IP有頻率限制,一開始沒控制直接被封了,還好哥還有其他的VPS。

根據電影名搜索出來的結果 可能有多個,需要循環判斷

如果 年份相等 或者 中文名相同 或者 英文名相同 且 在豆瓣上已經有打分 則認為是匹配電影。

再用登錄態(也是一次性的瀏覽器cookie複製)的請求

https://movie.douban.com/j/subject/movieID/interest

進行豆瓣評分,這是一個POST請求,comment就暫時填空了,好一點可以把時光網那邊曾經的短評也拉過來,我懶得回頭再改腳本了。

var doRate = function(iMovieID,iRate,cb) { var szUrl = util.format(https://movie.douban.com/j/subject/%d/interest,iMovieID); var options = { url : szUrl, form : { rating : iRate, interest : collect, foldcollect : F, tags : mtime, ck : xxxx, comment : }, headers : { User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36, Cookie : bid=xxxxxxxxxx; ll="xxxxx"; dbcl2="xxxxxxxxx"; ck=xxxx; } }; request.post(options,function(err,res,body) { if (!err && body) { console.log(rate done %d,iRateCount++); }else{ console.error(err); } });};

搞完收工,感謝 cheeriojs phatomjs chrome 基本就靠三個工具輕鬆搞定需求。

一共沒寫幾行代碼,見github

GitHub - luckscx/mtime_2_douban: 遷移mtime的電影打分到豆瓣上

搞完了,很簡單,想看看大家有啥類似奇葩的需求可以私信我,最近挺閑的。


推薦閱讀:

讀書筆記和書評有什麼本質區別?
感覺豆瓣上影視評分歐美日韓的偏高,本質上是什麼心態呢,是不是大家不熟悉外國人正常表現而盲目追捧呢?
2016年豆瓣評分最高的十部電影,年假刷起來!
為什麼豆瓣上的張辛苑會這麼火?

TAG:Nodejs | 電影 | 豆瓣 |