原文地址:http://blog.chinaunix.net/uid-22414998-id-3695673.html

 

续前文:《数据抓取的艺术(一):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()
  • 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()
  •       这回只分析了3个,共52秒,每个耗时约17秒,只是因为避免了重复PhantomJS的开启、运行和关闭这一过程

    程序优化:第二步
          减少对角线重复请求次数

  • 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()
  •      和上面的待分析的个数一样,花费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对象
  • 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 秒
  •     相当于每次握手,花费2秒。但这还存在一个致命伤,那就是在随着数据量的激增,以后经常要保存上万个值,每次都保存,那么次数越多写入量就会越大。只是希望微软的Excel已经能够知道:哪些是未改动数据就不必再次写入,哪些数据改动过需要写入。

    程序优化:第四步
          使用多线程+使用数据库。如果不用数据库,就靠读写一个单机版的Excel,效率太低,因此我考虑用Mysql或Sqlite。最后再将结果转出来。

    相关文章: