数据抓取的艺术(二)

原文地址:http://blog.chinaunix.net/uid-22414998-id-3695673.html

续前文:《数据抓取的艺术(一):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. print ‘i=‘+str(i)+‘tj=‘+str(j)+‘tresult=‘+str(output)
  9. if output == -1:
  10. driver.quit()
  11. exit(0)
  12. j += 1
  13. 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. print ‘i=‘+str(i)+‘tj=‘+str(j)+‘tresult=‘+str(output)
  13. if output == -1:
  14. driver.quit()
  15. exit(0)
  16. #toexcel("C:catchoutput.xlsx","Sheet1",output,i,j)
  17. j += 1
  18. 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. print ‘i=‘+str(i)+‘tj=‘+str(j)+‘tresult=‘+str(output)
  19. mycounter += 1
  20. if output == -1:
  21. driver.quit()
  22. xlsBook.Save()
  23. xlsBook.Close()
  24. xlsApp.Quit()
  25. exit(0)
  26. xlsSheet.Cells(j+1,i+1).Value = xlsSheet.Cells(i+1,j+1).Value = output
  27. #每隔20个保存一次,并重新清零
  28. if mycounter%20 == 0:
  29. print "~~~~~~ SAVED HERE ~~~~~~"
  30. xlsBook.Save()
  31. mycounter = 0
  32. j += 1
  33. #程序结束前的清扫工作
  34. driver.quit()
  35. xlsBook.Save()
  36. xlsBook.Close()
  37. 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。最后再将结果转出来。

时间: 2024-07-28 19:26:21

数据抓取的艺术(二)的相关文章

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

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什

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

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

数据抓取的艺术(三)

原文地址:http://blog.chinaunix.net/uid-22414998-id-3696649.html 本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下: (1)时间     时间是一个与抓取规模相形而生的因素,数据规模越大,时间消耗往往越长.所以程序优化变得相当重要,要知道抓取时间越长,出错的可能性就越大,这还不说程序需要人工干预的情境.一旦运行中需要人工干预,时间越长,干预次数越多,出

数据抓取的艺术(一)

原文地址:http://blog.chinaunix.net/uid-22414998-id-3692113.html?page=3 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什么东东,最后才

汽车之家店铺商品详情数据抓取 DotnetSpider实战[二]

一.迟到的下期预告 自从上一篇文章发布到现在,大约差不多有3个月的样子,其实一直想把这个实战入门系列的教程写完,一个是为了支持DotnetSpider,二个是为了.Net 社区发展献出一份绵薄之力,这个开源项目作者一直都在更新,相对来说还是很不错的,上次教程的版本还是2.4.4,今天浏览了一下这个项目,最近一次更新是在3天前,已经更新到了2.5.0,而且项目star也已经超过1000了,还是挺受大家所喜爱的,也在这感谢作者们不断的努力. 之所以中间这么长一段时间没有好好写文章,是因为笔者为参加3

Twitter数据抓取的方法(二)

Scraping Tweets Directly from Twitters Search Page – Part 2 Published January 11, 2015 In the previous post we covered effectively the theory of how we can search and extract tweets from Twitter without having to use their API. First, let’s have a qu

利用Selenium制作python数据抓取,以及对Selenium资源介绍

当当当~第三篇博客开始啦~ 这次的话题是数据抓取.终于到了核心部分的探讨,我的心情也是非常激动啊!如果大家baidu或者google(如果可以的话)数据抓取或者data crawling,将会找到数以千计的例子.但是大多数的代码非常的冗长,并且许多代码还是抓取静态数据之后,对动态JS写成的数据却毫无办法.或者,利用HTML解析网址后,再找到JS写的数据页面来寻找到所想要的数据. 但是!不知各位是否有发现过,如果打开chrome或者safari或者各种浏览器的审查元素.网页上能看到的数据,其实都会

python爬虫数据抓取

概要:利用python进行web数据抓取简单方法和实现. 1.python进行网页数据抓取有两种方式:一种是直接依据url链接来拼接使用get方法得到内容,一种是构建post请求改变对应参数来获得web返回的内容. 一.第一种方法通常用来获取静态页面内容,比如豆瓣电影内容分类下动画对应的链接: http://www.douban.com/tag/%E5%8A%A8%E7%94%BB/?focus=movie     纪录片对应的链接: http://www.douban.com/tag/%E7%

关于“淘宝爆款”的数据抓取与数据分析

本文为younghz原创,文章链接为:http://blog.csdn.net/u012150179/article/details/37306629 这个问题最初是源于我在知乎上一个回答(http://www.zhihu.com/question/24368542/answer/27579662),涉及了两个方面:数据抓取和数据分析. 1.数据爬取 爬取对象:淘宝"连衣裙 夏"的搜索结果. 爬取对象的选择分析我在文章中也有提及. 工具:Scrapy. 代码:我把当时实现的代码放在了G