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

简介:       续前文:《数据抓取的艺术(一):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数据之心得     
相关文章
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
探索数据之海——网络爬虫与数据抓取技术的应用与发展
在当今信息爆炸的时代,获取大量高质量的数据成为各行各业的迫切需求。网络爬虫和数据抓取技术作为一种有效的手段,正在被广泛应用于各个领域。本文将深入探讨网络爬虫的原理、应用场景以及未来的发展趋势,为读者带来关于数据抓取技术的全面了解。
463 5
|
2月前
|
数据采集 搜索推荐 数据处理
探索数据的无尽可能性:网络爬虫与数据抓取技术
本文将深入探讨网络爬虫与数据抓取技术的重要性和应用,介绍其在信息收集、市场分析、学术研究等领域的广泛应用。我们将探索这一技术的原理、挑战和发展前景,并展望未来数据抓取技术的潜力。
155 0
|
2月前
|
数据采集 存储 前端开发
Python爬虫实战:动态网页数据抓取与分析
本文将介绍如何利用Python编写爬虫程序,实现对动态网页的数据抓取与分析。通过分析目标网站的结构和请求方式,我们可以利用Selenium等工具模拟浏览器行为,成功获取到需要的数据并进行进一步处理与展示。
|
9月前
|
数据采集 存储 缓存
如何设计一个网络爬虫?
网络爬虫也被称为机器人或蜘蛛,它被搜索引擎用于发现网络上的新内容或更新内容。内容可以是网页、图片、视频、PDF文件等。网络爬虫开始时会收集一些网页,然后跟随这些网页上的链接收集新的内容
|
2月前
|
存储 网络安全 API
数据抓取实战(一)
本文介绍了在网络通信理解和控制中常用的两款工具——FiddlerCore和TitaniumProxy。
38 1
|
2月前
|
数据采集 存储 大数据
Python爬虫:数据获取与解析的艺术
本文介绍了Python爬虫在大数据时代的作用,重点讲解了Python爬虫基础、常用库及实战案例。Python因其简洁语法和丰富库支持成为爬虫开发的优选语言。文中提到了requests(发送HTTP请求)、BeautifulSoup(解析HTML)、Scrapy(爬虫框架)、Selenium(处理动态网页)和pandas(数据处理分析)等关键库。实战案例展示了如何爬取电商网站的商品信息,包括确定目标、发送请求、解析内容、存储数据、遍历多页及数据处理。最后,文章强调了遵守网站规则和尊重隐私的重要性。
40 2
|
2月前
|
数据采集 数据挖掘 数据处理
探索数据世界之门:Python爬虫与数据抓取技术
在信息爆炸的时代,数据成为了无处不在、无所不包的珍贵资源。而Python爬虫与数据抓取技术作为一道通向数据世界的大门,为我们提供了强大的工具和方法。本文将深入探讨Python爬虫的原理与应用,以及数据抓取技术的重要性,帮助读者更好地了解并利用这一技术。
|
2月前
|
数据采集 存储 机器学习/深度学习
解密网络爬虫与数据抓取技术的奇妙世界
在信息时代,网络爬虫与数据抓取技术扮演着重要角色,它们能够帮助我们从庞杂的网络数据中提取有用信息。本文将深入探讨网络爬虫的工作原理、应用场景以及技术挑战,并展望未来发展方向。
|
2月前
|
数据采集 存储 数据挖掘
Python爬虫:数据抓取的绝佳武器
在当今信息爆炸的时代,获取并分析大量数据对于决策和发展至关重要。本文将介绍Python爬虫技术,探讨其在数据抓取领域的应用和优势,以及相关的工具和技巧。通过学习Python爬虫,您将能够轻松抓取网络数据,并利用这些宝贵的资源进行数据分析和应用开发。
38 0
|
数据采集 缓存 Python
如何多方面的优化python爬虫程序速度
如何多方面的优化python爬虫程序速度