1. 程式人生 > >爬蟲效能分析及優化

爬蟲效能分析及優化

前兩天我們寫了單任務版爬蟲爬取了珍愛網使用者資訊,那麼它的效能如何呢?

我們可以通過網路利用率看一下,我們用工作管理員中的效能分析視窗可以看到下載速率大概是保持在了200kbps左右,這可以說是相當慢了。

我們針對來通過分析單任務版爬蟲的設計來看下:

從上圖我們可以看出,engine將request從任務佇列取出來,送到Fetcher取獲取資源,等待資料返回,然後將返回的資料送到Parser去解析,等待其返回,把返回的request再加到任務佇列裡,同時把item打印出來。

慢就慢在了沒有充分利用網路資源,其實我們可以同時傳送多個Fetcher和Pareser,等待其返回的同時,可以去做其他的處理。這一點利用go的併發語法糖很容易實現。

上圖中,Worker是Fetcher和Parser的合併,Scheduler將很多Request分發到不同的Worker,Worker將Request和Items返回到Engine,Items打印出來,再把Request放到排程器裡。

基於此用程式碼實現:

Engine:

package engine

import (
 "log"
)

type ConcurrentEngine struct {
 Scheduler Scheduler
 WokerCount int
}

type Scheduler interface {
 Submit(Request)
 ConfigureMasterWorkerChan(chan Request)
}

func (e *ConcurrentEngine) Run(seeds ...Request) {

 in := make(chan Request)
 out := make(chan ParserResult)

 e.Scheduler.ConfigureMasterWorkerChan(in)

 //建立Worker
 for i := 0; i < e.WokerCount; i++ {
   createWorker(in, out)
 }


 //任務分發給Worker
 for _, r := range seeds {
   e.Scheduler.Submit(r)
 }


 for  {

   //列印out的items
   result := <- out
   for _, item := range result.Items {
     log.Printf("Get Items: %v\n", item)
   }

   //將out裡的Request送給Scheduler
   for _, r := range result.Requests {
     e.Scheduler.Submit(r)
   }

 }
}

//workerConut goroutine to exec worker for Loop
func createWorker(in chan Request, out chan ParserResult) {
 go func() {
   for {
     request := <-in

     parserResult, err := worker(request)

     //發生了錯誤繼續下一個
     if err != nil {
       continue
     }

     //將parserResult送出
     out <- parserResult
   }
 }()
}

Scheduler:

package scheduler

import "crawler/engine"

//SimpleScheduler one workChan to multi worker
type SimpleScheduler struct {
 workChan chan engine.Request
}

func (s *SimpleScheduler) ConfigureMasterWorkerChan(r chan engine.Request) {
 s.workChan = r
}

func (s *SimpleScheduler) Submit(r engine.Request) {
 go func() { s.workChan <- r }()
}

Worker:

func worker(r Request) (ParserResult, error) {

 log.Printf("fetching url:%s\n", r.Url)
 //爬取資料
 body, err := fetcher.Fetch(r.Url)

 if err != nil {
   log.Printf("fetch url: %s; err: %v\n", r.Url, err)
   //發生錯誤繼續爬取下一個url
   return ParserResult{}, err
 }

 //解析爬取到的結果
 return r.ParserFunc(body), nil
}

main函式:

package main

import (
 "crawler/engine"
 "crawler/zhenai/parser"
 "crawler/scheduler"
)

func main() {

 e := &engine.ConcurrentEngine{
   Scheduler: &scheduler.SimpleScheduler{},
   WokerCount :100,
 }

 e.Run(
   engine.Request{
     Url:        "http://www.zhenai.com/zhenghun",
     ParserFunc: parser.ParseCityList,
   })

}

這裡開啟100個Worker,執行後再次檢視網路利用率,變為3M以上。

由於程式碼篇幅較長,需要的同學可以關注公眾號回覆:go爬蟲 獲取。



本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大資料、面試資料、前端 等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號後臺回覆【2】,免費邀請加技術交流群互相學習提高,會不定期分享程式設計IT相關資源。


掃碼關注,精彩內容第一時間推給你

相關推薦

爬蟲效能分析優化

前兩天我們寫了單任務版爬蟲爬取了珍愛網使用者資訊,那麼它的效能如何呢? 我們可以通過網路利用率看一下,我們用工作管理員中的效能分析視窗可以看到下載速率大概是保持在了200kbps左右,這可以說是相當慢了。 我們針對來通過分析單任務版爬蟲的設計來看下: 從上圖我們可以看出,engine將request從

使用Android Profile做效能分析優化

前言 做Android開發五年,開發工具從最初的eclipse+ADT外掛到AndroidStduio。Google更是在新版的AndroidStudio中集成了Android應用效能分析利器——Profile。 本文基於AndroidStudio 3.2.1 正式版進行分析並定位問題原因。附上下載地址:

Android介面效能分析優化

效能問題分析主要包括三個方面 1.介面渲染 2.記憶體與GC3.電量優化 介面渲染 大多數使用者感知到的卡頓等效能問題的最主要根源都是因為渲染效能我們希望App能夠有更多的動畫,圖片等時尚元素來實現流暢的用 戶體驗。但是Android系統很有可能無法及時完成那些複雜的介面渲

使用explain分析優化由多表(三個以上)組成的檢視效能

