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

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

时间: 2024-12-21 22:48:24

数据抓取的艺术(二):数据抓取程序优化的相关文章

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什么东东,最后才是析出规则.编写代码.运行程序来抓取数据.所以说,其实数据抓取的学习路线,不但很长而且很杂.     为了一个特定的目的,我需要爬取G

数据抓取的艺术(三):抓取Google数据之心得

 本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下:    (1)时间      时间是一个与抓取规模相形而生的因素,数据规模越大,时间消耗往往越长.所以程序优化变得相当重要,要知道抓取时间越长,出错的可能性就越大,这还不说程序需要人工干预的情境.一旦运行中需要人工干预,时间越长,干预次数越多,出错的几率就更大了.在数据太多,工期太短的情况下,使用多线程抓取,也是一个好办法,但这会增加程序复杂度,对最终数

wireshark抓取本地回环数据包和取出数据的方法

 这篇文章主要介绍了wireshark抓取本地回环数据包和取出数据的方法,需要的朋友可以参考下 一:The NPF driver isn't running   这个错误是因为没有开启NPF服务造成的.   NPF即网络数据包过滤器(Netgroup Packet Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困难工作的组件.它处理网络上传输的数据包,并且对用户级提供可捕获(capture).发送(injection)和分析性能(analysis capabilitie

网页-如何网络爬虫抓取淘宝交易数据

问题描述 如何网络爬虫抓取淘宝交易数据 小弟学软件的,现在想开淘宝店,想想怎么能快速获得用户数据推广产品,问问说网络爬虫可行,可是对这方面不了解,有哪位大神可以教一下,获取自己和其他用户网页上的商品信息之类的,作为分析. 解决方案 搜索引擎如百度都不让抓淘宝里的交易数据,淘宝的安全工程师都不是吃素的,建议你换个课题吧 解决方案二: 可以先看看对应数据的http,浏览器查看一下是否有对应的api,然后再考虑怎么发送请求 解决方案三: 关于电商网站的爬虫,大家可以学习一下这个系列的教程:http:/

解决方案-GET抓取安居客网页数据频繁了被屏蔽怎么绕过他的验证?

问题描述 GET抓取安居客网页数据频繁了被屏蔽怎么绕过他的验证? 用火车头采集安居客,但是一会就会全部跳转到输入验证码页面验证了才能正常访问,除了用代理还有其他的解决方案吗? 解决方案 只能换ip,既然服务器封了就没办法了.不过网上有那种代理服务器api,几块钱一天,可以获取上万的不同ip,可以说基本上也就相当于没限制. 解决方案二: 活该,谁叫你频繁地搞,搞到手的数据就存起来用啊.不如果不用等待答复的,直接构造IP包发送请求就完了. 解决方案三: 用神箭手云爬虫吧,平台自动帮你解决这种ip啊,

wireshark抓取本地回环数据包和取出数据的方法_实用技巧

一:The NPF driver isn't running 这个错误是因为没有开启NPF服务造成的. NPF即网络数据包过滤器(Netgroup Packet Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困难工作的组件.它处理网络上传输的数据包,并且对用户级提供可捕获(capture).发送(injection)和分析性能(analysis capabilities). 它不仅提供了基本的特性(例如抓包),还有更高级的特性(例如可编程的过滤器系统).前者可以被用来约

PHP的cURL库功能简介:抓取网页,POST数据及其他

  使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库.本文主要讲述如果使用这个PHP库. 启用 cURL 设置 首先,我们得先要确定我们的PHP是否开启了这个库,你可以通过使用php_info()函数来得到这一信息. ﹤?php phpinfo(); ?﹥ 如果你可以在网

c c++-抓取迅雷下载的数据包特征

问题描述 抓取迅雷下载的数据包特征 通过抓取迅雷下载时的数据包分析出流量和五元组.可是迅雷的数据包据说是加密的,不能通过数据包特征判断,那么请问还有什么办法找出那些数据包是属于迅雷的.只要找出迅雷的数据包计算流量就行,不是禁用迅雷下载.本人新手,谢谢各位大神赐教啊!

tcpdump抓取移动终端的数据包

问题描述 tcpdump抓取移动终端的数据包 C:UsersTJW>adb devicesList of devices attached5066adc2 device C:UsersTJW>adb shellshell@cancro:/ $ suroot@cancro:/ # adb push e:/tcpdump /data/localerror: device not found1|root@cancro:/ # chmod 777 /data/localroot@cancro:/ #1