zoukankan      html  css  js  c++  java
  • 数据抓取的艺术(二)

    原文地址: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.         
    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。最后再将结果转出来。

  • 相关阅读:
    devise 异步发邮件
    ubuntutweak for lucid
    960gs blueprint
    Amoeba for mysql 0.31发布(读写分离、负载均衡、Failover、数据切分)
    Google App Servlet容器转型 – 从Tomcat到Jetty
    DBeaver
    用simple from暂不用formtastic
    [SQL Server]ORDER BY的问题
    PHP pathinfo() 函数
    php中使用head进行二进制流输出,让用户下载PDF等附件的方法
  • 原文地址:https://www.cnblogs.com/liinux/p/5494190.html
Copyright © 2011-2022 走看看