檢視如下圖: create or replace view FLOW_SUBMITPROCESS_V as  select pi.START_USER_ID_,pir.STARTUSERID,pi.PROC_INST_ID_,pir.PROCESSINSTID,pir.

效能測試之壓力機瓶頸分析優化

效能測試過程中,為了給伺服器足夠的壓力,少不了要使用壓力機,即模擬客戶端的機器,壓力機如果使用不當,測試結果就會不準確,反映不了伺服器的真實效能情況。 因此,我們需要充分了解壓力機,並對其進行調優,從而避免壓力機自身瓶頸對壓測帶來影響,為效能測試結果的準確可靠

PostgreSQL CPU滿(100%)性能分析優化(轉)

mark ike -- 過多 mar 是不是 影響 sas sql日誌 PostgreSQL CPU滿(100%)性能分析及優化 轉自:https://help.aliyun.com/knowledge_detail/43562.html 在數據庫運維當中,

Mysql 多表聯合查詢效率分析優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

實戰現網問題之sql 效能分析處理

前段時間週末快11點了,收到前下屬小明的QQ訊息和電話 說遇到個很急的問題,公司在做個活動,但伺服器經常掛,就算重啟伺服器, 15分鐘後,rds資料庫cpu就會到 100% 把連線情況發了個圖過來 通過以上截圖,給他分析了下:    在連

MySQL效能分析優化-part 1

  MySQL效能優化 平時我們在使用MySQL的時候,怎麼評估系統的執行狀態,怎麼快速定位系統瓶頸,又如何快速解決問題呢? 本文總結了多年來MySQL優化的經驗,系統介紹MySQL優化的方法。 OS效能分析 使用top觀察top cpu/memory程序 使用mpstat觀察每

MYSQL多表聯查效率分析優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!         &n

Python程式設計實現對2個字串最長的公共子串的多種求解方式,效能測試優化

解法1-暴力求解法: def LongestCommonSubstring(FirstString,SecondString): ''' 求最長子串解法1: 以字串1的每個漢字作為起始位置 去字串2中找到能與之匹配的最長長度 將這個長度和記錄的最長長度比較

MySQL慢日誌功能分析優化增強

此文已由作者溫正湖授權網易雲社群釋出。歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。MySQL慢日誌(slow log)是MySQL DBA及其他開發、運維人員需經常關注的一類資訊。使用慢日誌可找出執行時間較長或未走索引等SQL語句,為進行系統調優提供依據。本文結合線上案

迴圈查詢資料的效能問題優化

寫在前言:糟糕的程式碼,對程式碼維護、效能、團隊協作都會造成負面影響,所以,先設計再實現,謀而後動。         這裡的迴圈查詢,指的是在一個for迴圈中,不斷訪問資料庫來查詢資料。在剛接手公司

由淺入深探究mysql索引結構原理、效能分析優化

第一部分:基礎知識 第二部分:MYISAM和INNODB索引結構 1、 簡單介紹B-tree B+ tree樹 2、 MyisAM索引結構 3、 Annode索引結構 4、 MyisAM索引與InnoDB索引相比較 第三部分:MYSQL優化 1、表資料型別選擇 2、sql語句優化 (1)     最左字首

排序演算法之效能分析總結

一、排序演算法說明 排序的定義:對一個無序的序列進行排序的過程。 輸入:n個數:a1,a2,a3,…,an。 輸出:n個數的排列:a1,a2,a3,…,an,使得a1<=a2<=a3<=…<=an。 排序的穩定性:相同值的節點相對

帶你玩轉Visual Studio——效能分析優化

上一篇文章帶你玩轉Visual Studio——VC++的多執行緒開發講了VC++中多執行緒的主要用法。多執行緒是提升效能和解決併發問題的有效途經。在商用程式的開發中,效能是一個重要的指標,程式的效能優化也是一個重要的工作。 找到效能瓶頸 二八法則適

使用 VisualVM 進行效能分析調優

原文轉載 概述 開發大型 Java 應用程式的過程中難免遇到記憶體洩露、效能瓶頸等問題,比如檔案、網路、資料庫的連線未釋放,未優化的演算法等。隨著應用程式的持續執行,可能會造成整個系統執行效率下降,嚴重的則會造成系統崩潰。為了找出程式中隱藏的這些問題,在專案開發後期往

JNI/NDK開發指南(九)——JNI呼叫效能測試優化

在前面幾章我們學習到了,在Java中宣告一個native方法,然後生成本地介面的函式原型宣告,再用C/C++實現這些函式,並生成對應平臺的動態共享庫放到Java程式的類路徑下,最後在Java程式中呼叫宣告的native方法就間接的呼叫到了C/C++編寫的函數

Top團隊大牛帶你玩轉Android效能分析優化

第1章 課程導學與學習指南 效能優化是高階工程師必備的技能,本課程將帶你由表及裡學到國內Top團隊對效能問題的體系化解決方案,滿滿的乾貨讓你輕鬆晉級高階工程師。  1-1 課前必讀(不看會錯過一個億)  1-2 課程導學試看

mysql聯合查詢分析優化

最近在做報表,跟資料庫打交道的比較多,所以特意來總結一下mysql的聯合查詢; 查詢常用的字句     where(條件查詢)、having(篩選)、group by(分組)、order by(排序)、limit(分頁)、USING(取交集) 1、where常用運算子