分析自己在大學期間讀過的書(四)

前情提要

前一篇文章中,因為豆瓣的 API 請求限制产喉,我無法一次性請求整個讀書記錄的信息列表敢会,于是想到在每個請求前隨機等待若干時間,以避免豆瓣的請求限制鸥昏。

前有堵截,后有追兵

文檔描述與實際情況不一致障涯?

運行代碼膳汪,發(fā)現(xiàn)還是無法獲得預期效果。用 Postman 再次查看信息粘我,發(fā)現(xiàn)出現(xiàn)的錯誤信息跟之前一樣:

{
    "msg": "rate_limit_exceeded2: 43.243.12.21",
    "code": 112,
    "request": "GET /v2/book/search"
}

又到網(wǎng)絡(luò)上搜索資料媳谁,這次發(fā)現(xiàn)友酱,有很多開發(fā)者遇到了類似的問題柔纵,而且他們在自己的博客中指出,豆瓣限制的其實不只是文檔中寫明的一小時的請求頻率或详,還有一分鐘的請求頻率郭计。

我將信將疑,等時間限制過了之后昭伸,用 Postman 再次發(fā)送請求,這次我重點查看 response header选调,發(fā)現(xiàn)有了兩個參數(shù)跟文檔上描述得不一致灵份。

插圖

我的請求限制是 100 次
豆瓣文檔明明寫的是 500 次

插圖

文檔上最低的請求限制是 500 次每小時填渠,可在我得到的響應中,寫得卻是 100 次每小時氛什。
難道是因為我沒有申請豆瓣的開發(fā)者賬號嗎?
算了徙融,且不糾結(jié)這個瑰谜。

每分鐘 35 次限制树绩?

看別人的博客時,發(fā)現(xiàn)有的博主說到渤早,豆瓣的 API 還有個每分鐘不能超過 35 個請求的限制瘫俊。
我不是很請求這個限制是否真的有悴灵,也不想試骂蓖,因為請求次數(shù)很寶貴,試上兩次就得等個一小時才能重新發(fā)請求了登下。
干脆直接就將這個條件納入考慮被芳。

每分鐘速度限制 + 每小時次數(shù)限制

綜合考慮到這兩個限制之后,我大概的思路是這個樣子的:

  1. 將兩百多條記錄做個 partition畔濒,分為四份,一個小時請求一次
  2. 每個請求前赞弥,隨機等待 0 - 5 秒鐘 (試了十幾次壹将,最長的一次請求返回之間大概是三秒,稍微多等待一點時間)

程序是下面這個樣子

const agent = require('superagent');
const async = require('async');
const _ = require('underscore');
const bookTitleList = require('./book_title_list');

function sleep(milliseconds) {
  let start = new Date().getTime();
  for (let i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds) {
      break;
    }
  }
}

function random_sleep(second) {
  sleep(Math.floor((Math.random() * second) + 1) * 1000)
}

function requestTags(bookTitle, done) {
  random_sleep(5);
  agent.get(encodeURI(`https://api.douban.com/v2/book/search?q="${bookTitle}"&count=1`))
       .end((err, res) => {
           if (err) {
             console.log(err);
           } else {
             const tag = res.body.books[0].tags;
             done(null, tag);
           }
         }
       );
}


function partition(items, size) {
  let result = _.groupBy(items, function(item, i) {
    return Math.floor(i/size);
  });
  return _.values(result);
}

const milliseconds_of_one_hour = 60 * 60 * 1000;

partition(bookTitleList, 80).forEach(subList => {
  async.map(subList, requestTags, (err, tags) => {
    tags.forEach(tag => {
      console.log(tag);
    })
  });
  sleep(milliseconds_of_one_hour);
})

寫好程序之后妇菱,我滿心歡喜暴区,運行命令,就直接工作去了房交。想著晚上下班了直接看效果就行了

當頭棒喝

沒想到呀?jīng)]想到伐割,結(jié)果還是錯的,這是怎么搞得白群!
命名已經(jīng)將時間限制和次數(shù)限制都加上了呀硬霍,還有什么其他問題呢?
仔細地看了錯誤信息,發(fā)現(xiàn)很奇怪的一點躬柬,有幾個請求是成功的抽减,但是還是無法拿到 tag,報了空指針異常昧廷,也就是在 const tag = res.body.books[0].tags; 這一行報錯了偎箫。
欸,難道是這本書不存在淹办。

