开发者社区> 五岳之巅> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:       续前文:《数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置》。 程序优化:第一步开始: for i in range(startx,total):     for j in range(...
+关注继续查看

      续前文:数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置》。


程序优化:第一步

开始:

  1. for i in range(startx,total):
  2.     for j in range(starty,total):
  3.         BASE_URL = createTheUrl([item[i],item[j]])
  4.         driver.get(BASE_URL)
  5.         driver = webdriver.PhantomJS()
  6.         html = driver.page_source
  7.         output = filterOutcome(html)
  8.         driver.quit()
  9.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  10.     j += 1

      每个耗时约27秒。

修改后:

  1. driver = webdriver.PhantomJS()
  2. for i in range(startx,total):
  3.     for j in range(starty,total):
  4.         BASE_URL = createTheUrl([item[i],item[j]])
  5.         driver.get(BASE_URL)
  6.         html = driver.page_source
  7.         output = filterOutcome(html)
  8.         
  9.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  10.         if output == -1:
  11.             driver.quit()
  12.             exit(0)
  13.     j += 1
  14. driver.quit()

      这回只分析了3个,共52秒,每个耗时约17秒,只是因为避免了重复PhantomJS的开启、运行和关闭这一过程

程序优化:第二步
      减少对角线重复请求次数
  1. driver = webdriver.PhantomJS()
  2. for i in range(startx,total):
  3.     if starty != -1:
  4.         k = i
  5.     else:
  6.         k = starty
  7.     for j in range(k,total):
  8.         BASE_URL = createTheUrl([item[i],item[j]])
  9.         driver.get(BASE_URL)
  10.         html = driver.page_source
  11.         output = filterOutcome(html)
  12.         
  13.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  14.         if output == -1:
  15.             driver.quit()
  16.             exit(0)
  17.         #toexcel("C:catchoutput.xlsx","Sheet1",output,i,j)
  18.     j += 1
  19. 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。最后再将结果转出来。

    也请参看下文: 《数据抓取的艺术(三):抓取Google数据之心得     

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一个将当前目录下HEX文件的第一行数据删除的程序
为什么要写这样一个函数 在使用SoftConsole开发M3程序时,生成的hex文件,必须要把第一行数据删除,才能在Libero中使用,所以写了这个小工具,这是2.0版本了,第一版是直接删除第一行数据,有可能会导致误操作。
783 0
Java程序与其它进程的数据通信
Java程序中可以启动其他的应用程序,这种在Java中启动的进程称为子进程,启动子进程的Java程序称为父进程,其实这个父进程就是一个Java虚拟机1、在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器(也就是不再接收键盘输入,和显示器输 出),而是以管道流的形式连接到父进程的一个输出流和输入流对象上2、调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。
792 0
+关注
262
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载