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

简介:       续前文:《数据抓取的艺术(一):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数据之心得     
相关文章
|
Java 应用服务中间件 Nacos
阿里巴巴NACOS(3)- 部署Nacos的生产集群环境
上一篇文章介绍了如何在Spring Cloud中使用Nacos,让我感觉是无缝支持Spring Cloud,可惜的是阿里云的MSE暂时只支持Nacos的服务注册和发现,配置中心还是需要用阿里云的ACM来完成,本文将介绍如何部署Nacos的生产集群环境。
13947 0
阿里巴巴NACOS(3)- 部署Nacos的生产集群环境
|
机器学习/深度学习 人工智能 算法
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
服装识别系统,本系统作为图像识别方面的一个典型应用,使用Python作为主要编程语言,并通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对18种不同的服装('黑色连衣裙', '黑色衬衫', '黑色鞋子', '黑色短裤', '蓝色连衣裙', '蓝色衬衫', '蓝色鞋子', '蓝色短裤', '棕色鞋子', '棕色短裤', '绿色衬衫', '绿色鞋子', '绿色短裤', '红色连衣裙', '红色鞋子', '白色连衣裙', '白色鞋子', '白色短裤')数据集进行训练,最后得到一个识别精度较高的H5格式模型文件,然后基于Django搭建Web网页端可视化操作界面,实现用户在界面中
537 1
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
|
Java 测试技术 程序员
基于SpringBoot+Vue交流和分享平台的设计与实现(源码+部署说明+演示视频+源码介绍)(2)
基于SpringBoot+Vue交流和分享平台的设计与实现(源码+部署说明+演示视频+源码介绍)
253 1
|
存储 运维 监控
云端部署mes/万界星空科技云mes系统
万界星空科技MES制造执行系统,应用云上托管,提供云上自动部署和运维能力,解决手工部署效率低、错误率高、升级困难、业务中断、监控定位难等应用运维问题,适用于政企IT系统及互联网类应用。
234 1
|
12月前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
2584 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
存储 运维 监控
|
网络协议 PHP 网络虚拟化
BGP MPLS VPN(OPTION B)实验笔记
BGP MPLS VPN(OPTION B)实验笔记
282 0
BGP MPLS VPN(OPTION B)实验笔记
|
JavaScript
uniapp-----封装接口
uniapp-----封装接口
231 0
uniapp-----封装接口
|
算法 IDE 开发工具
【Python语法】类型提示(self, nums: List[int]) -> List[int],报错NameError: name ‘List‘ is not defined解决
【Python语法】类型提示(self, nums: List[int]) -> List[int],报错NameError: name ‘List‘ is not defined解决
|
SQL 前端开发 JavaScript
基于java+springboot的大学生求职招聘管理系统
该系统是基于java+springboot开发的求职管理系统。大家学习过程中,遇到问题可以咨询作者
331 0