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

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

? ? ?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

?

轉載于:https://www.cnblogs.com/softidea/p/8073617.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]關于C#操作WPS和office兼容性的問題

最近一直在做的開發是關于導出word的功能&#xff0c;一開始的做法是在VS中直接添加引用office PIA&#xff0c;Microsoft.Office.Interop.Word&#xff0c;VS08有兩個版本&#xff0c;V11和V12&#xff0c;V11對應的是office03&#xff0c;V12對應的office07&#xff0c;試驗之…

AI入門到進階到放棄

前些天&#xff0c;發現了一個比較好的AI學習網站&#xff0c;有很多數學基礎&#xff0c;也通俗易懂&#xff0c;我自己先記錄起來防止忘記&#xff0c;猛戳這里&#xff08;學習網站&#xff09;

OAuth認證與授權

什么是OAuth授權&#xff1f; 一、什么是OAuth協議OAuth(開放授權)是一個開放標準。允許第三方網站在用戶授權的前提下訪問在用戶在服務商那里存儲的各種信息。而這種授權無需將用戶提供用戶名和密碼提供給該第三方網站。OAuth允許用戶提供一個令牌給第三方網站&#xff0c;一個…

IO的多路復用

一、概念: 使單線程或者單進程同時監測若干個文件描述符具有執行的能力&#xff1b; 二、作用: 類似于多進程和多線程 三、必要性: 多線程或者多進程對資源需求較高 四、IO模型: 1.阻塞io 不設置的話系統默認 2.非阻塞io 在阻塞io的基礎上調整為不在阻塞狀態 用到的函數接口…

C# 禁用 全局快捷鍵

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;唐宋元明清原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/12558056.htmlC# 禁用 全局快捷鍵給軟件添加快捷鍵時&#xff0c;經常遇到其它軟件或者系統已設置的快捷鍵&#xff0c;導…

SegmentFault Hackathon 文藝復興

我有一個 idea&#xff0c;我想實現它&#xff0c;我正實現它&#xff0c;我已實現它。世界上存在一些好奇心旺盛、不愛墨守成規的人&#xff0c;略微偏執但又極度投入的他們崇尚自由&#xff0c;熱衷用技術實現自己的想法&#xff0c;他們帶著不羈的態度生活&#xff0c;利用編…

臥槽!VS Code 上竟然也能畫流程圖了???

作為一款開源的主流代碼編輯器&#xff0c;VSCode 在發布之后一直受到不少開發者的喜愛。 此前&#xff0c;我們也曾在公眾號上分享過多篇文章&#xff0c;向大家推薦了不少 VSCode 上比較實用&#xff08;或沙雕&#xff09;的插件。因此&#xff0c;有很多水友也經常調侃道&…

【QGIS入門實戰精品教程】14.1:QGIS如何加載各種在線地圖?

文章目錄 一、XYZ Tiles連接方式二、插件添加三、WMS/WMTS/OWS連接方式一、XYZ Tiles連接方式 1. 加載OpenStreetMap QGIS默認可以加載OpenStreetMap地圖。在左側點擊XYZ Tiles,默認下面有個OpenStreetMap選項,雙擊打右側會顯示地圖,如下圖所示: 在OpenStreetMap上右鍵→…

Oracle11g不能導出空表問題

ORACLE 11g 用exp命令導出庫文件備份時&#xff0c;發現只能導出來一部分表而且不提示錯誤&#xff0c;之前找不到解決方案只能把沒導出來的表重新建建立。后來發現是所有的空表都沒有導出來。于是想好好查查,因為在以前的10g版本中沒有這樣的問題。查資料發現Oracle 11g中有個…

SkiaSharp 之 WPF 自繪時鐘(案例版)

SkiaSharp是一個跨平臺2D圖形API&#xff0c;用于.NET平臺&#xff0c;基于Googles Skia Graphics庫(skia.org網站). 它提供了一個全面的2D API&#xff0c;可以跨移動、服務器和桌面模型來渲染圖像。該圖形庫可實現獲取指定坐標像素值、繪制2d圖形、繪制文字&#xff08;必須有…

