閱讀642 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據抓取的藝術(二):數據抓取程序優化

      續前文:《數據抓取的藝術(一):Selenium+Phantomjs數據抓取環境配置》。


程序優化:第一步

開始:

  1. for i in range(startx,total):
  2.     for j in range(starty,total):
  3.         BASE_URL = createTheUrl([item[i],item[j]])
  4.         driver.get(BASE_URL)
  5.         driver = webdriver.PhantomJS()
  6.         html = driver.page_source
  7.         output = filterOutcome(html)
  8.         driver.quit()
  9.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  10.     j += 1

      每個耗時約27秒。

修改後:

  1. driver = webdriver.PhantomJS()
  2. for i in range(startx,total):
  3.     for j in range(starty,total):
  4.         BASE_URL = createTheUrl([item[i],item[j]])
  5.         driver.get(BASE_URL)
  6.         html = driver.page_source
  7.         output = filterOutcome(html)
  8.         
  9.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  10.         if output == -1:
  11.             driver.quit()
  12.             exit(0)
  13.     j += 1
  14. driver.quit()

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

程序優化:第二步
      減少對角線重複請求次數
  1. driver = webdriver.PhantomJS()
  2. for i in range(startx,total):
  3.     if starty != -1:
  4.         k = i
  5.     else:
  6.         k = starty
  7.     for j in range(k,total):
  8.         BASE_URL = createTheUrl([item[i],item[j]])
  9.         driver.get(BASE_URL)
  10.         html = driver.page_source
  11.         output = filterOutcome(html)
  12.         
  13.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  14.         if output == -1:
  15.             driver.quit()
  16.             exit(0)
  17.         #toexcel("C:catchoutput.xlsx","Sheet1",output,i,j)
  18.     j += 1
  19. driver.quit()
     和上麵的待分析的個數一樣,花費21秒,每個耗時約7秒。如果開啟excel存儲,則共花費25秒,每個耗時約8秒。

程序優化:第三步
      減少寫入Excel的次數,提高硬盤性能。
當然,數據量越大,次數越多,效果越明顯。這次把Excel一直打開,每隔20個保存一次。
  1. #打開Excel插件
  2. xlsApp = win32com.client.Dispatch("Excel.Application")
  3. xlsBook = xlsApp.Workbooks.Open('C:catchoutput.xlsx')
  4. xlsSheet = xlsBook.Sheets('Sheet1')

  5. #開啟webdirver的PhantomJS對象
  6. driver = webdriver.PhantomJS()

  7. #main()
  8. for i in range(startx,total):
  9.     if starty != -1:
  10.         k = i
  11.     else:
  12.         k = starty
  13.     for j in range(k,total):
  14.         BASE_URL = createTheUrl([item[i],item[j]])
  15.         driver.get(BASE_URL)
  16.         html = driver.page_source
  17.         output = filterOutcome(html)
  18.         
  19.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  20.         mycounter += 1
  21.         
  22.         if output == -1:
  23.             driver.quit()
  24.             xlsBook.Save()
  25.             xlsBook.Close()
  26.             xlsApp.Quit()
  27.             exit(0)
  28.         xlsSheet.Cells(j+1,i+1).Value = xlsSheet.Cells(i+1,j+1).Value = output

  29.         #每隔20個保存一次,並重新清零
  30.         if mycounter%20 == 0:
  31.             print "~~~~~~ SAVED HERE ~~~~~~"
  32.             xlsBook.Save()
  33.             mycounter = 0
  34.     j += 1

  35. #程序結束前的清掃工作
  36. driver.quit()
  37. xlsBook.Save()
  38. xlsBook.Close()
  39. xlsApp.Quit()
      結果如下:
  1. >>>
  2. 請輸入起始XaaS的序號X:0
  3. 請輸入起始XaaS的序號Y:0
  4. 待處理數據記錄總數:8 條
  5. 待處理握手總數:36 次
  6. 讀取info.txt文件成功
  7. 計時開始!
  8. ----------------
  9. i=0 j=0 result=14000000
  10. i=0 j=1 result=2
  11. i=0 j=2 result=8
  12. i=0 j=3 result=1
  13. i=0 j=4 result=80400
  14. i=0 j=5 result=2
  15. i=0 j=6 result=3
  16. i=0 j=7 result=8470
  17. i=1 j=1 result=394000
  18. i=1 j=2 result=3140
  19. i=1 j=3 result=9
  20. i=1 j=4 result=57
  21. i=1 j=5 result=7
  22. i=1 j=6 result=3790
  23. i=1 j=7 result=718
  24. i=2 j=2 result=7110000
  25. i=2 j=3 result=7
  26. i=2 j=4 result=4
  27. i=2 j=5 result=232000
  28. i=2 j=6 result=382000
  29. i=2 j=7 result=7970
  30. i=3 j=3 result=981000
  31. i=3 j=4 result=7
  32. i=3 j=5 result=1
  33. i=3 j=6 result=2
  34. i=3 j=7 result=10
  35. i=4 j=4 result=398000
  36. i=4 j=5 result=4
  37. i=4 j=6 result=3850
  38. i=4 j=7 result=1390
  39. i=5 j=5 result=275000
  40. i=5 j=6 result=32100
  41. i=5 j=7 result=8
  42. i=6 j=6 result=8050000
  43. i=6 j=7 result=67800
  44. i=7 j=7 result=738000
  45. ----------------
  46. 執行成功!
  47. 程序耗時:72 秒
    相當於每次握手,花費2秒。但這還存在一個致命傷,那就是在隨著數據量的激增,以後經常要保存上萬個值,每次都保存,那麼次數越多寫入量就會越大。隻是希望微軟的Excel已經能夠知道:哪些是未改動數據就不必再次寫入,哪些數據改動過需要寫入。

程序優化:第四步
      使用多線程+使用數據庫。如果不用數據庫,就靠讀寫一個單機版的Excel,效率太低,因此我考慮用Mysql或Sqlite。最後再將結果轉出來。

    也請參看下文: 《數據抓取的藝術(三):抓取Google數據之心得                

最後更新:2017-04-03 18:51:59

  上一篇:go Windows 8怎麼了?戴爾都想拋棄你了
  下一篇:go 基於bootstrap實現可視化布局工具