天天看點

資料抓取的藝術(二):資料抓取程式優化

      續前文:《資料抓取的藝術(一):selenium+phantomjs資料抓取環境配置》。

程式優化:第一步

開始:

for i in range(startx,total):

    for j in range(starty,total):

        base_url = createtheurl([item[i],item[j]])

        driver.get(base_url)

        driver = webdriver.phantomjs()

        html = driver.page_source

        output = filteroutcome(html)

        driver.quit()

        print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)

    j += 1

      每個耗時約27秒。

修改後:

driver = webdriver.phantomjs()

        if output == -1:

            driver.quit()

            exit(0)

driver.quit()

      這回隻分析了3個,共52秒,每個耗時約17秒,隻是因為避免了重複phantomjs的開啟、運作和關閉這一過程。

程式優化:第二步

      減少對角線重複請求次數:

    if starty != -1:

        k = i

    else:

        k = starty

    for j in range(k,total):

        #toexcel("c:catchoutput.xlsx","sheet1",output,i,j)

     和上面的待分析的個數一樣,花費21秒,每個耗時約7秒。如果開啟excel存儲,則共花費25秒,每個耗時約8秒。

程式優化:第三步

      減少寫入excel的次數,提高硬碟性能。當然,資料量越大,次數越多,效果越明顯。這次把excel一直打開,每隔20個儲存一次。

#打開excel插件

xlsapp = win32com.client.dispatch("excel.application")

xlsbook = xlsapp.workbooks.open('c:catchoutput.xlsx')

xlssheet = xlsbook.sheets('sheet1')

#開啟webdirver的phantomjs對象

#main()

        mycounter += 1

            xlsbook.save()

            xlsbook.close()

            xlsapp.quit()

        xlssheet.cells(j+1,i+1).value = xlssheet.cells(i+1,j+1).value = output

        #每隔20個儲存一次,并重新清零

        if mycounter%20 == 0:

            print "~~~~~~ saved here ~~~~~~"

            mycounter = 0

#程式結束前的清掃工作

xlsbook.save()

xlsbook.close()

xlsapp.quit()

      結果如下:

>>>

請輸入起始xaas的序号x:0

請輸入起始xaas的序号y:0

待處理資料記錄總數:8 條

待處理握手總數:36 次

讀取info.txt檔案成功

計時開始!

----------------

i=0 j=0 result=14000000

i=0 j=1 result=2

i=0 j=2 result=8

i=0 j=3 result=1

i=0 j=4 result=80400

i=0 j=5 result=2

i=0 j=6 result=3

i=0 j=7 result=8470

i=1 j=1 result=394000

i=1 j=2 result=3140

i=1 j=3 result=9

i=1 j=4 result=57

i=1 j=5 result=7

i=1 j=6 result=3790

i=1 j=7 result=718

i=2 j=2 result=7110000

i=2 j=3 result=7

i=2 j=4 result=4

i=2 j=5 result=232000

i=2 j=6 result=382000

i=2 j=7 result=7970

i=3 j=3 result=981000

i=3 j=4 result=7

i=3 j=5 result=1

i=3 j=6 result=2

i=3 j=7 result=10

i=4 j=4 result=398000

i=4 j=5 result=4

i=4 j=6 result=3850

i=4 j=7 result=1390

i=5 j=5 result=275000

i=5 j=6 result=32100

i=5 j=7 result=8

i=6 j=6 result=8050000

i=6 j=7 result=67800

i=7 j=7 result=738000

執行成功!

程式耗時:72 秒

    相當于每次握手,花費2秒。但這還存在一個緻命傷,那就是在随着資料量的激增,以後經常要儲存上萬個值,每次都儲存,那麼次數越多寫入量就會越大。隻是希望微軟的excel已經能夠知道:哪些是未改動資料就不必再次寫入,哪些資料改動過需要寫入。

程式優化:第四步

      使用多線程+使用資料庫。如果不用資料庫,就靠讀寫一個單機版的excel,效率太低,是以我考慮用mysql或sqlite。最後再将結果轉出來。

    也請參看下文: 《資料抓取的藝術(三):抓取google資料之心得》