推薦一簡單易用的腦圖制作工具

幕布是什么&#xff1f; 大綱文檔工具&#xff0c;管理你的大腦層級折疊文字&#xff0c;結構化思考助手一鍵轉換思維導圖并編輯&#xff0c;效率翻倍幕布可以做什么&#xff1f; 大綱筆記&#xff0c;思維整理 學習筆記清單工具 管理日程管理待辦購物清單等等內容創作會議記錄…

自動性能統計信息(三)(Automatic Performance Statistics)

1.3 管理自動工作負載庫&#xff08;AWR&#xff09;本節講述如何管理AWR&#xff0c;包含以下主題&#xff1a; 管理快照 管理基線 管理基線模板 傳輸自動工作負載庫數據 使用自動工作負載庫視圖 生成AWR報告 生成AWR對比報告 生成ASH報告 …

su: user tomcat does not exist

http://www.cnblogs.com/allegro/p/5005352.html 問題在于 你的startup.sh 里面設置了 用戶,你需要修改為root或者tomcat用戶 這是開發 遷移碰到的問題 test ".$TOMCAT_USER" . && TOMCAT_USERtomcat # Set JAVA_HOME to working JDK or JRE # JAVA_HOME/op…

【QGIS入門實戰精品教程】4.5:QGIS打開Excel中的點坐標,并生成矢量文件

QGIS中可以很方便添加Excel或其他文本格式的點坐標,并將其轉為矢量等多種格式的文件。 擴展閱讀: 【ArcGIS風暴】ArcGIS 10.2導入Excel數據X、Y坐標(經緯度、平面坐標),生成Shapefile點數據圖層 文章目錄 1. 數據準備2. 添加數據3. 保存文矢量文件1. 數據準備 本實驗使用…

[NOI2014]起床困難綜合癥

從高位往地位貪心即可 # include <bits/stdc.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e5 10);IL ll Read(){RG char c getchar(); RG ll x 0, z 1;for(;…

騰訊云EKS 上部署 eshopondapr

騰訊云容器服務&#xff08;Tencent Kubernetes Engine&#xff0c;TKE&#xff09;基于原生 kubernetes 提供以容器為核心的、高度可擴展的高性能容器管理服務。騰訊云容器服務完全兼容原生 kubernetes API &#xff0c;擴展了騰訊云的云硬盤、負載均衡等 kubernetes 插件&…

[轉]一往無前 | 小米十周年,雷軍公開演講全文

2020年8月11日19:30&#xff0c;小米十周年&#xff0c;雷軍公開演講如約而至。在近3小時的演講中&#xff0c;雷軍用20個故事回顧了小米過去的熱血10年&#xff0c;也展望了新的10年&#xff1a; - 創新之火將會照亮每個瘋狂的想法&#xff0c;小米將成為工程師向往的圣地。 -…

JAVA單例之我見

為什么80%的碼農都做不了架構師&#xff1f;>>> 單例模式作為設計模式中最簡單的一種&#xff0c;是一個被說爛了的東西。但是在項目中還是會發現關于單例模式的一些錯誤實現&#xff0c;可見單例也并不是我們想象的那么簡單。最近陸陸續續看了幾篇關于單例的博客&…

「劉一哥GIS」系列專欄《QGIS入門實戰精品教程(配套案例數據)》

「劉一哥GIS」系列專欄《QGIS入門實戰精品教程&#xff08;配套案例數據&#xff09;》全新上線了&#xff0c;歡迎廣大GISer朋友關注&#xff0c;一起探索GIS奧秘&#xff0c;分享GIS價值&#xff01; 本專欄以實戰案例的形式&#xff0c;深入淺出地介紹了QGIS的基本使用方法&…

MyEclipse的Git配置

1.下載&#xff1a;git的插件egit 并解壓 插件 下載地址&#xff1a;http://www.eclipse.org/egit/download/ 所有版本&#xff1a;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F 2.在MyEclipse安裝目錄下的dropins文件夾下創建egit文件夾 3.…