续前文:《 数据抓取的艺术(一):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()
结果如下: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。最后再将结果转出来。
也请参看下文: 《数据抓取的艺术(三):抓取Google数据之心得》