[爬蟲]抓取知乎百萬用戶信息之總結篇


             點擊我前往Github查看源代碼   別忘記star

本項目github地址:https://github.com/wangqifan/ZhiHu     

第一個大錯誤是沒能及時釋放非托管資源,導致程序運行長的之后拋出OutOfMemoryException.

這個小Demo主要的非托管資源一個是http請求的httpWebresopne和流,另外一個是RedisCline。導致這個問題出現不是我不知道要釋放非托管資源,而是代碼疏忽。這個寫代碼習慣應該是很久了,因為以前程序並沒有運行很久在,這個問題並沒有暴露出來

剛開始時候是這樣寫的

using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                                {

                                    return reader.ReadToEnd();
                                }

之間在using語句里面執行,這樣還沒有釋放對象就返回了

改進:

string Source = string.Empty;
…
using (Stream stream = response.GetResponseStream())//原始
                            {
                                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                                {

                                    Source = reader.ReadToEnd();
                                }
                            }
…
   return Source;

對待非托管資源,兩個推薦方法

第二大錯誤,將異步等同與多線程

異步不等於多線程

對於I/O密集型應該使用異步,對於CPU密集型用多線程。爬蟲中獲取網絡資源是I/O密集型,而html解析是cpu密集型的。由於爬蟲中非要獲取資源才能解析,我並沒有采用異步

  1. using語句,執行超出using就會被釋放
  2. 巧用finallly語句 try{}catch{}不要忘了還有finally 在finally里面顯示調用dispose方法

其實他們編譯結果是一樣的

我踩的第一大坑httpwebrequest默認連個連接,不管開多少線程還是那個速度

需要在app.config里面添加

<system.net>
        <connectionManagement>
            <add address="*" maxconnection="100000"></add>
        </connectionManagement>
    </system.net>

缺陷:

sqlserver中很多表是1對多關系,由於數據不夠規范導致一對多變成一對一很多數據冗余

 

數據展示

采用echart,關於echart請看我的博客http://www.cnblogs.com/zuin/p/6122818.html

男女比例

被關注量分布

 

校友數最多的10個學校

員工最多的10個公司

主修專業人數前10

或贊數最多的top10

 

 


免責聲明!

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



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