微信公眾號 文章的爬蟲系統


    差不多倆個星期了吧,一直在調試關於微信公眾號的文章爬蟲系統,終於一切都好了,但是在這期間碰到了很多問題,今天就來回顧一下,總結一下,希望有用到的小伙伴可以學習學習。

     1、做了倆次爬蟲了,第一次怕的鳳凰網,那個沒有限制,隨便爬,所以也就對自動化執行代碼模塊放松了警惕,覺得挺簡單的,但是其實不是這樣的,我被這個問題困擾了好幾天,差不多4天的一個樣子,因為搜狗做的限制,同一個ip獲取的次數多了,首先是出現驗證碼,其次是就是訪問限制了,直接就是不能訪問,利用 request得到的就是訪問次數過於頻繁,這樣子的提示,所以說開發過程中最頭疼的不是代碼的編寫,而是測試,寫完代碼不能立馬測試,這種感覺相信大多數的程序員是不能喜歡的,我現在寫的程序是每天執行三次,這樣的一個頻率還行,而且因為是多公眾號采集嘛,每個公眾號之間的間隔時間也的有,要不然同時訪問十幾個公眾號的上百篇文章也是不現實的,說到這里插一句,怎么讓每個公眾號怕去玩之后,等一段具體的時間,在執行下一個,最后用的setInterval函數解決的,

每過80秒執行一個公眾號,把每次的執行代碼寫到hello中,泡的有點遠了,收一收哈,說說cron這個包,自動化執行,npm官網上只給了一個例子,但是我這個指桑拿可能是有點壓制的厲害,不能夠玩卻理解他的用法,然后我說理解不了怎么辦啊,上網搜唄,百度,cron包的具體用法,一看,嚯,還挺多,於是就看啊看啊,但是仔細以分析就不是那么回事兒了,都是廢話,沒什么用,網上一般的用法中都帶有一個問號,但是我加上問號的時候,就報錯了,所以說都是扯淡,最后在同學組的一個前端技術討論群中說了一聲,還真有熱心的群友,給我找了一個鏈接,我進去一看,試了一下,還行,所以呢,非常感謝這個幫助我解惑的同學,再次我把qq群號,和鏈接附上,方便正在看這篇文章的你學習,QQ群號:435012561,鏈接:http://www.tuicool.com/articles/yy2Ivmj,這個鏈接里面說的還行,至少能用,這里我還行到一個問題,就是timezone,我們之前用過一次,用的是洛杉磯時間,但是這次明顯不行啊,要用咱們中國的時間啊,但是我試了幾次北京的不行,重慶的可以,所以我就用了重慶的。

     2、這里要說的是,從地址欄獲取參數的問題,我上一個做的沒問題,但是這個不知道怎么就不行了,上一個從地址欄得到的是數字,但是這個得到的是字符串,再加上mongodb中的對字段的要求還是挺嚴格的,所以一個分頁功能也困擾了我幾個小時吧,最后是怎么解決的呢,是通過我加的一個mongodb的討論群,在里面問了一句這是怎么了,發了個截圖,里面就有一個熱心的網友說你這明顯是傳入的數據格式不對啊,一語驚醒夢中人,我說是啊,然后就把得到的參數,我用Number()函數處理了一下,讓string類型的數字,變成了number類型的數字,就好了,所以說大家在用mongodb的時候一定要注意存儲數據的格式,

     3、mongodb查詢數據語句組織方式:

          

          其實說白了就是limit和skip倆個函數的使用,但是具體的格式可的看好了,還有我這個是接受的參數,不過mongo的參數接受也好弄直接寫就好了,不用像sql那樣搞什么${""}這種類型的,后面的sort函數說明了排序的方式,這里是設置的以ctime字段為標准,-1表示倒序,1表示正序,

 

     4、在本次代碼編寫中,我首次使用了try   catch 這個補錯的方式,事實證明,還行,可以把偶爾的錯誤正常的打印出來,但是不影響代碼的整體執行,或者是說下一次執行,整體感覺非常好,

    具體的使用方法,在try中放入你要執行的代碼,在最后加上一行,throw  Error();

    然后給catch傳入一個參數e,在catch中可以打印很多個信息,我只打印了其中的一個,e.message,

      5、這次編碼過程中主要用到了anync包,其中的ansyc.each循環,ansyc.waterfall執行完上面的才可以執行下面的,而且撒謊給你下之間還可以從上至下傳遞參數,這個很重要,因為在本次編程中,每次獲取的內容不同,每次代碼執行的條件不同,即需要的參數也不同,即有可能下一次代碼的執行就需要用到上一次代碼執行得到的結果,所以說這個anync包,真的是值得研究,他的每個方法都不同,有時候可以得到意想不到的效果。

       6、在mysql中如果想要達到這樣一個效果,就是說,如果數據庫中已經存在了,那就不予理會,或者說不重復存儲,如果數據庫中不存在,那么就存儲進來,很簡單,直接把插入數據的insert  換成 replace 。但是在mongodb中,應該是沒有,或者說是我還沒有發現,我是這么解決的,定義了一個開關,令這個開關為真,每次存儲之前,先把所有的數據循環一遍,看看有沒有這條數據,如果有,讓開關變為假,如果沒有,繼續執行,即判斷此時開關的真假,如果是真的,那就執行插入操作,如果是假的,就不予理會,這就達到了類似的效果,否則每次都會存儲大量的重復數據,

       7、本次采集的核心,就是我文件中的common.js了,首先因為要采集,所以需要用到request包,采集到之后,要處理html格式的數據,使之可以使用類jquery的操作,那么久用到了cheerio這個包,然后在循環采集的時候,會用到anync.each這個方法,所以會用到async這個包,

            7-1、

                 通過搜狗微信采集,就要分析搜狗微信的路徑,每個公眾號的頁面的路徑是這樣的

