续前文:《数据抓取的艺术(一):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=0j=0result=14000000
- i=0j=1result=2
- i=0j=2result=8
- i=0j=3result=1
- i=0j=4result=80400
- i=0j=5result=2
- i=0j=6result=3
- i=0j=7result=8470
- i=1j=1result=394000
- i=1j=2result=3140
- i=1j=3result=9
- i=1j=4result=57
- i=1j=5result=7
- i=1j=6result=3790
- i=1j=7result=718
- i=2j=2result=7110000
- i=2j=3result=7
- i=2j=4result=4
- i=2j=5result=232000
- i=2j=6result=382000
- i=2j=7result=7970
- i=3j=3result=981000
- i=3j=4result=7
- i=3j=5result=1
- i=3j=6result=2
- i=3j=7result=10
- i=4j=4result=398000
- i=4j=5result=4
- i=4j=6result=3850
- i=4j=7result=1390
- i=5j=5result=275000
- i=5j=6result=32100
- i=5j=7result=8
- i=6j=6result=8050000
- i=6j=7result=67800
- i=7j=7result=738000
- ----------------
- 执行成功!
- 程序耗时:72 秒
程序优化:第四步
使用多线程+使用数据库。如果不用数据库,就靠读写一个单机版的Excel,效率太低,因此我考虑用Mysql或Sqlite。最后再将结果转出来。
也请参看下文: 《数据抓取的艺术(三):抓取Google数据之心得》