數據抓取的藝術(二):數據抓取程序優化
續前文:《數據抓取的藝術(一):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
修改後:
- driver = webdriver.PhantomJS()
-
for i in range(startx,total):
- for j in range(starty,total):
- BASE_URL = createTheUrl([item[i],item[j]])
- driver.get(BASE_URL)
- html = driver.page_source
- output = filterOutcome(html)
-
- print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
- if output == -1:
- driver.quit()
- exit(0)
- j += 1
- driver.quit()
程序優化:第二步
減少對角線重複請求次數:
- driver = webdriver.PhantomJS()
-
for i in range(startx,total):
- if starty != -1:
- k = i
- else:
- k = starty
- for j in range(k,total):
- BASE_URL = createTheUrl([item[i],item[j]])
- driver.get(BASE_URL)
- html = driver.page_source
- output = filterOutcome(html)
-
- print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
- if output == -1:
- driver.quit()
- exit(0)
- #toexcel("C:catchoutput.xlsx","Sheet1",output,i,j)
- j += 1
- driver.quit()
程序優化:第三步
減少寫入Excel的次數,提高硬盤性能。當然,數據量越大,次數越多,效果越明顯。這次把Excel一直打開,每隔20個保存一次。
- #打開Excel插件
- xlsApp = win32com.client.Dispatch("Excel.Application")
- xlsBook = xlsApp.Workbooks.Open('C:catchoutput.xlsx')
- xlsSheet = xlsBook.Sheets('Sheet1')
- #開啟webdirver的PhantomJS對象
- driver = webdriver.PhantomJS()
- #main()
-
for i in range(startx,total):
- if starty != -1:
- k = i
- else:
- k = starty
- for j in range(k,total):
- BASE_URL = createTheUrl([item[i],item[j]])
- driver.get(BASE_URL)
- html = driver.page_source
- output = filterOutcome(html)
-
- print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
- mycounter += 1
-
- if output == -1:
- driver.quit()
- xlsBook.Save()
- xlsBook.Close()
- xlsApp.Quit()
- exit(0)
- xlsSheet.Cells(j+1,i+1).Value = xlsSheet.Cells(i+1,j+1).Value = output
- #每隔20個保存一次,並重新清零
- if mycounter%20 == 0:
- print "~~~~~~ SAVED HERE ~~~~~~"
- xlsBook.Save()
- mycounter = 0
- j += 1
- #程序結束前的清掃工作
- driver.quit()
- 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 秒
程序優化:第四步
使用多線程+使用數據庫。如果不用數據庫,就靠讀寫一個單機版的Excel,效率太低,因此我考慮用Mysql或Sqlite。最後再將結果轉出來。
也請參看下文: 《數據抓取的藝術(三):抓取Google數據之心得》
最後更新:2017-04-03 18:51:59