http://weixin.sogou.com/weixin?type=1&s_from=input&query=%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%AC&ie=utf8&_sug_=n&_sug_type_=

這個是“這才是日本”的頁面的鏈接,經過分析,所有的公眾號的鏈接只有query后面的參數不同,但是query后面的參數是什么呢,其實就是通過encodeURIComponent()這個函數轉化之后的“這才是日本”,所以說都一樣,獲取那個公眾號,就將那個公眾號的名字編碼之后,動態的組合成一個鏈接,訪問就可以進入到每個鏈接里面了,但是這個鏈接只是請求到了這個頁面,

 

 並不是

這個頁面,所以還的進一步處理,就是得到當前頁面的第一個內容的鏈接,即href

當得到了這個鏈接,就會發現他有他的加密方式,其實很簡單的,就是在鏈接里面的加了三個amp;把鏈接里面的這三個amp;替換為空,就好了,這也就是第一步,得到每一個公眾號的頁面鏈接,

                7-2

                     得到鏈接之后,就要進行訪問了,即請求,請求每個地址,得到每個地址的內容,但是每個頁面顯示的內容都不在頁面中,即html結構中,在js中藏着,所以要通過正則匹配,得到每篇文章的對象,然后就循環每個公眾號的這個對象,得到這個對象中的每篇文章的一些信息,包括title,thumb,abstract,URL,time,五個字段,但是我使用的代碼爛透了,盡然當時使用了

對象.屬性.foreach(function(item,index){

})

這種爛透了的方式,弄的最后好的在寫一次循環才可以完全的得到每一個對象,否則只可以得到第一個,在這里應該用async.each,或者async.foreach這倆中方式每種都可以啊,而且都是非常好用的方式。這樣的話買就得到了每篇文章的以上基本消息,

                7-3、

                     第三個階段,就是進入到每篇文章的詳情頁,獲得每篇文章的內容,點贊數,作者,公眾號,閱讀量等數據,在這里碰到的主要問題是,人家的content直接在在js中,所有的img標簽都有問題,他是以<image-src = "...>這種形式存在雨content中,但是這樣的話,這樣的圖片在我們的網頁中不能被顯示,因為標簽存在問題啊,html文檔不認識這樣的img標簽啊,所以這里要進行一些處理,把所有的<image-src = "...>用replace替換為<img src = "...>這樣的話就OK了,但是我在編程的時候進行到這兒碰到了一個傻逼問題,我將這樣的得到的content,放到html中可以,但是存到mongodb中,每個引號的前面莫名其妙的多了一條杠,每個img標簽多了三條杠,這樣的話就又不可以顯示了,我就一直糾結啊,怎么能存儲的時候不要這三條杠呢,經過了一番艱苦卓絕的斗爭,最后還是沒能解決了,最后加了一個mongodb 的討論群,我進去問了一下,有一個大神立馬說,你知道什么是轉義字符嗎?我當時很懵逼啊,我自認為我知道啊,人家說,你的群備注還是前端,你做前端的不明白這是轉義字符嗎?我就更加懵逼了,然后過了一會兒我才明白過來,這個是存儲的時候被轉義了,但是當從數據庫讀的時候,就自動有沒有了,所以說只有存在數據庫中的數據有三條杠,原始數據和讀取出來的數據都沒有,真是完美啊!

      8、最后想說一點,這次是我第一次接觸有驗證碼的網頁請求,這里用到了阿里一個服務,識別驗證碼,

     END!

 

https://www.cnblogs.com/boboweiqi/p/6782300.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM