Node.js爬蟲(chóng)

? ? 最近使用node.js寫(xiě)了一個(gè)爬知乎的爬蟲(chóng)荧琼,用來(lái)爬取用戶(hù)的個(gè)人信息譬胎,主要是個(gè)人主頁(yè)的內(nèi)容,這里主要介紹一下在這個(gè)過(guò)程中遇到的問(wèn)題和整個(gè)項(xiàng)目的結(jié)構(gòu)命锄。

?遇到的問(wèn)題

1.由于知乎打開(kāi)之后堰乔,顯示的數(shù)據(jù)量是有限的,只有在右側(cè)滾動(dòng)條滾動(dòng)到底部的時(shí)候脐恩,才會(huì)顯示下一頁(yè)的信息镐侯,是異步獲取數(shù)據(jù)的,所以不能通過(guò)解析html獲得驶冒,需要觀察后臺(tái)發(fā)送的異步請(qǐng)求來(lái)找到獲取數(shù)據(jù)的來(lái)源苟翻。

如何知道前前端是通過(guò)哪個(gè)url獲取數(shù)據(jù)的呢?

按F12后的圖片

在你打開(kāi)知乎的個(gè)人主頁(yè)之后骗污,按F12崇猫,打開(kāi)瀏覽器的調(diào)試界面(我使用的是chrome),點(diǎn)擊最上面一欄的network, 然后點(diǎn)擊右下的response需忿,點(diǎn)擊左側(cè)的一個(gè)個(gè)url诅炉,當(dāng)Response下顯示的是一個(gè)json數(shù)據(jù)的時(shí)候,這就很有可能是一個(gè)異步的前段請(qǐng)求屋厘。你需要通過(guò)你的爬蟲(chóng)調(diào)用這個(gè)url來(lái)獲取異步加載的數(shù)據(jù)涕烧,直接解析返回的json格式的數(shù)據(jù)就可以了。

2.在for循環(huán)里使用異步操作汗洒。由于使用異步操作可以極大加大數(shù)據(jù)的吞吐量议纯,所以在程序的各個(gè)地方使用異步。如果在for循環(huán)中使用異步仲翎,就會(huì)導(dǎo)致很?chē)?yán)重的問(wèn)題痹扇,由于for循環(huán)結(jié)束地比異步早,所以就會(huì)導(dǎo)致異步操作中所有使用到i(for循環(huán)里的參數(shù))的地方溯香,都是for循環(huán)執(zhí)行完最后一次的值鲫构,所以最后使用async在for循環(huán)中使用同步操作。

項(xiàng)目的整體結(jié)構(gòu)

項(xiàng)目主要由三個(gè)部分組成

(1)數(shù)據(jù)庫(kù)交互模塊玫坛,主要用于與數(shù)據(jù)庫(kù)進(jìn)行交互结笨,使用了mongoose

(2)用戶(hù)信息獲取模塊,主要用于訪問(wèn)特定的url獲取某個(gè)用戶(hù)的數(shù)據(jù)湿镀,然后進(jìn)行處理后炕吸,存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù),是項(xiàng)目的最主要部分

(3)線程控制模塊勉痴,會(huì)根據(jù)cpu的數(shù)量赫模,開(kāi)啟多個(gè)線程,進(jìn)行用戶(hù)數(shù)據(jù)的獲取蒸矛,多線程可以提高數(shù)據(jù)的吞吐量瀑罗。

項(xiàng)目中數(shù)據(jù)的大體流程如下:在數(shù)據(jù)庫(kù)中讀取某個(gè)用戶(hù)token ?-->> ?拼裝url來(lái)獲取這個(gè)用戶(hù)的詳細(xì)信息,并存入數(shù)據(jù)庫(kù) ?-->> ?將用戶(hù)所關(guān)注的人的token存入數(shù)據(jù)庫(kù)中雏掠,作為下一個(gè)需要爬取的用戶(hù) -->> 在數(shù)據(jù)庫(kù)中隨機(jī)讀取一個(gè)沒(méi)有被爬取過(guò)的用戶(hù)爬取他的詳細(xì)信息-----循環(huán)不止斩祭。

最后附上項(xiàng)目的github(https://github.com/majinliang123/zhihu-crawler)地址,歡迎各位的star和pull request乡话。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摧玫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绑青,更是在濱河造成了極大的恐慌诬像,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闸婴,死亡現(xiàn)場(chǎng)離奇詭異颅停,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掠拳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)癞揉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人溺欧,你說(shuō)我怎么就攤上這事喊熟。” “怎么了姐刁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵芥牌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我聂使,道長(zhǎng)壁拉,這世上最難降的妖魔是什么谬俄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮弃理,結(jié)果婚禮上溃论,老公的妹妹穿的比我還像新娘。我一直安慰自己痘昌,他們只是感情好钥勋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著辆苔,像睡著了一般算灸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻啤,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天菲驴,我揣著相機(jī)與錄音,去河邊找鬼骑冗。 笑死谢翎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沐旨。 我是一名探鬼主播森逮,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磁携!你這毒婦竟也來(lái)了褒侧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谊迄,失蹤者是張志新(化名)和其女友劉穎闷供,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體统诺,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歪脏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粮呢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婿失。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啄寡,靈堂內(nèi)的尸體忽然破棺而出豪硅,到底是詐尸還是另有隱情,我是刑警寧澤挺物,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布懒浮,位于F島的核電站,受9級(jí)特大地震影響识藤,放射性物質(zhì)發(fā)生泄漏砚著。R本人自食惡果不足惜次伶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稽穆。 院中可真熱鬧冠王,春花似錦、人聲如沸秧骑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乎折。三九已至,卻和暖如春侵歇,著一層夾襖步出監(jiān)牢的瞬間骂澄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惕虑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坟冲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓溃蔫,卻偏偏與公主長(zhǎng)得像健提,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伟叛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理私痹,服務(wù)發(fā)現(xiàn),斷路器统刮,智...
    卡卡羅2017閱讀 134,695評(píng)論 18 139
  • 你可能會(huì)把 NodeJS 用作網(wǎng)絡(luò)服務(wù)器紊遵,但你知道它還可以用來(lái)做爬蟲(chóng)嗎? 本教程中會(huì)介紹如何爬取靜態(tài)網(wǎng)頁(yè)——還有那...
    張嘉夫閱讀 5,100評(píng)論 3 51
  • 1. 前言 這篇文章藏在心中已經(jīng)好一段時(shí)日了侥蒙,遲遲不敢動(dòng)筆暗膜,主要是擔(dān)心不知道該如何去組織這樣一篇技術(shù)文章。 其實(shí)個(gè)...
    lanzhiheng閱讀 5,382評(píng)論 19 48
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,274評(píng)論 25 707
  • 感恩健康的犒賞讓我存活于世鞭衩。這幾日好朋友的拜訪讓我更加清楚健康的重要性学搜。平時(shí)不覺(jué)得健康的重要性,或者說(shuō)只是知道而沒(méi)...
    慧心如蓮閱讀 355評(píng)論 1 4