天天看点

数据抓取的艺术(二):数据抓取程序优化

      续前文:《数据抓取的艺术(一):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数据之心得》