續前文:《資料抓取的藝術(一):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資料之心得》