的確有可能,為了驗證這個想法速挑,我加了個防御語句

let book = res.body.books[0];
const tag = book ? book.tags : `=======================================================empty book ${bookTitle}`

只有當響應中包含 books 并且第一個元素不為空時副硅,我才去取 tags,對于不存在的書腊满,返回特定的字符串加上書名培己,后面好看得出來是哪本書沒有得到響應。

Deadline 是第一生產(chǎn)力

改完之后肃弟,發(fā)現(xiàn)時間已經(jīng)不夠用了零蓉,距離 11 點寫作訓練的截止時間只剩下不到兩小時。如果還按照這個程序執(zhí)行的話敌蜂,我就無法完成今天的訓練了。

情急之下,我把讀書記錄分為 8 份,每份 30 條記錄左右芳绩。手動執(zhí)行程序撞反,在一個小時多一點的時間內(nèi),拿到了所有的豆瓣標簽嘹害,并將它們合到了一塊吮便。

重新使用抄來的 python 程序,成功生成詞云圖髓需,由于這次直接使用標簽而不是書名僚匆,所以我拿掉了 分詞 的語句。但是咧擂,又遇到了編碼的問題,幾經(jīng)周
折云芦,最后終于在既定時間內(nèi)以非常丑陋的代碼既定的目標攻臀。

最后生成的標簽詞云如下:

大學讀書記錄 豆瓣標簽

對比上一次使用分詞工具對書名處理過后得到的詞云圖刨啸,結(jié)果看起來區(qū)別還是很大的。


book history

比如善已,在新的圖片中离例,看不到重復的詞(比如舊圖中重復的 Java),也沒有被錯誤分開的詞語(比如 皮格馬利翁效應 )宫蛆〉拿停總的來說想虎,這次生成的詞云應該算是成功的。

未完待續(xù)……

因為趕時間岂却,所以我最后是以非常丑陋的代碼實現(xiàn)的這些功能裙椭。在下一篇文章給中,我想講講我如何重構(gòu)我這些丑陋的代碼扫尺,使得它們不那么丑陋(挽回一點面子 -_-|| )你雌。

如果你想看下有多丑陋,點擊前往代碼庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拨拓,一起剝皮案震驚了整個濱河市氓栈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醋界,老刑警劉巖提完,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逐样,居然都是意外死亡打肝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門争便,熙熙樓的掌柜王于貴愁眉苦臉地迎上來断医,“玉大人奏纪,你說我怎么就攤上這事酷宵。” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵男韧,是天一觀的道長默垄。 經(jīng)常有香客問我,道長朦前,這世上最難降的妖魔是什么鹃操? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恩伺,結(jié)果婚禮上椰拒,老公的妹妹穿的比我還像新娘。我一直安慰自己燃观,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布番川。 她就那樣靜靜地躺著爽彤,像睡著了一般缚陷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箫爷,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音硫痰,去河邊找鬼。 笑死非春,一個胖子當著我的面吹牛缓屠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敌完,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼滨溉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闽撤?” 一聲冷哼從身側(cè)響起勤家,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎热幔,沒想到半個月后讼庇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡场勤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年和媳,在試婚紗的時候發(fā)現(xiàn)自己被綠了哈街。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡她倘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硬梁,到底是詐尸還是另有隱情,我是刑警寧澤屹电,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布罩息,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏递宅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一烘绽、第九天 我趴在偏房一處隱蔽的房頂上張望俐填。 院中可真熱鬧,春花似錦盏檐、人聲如沸驶悟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笼呆。三九已至,卻和暖如春诗赌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剔难。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留非迹,地道東北人纯趋。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像纯命,于是被迫代替她去往敵國和親痹栖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)南捂,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 前情提要 前一篇文章中麦牺,我想明白了:使用 書名 搜索鞭缭,得到的豆瓣返回結(jié)果集的第一個元素其實就是目標書的信息。于是缚去,...
    afaren閱讀 706評論 3 2
  • 佛法常講無我易结,究竟什么是無我呢?這可能要從反面來講更容易理解搞动。 事例1: 老婆在教育兒子,語氣稍微有些急躁矗烛,我在一...
    厚天下閱讀 263評論 0 0
  • 我們斷斷續(xù)續(xù)走了許久歪架,有時候我們甚至都以為我們習慣了孤獨股冗。過多了一個人的生活和蚪,一個人吃飯,去圖書館怯疤,看書催束,旅行;也...
    JARRETT1994閱讀 217評論 0 0