数据抓取的艺术(二):数据抓取程序优化-阿里云开发者社区

开发者社区> 龙盛国际> 正文

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

简介:
+关注继续查看
      续前文:《数据抓取的艺术(一):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个保存一次。
  1. #打开Excel插件
  2. xlsApp = win32com.client.Dispatch("Excel.Application")
  3. xlsBook = xlsApp.Workbooks.Open('C:catchoutput.xlsx')
  4. xlsSheet = xlsBook.Sheets('Sheet1')

  5. #开启webdirver的PhantomJS对象
  6. driver = webdriver.PhantomJS()

  7. #main()
  8. for i in range(startx,total):
  9.     if starty != -1:
  10.         k = i
  11.     else:
  12.         k = starty
  13.     for j in range(k,total):
  14.         BASE_URL = createTheUrl([item[i],item[j]])
  15.         driver.get(BASE_URL)
  16.         html = driver.page_source
  17.         output = filterOutcome(html)
  18.         
  19.         print 'i='+str(i)+'tj='+str(j)+'tresult='+str(output)
  20.         mycounter += 1
  21.         
  22.         if output == -1:
  23.             driver.quit()
  24.             xlsBook.Save()
  25.             xlsBook.Close()
  26.             xlsApp.Quit()
  27.             exit(0)
  28.         xlsSheet.Cells(j+1,i+1).Value = xlsSheet.Cells(i+1,j+1).Value = output

  29.         #每隔20个保存一次,并重新清零
  30.         if mycounter%20 == 0:
  31.             print "~~~~~~ SAVED HERE ~~~~~~"
  32.             xlsBook.Save()
  33.             mycounter = 0
  34.     j += 1

  35. #程序结束前的清扫工作
  36. driver.quit()
  37. xlsBook.Save()
  38. xlsBook.Close()
  39. xlsApp.Quit()
      结果如下:
  1. >>>
  2. 请输入起始XaaS的序号X:0
  3. 请输入起始XaaS的序号Y:0
  4. 待处理数据记录总数:8 条
  5. 待处理握手总数:36 次
  6. 读取info.txt文件成功
  7. 计时开始!
  8. ----------------
  9. i=0 j=0 result=14000000
  10. i=0 j=1 result=2
  11. i=0 j=2 result=8
  12. i=0 j=3 result=1
  13. i=0 j=4 result=80400
  14. i=0 j=5 result=2
  15. i=0 j=6 result=3
  16. i=0 j=7 result=8470
  17. i=1 j=1 result=394000
  18. i=1 j=2 result=3140
  19. i=1 j=3 result=9
  20. i=1 j=4 result=57
  21. i=1 j=5 result=7
  22. i=1 j=6 result=3790
  23. i=1 j=7 result=718
  24. i=2 j=2 result=7110000
  25. i=2 j=3 result=7
  26. i=2 j=4 result=4
  27. i=2 j=5 result=232000
  28. i=2 j=6 result=382000
  29. i=2 j=7 result=7970
  30. i=3 j=3 result=981000
  31. i=3 j=4 result=7
  32. i=3 j=5 result=1
  33. i=3 j=6 result=2
  34. i=3 j=7 result=10
  35. i=4 j=4 result=398000
  36. i=4 j=5 result=4
  37. i=4 j=6 result=3850
  38. i=4 j=7 result=1390
  39. i=5 j=5 result=275000
  40. i=5 j=6 result=32100
  41. i=5 j=7 result=8
  42. i=6 j=6 result=8050000
  43. i=6 j=7 result=67800
  44. i=7 j=7 result=738000
  45. ----------------
  46. 执行成功!
  47. 程序耗时:72 秒
    相当于每次握手,花费2秒。但这还存在一个致命伤,那就是在随着数据量的激增,以后经常要保存上万个值,每次都保存,那么次数越多写入量就会越大。只是希望微软的Excel已经能够知道:哪些是未改动数据就不必再次写入,哪些数据改动过需要写入。

程序优化:第四步
      使用多线程+使用数据库。如果不用数据库,就靠读写一个单机版的Excel,效率太低,因此我考虑用Mysql或Sqlite。最后再将结果转出来。

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

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

相关文章
5、深入理解计算机系统笔记:优化程序性能
1、编译技术被分为“与机器无关”和“与机器相关”两类。“与机器无关”,使用这些技术时可以不考虑将执行代码的计算机的特性;而“与机器有关”,指这些技术依赖于许多机器的低级细节。 2、最小二乘法拟合 3、优化之一:消除循环的低效率 将循环中需要每次计算,但是计算结果不会改变的语句移出去,称为代码移动(code motion)。
669 0
jquery性能优化
之前,我们减少字节数和请求次数以及加载顺序以使页面加载的更快。如今,我们越来越多的注意到另一个影响网站性能的部分--CPU利用率。
741 0
Mysql优化策略
Mysql优化策略总的来说:1、数据库设计和表创建时就要考虑性能 2、sql的编写需要注意优化 3、分区、分表、分库 设计表的时候: 1、字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。
1568 0
C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方程,以及非线性优化的一些算法,如BFGS,FRPR,PSO等等用于多元函数的极值求解,所以这些数值算法的性能直接影响系统的性能。
1153 0
某物流客户Elasticsearch集群性能优化案例
袋鼠云通过数据集成优化、任务调度优化、代码优化、全链路数据质量保障、故障紧急处理、大数据平台运维,为客户提供大数据系统运维保障服务。
2331 0
C# 将数据写入当前程序安装目录某文件夹下
public static string GetXmlFullPath(string strPath) { string filePath = GetPhysicalPath(); if (filePath.IndexOf(":") > 0) { return filePath; } else { r
1407 0
帆软FineReport如何使用程序数据集
大多数情况下,FineReport直接在设计器里使用“数据集查询”,直接写SQL就能满足报表要求,但对于一些复杂的报表,有时候SQL处理并不方便,这时可以把查询结果在应用层做一些预处理后,再传递给报表,即所谓的“程序数据集”,FineReport的帮助文档上给了一个示例: 1 package com.
1509 0
+关注
龙盛国际
南京师范大学虚拟地理环境教育部重点实验室,研究方向为地图综合,并行计算和云计算相关领域。 从事电子地图开发,室内导航开发。 QQ:592701357
211
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载