Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1744069
  • 博文数量: 107
  • 博客积分: 1715
  • 博客等级: 上尉
  • 技术积分: 3168
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-18 18:42
个人简介

阿里巴巴DBA,原去哪儿网DBA。专注于MySQL源码研究、DBA运维、CGroup虚拟化及Linux Kernel源码研究等。 github:https://github.com/HengWang/ Email:king_wangheng@163.com 微博 :@王恒-Henry QQ :506437736

文章分类

全部博文(107)

文章存档

2014年(2)

2013年(38)

2012年(67)

分类: Mysql/postgreSQL

2012-05-07 16:59:21

目的

bugcrawling脚本用于爬取Percona Serverbug列表,并输出为csv格式。该文档主要用于说明bugcrawling脚本的运行依赖环境、脚本详细说明、使用说明以及运行结果,供开发和维护人员使用。

 

运行环境

1、依赖

脚本运行环境依赖:Python 2.7setuptoolsBeautiful soup库。

2、安装

1) 安装python 2.7以上版本

windows

       双击msi可执行程序,按照流程安装即可。

linux

       源码安装:

tar -xzvf Python-2.7.3.tgz

cd Python-2.7.3

./configure --prefix=/usr

make && make install

2) 安装setuptools工具

windows

      双击msi可执行程序,按照安装流程安装即可。

linux

       源码安装:

tar -xzvf setuptools-0.6c11.tar.gz

cd setuptools-0.6c11

python setup.py install

3) 安装Beautiful soup

       使用easy_install 安装Beautiful Soup库。

easy_install beautifulsoup

 

脚本说明

       对引用库、重要函数的功能进行说明,脚本见附录。

1、引用库

       脚本执行需要引用的库有:urllibreossysgetoptBeautifulSoup。其中urllib是解析url连接操作;re用于正则解析;os用于文件操作;sys用于系统相关操作;getopt用于输入参数解析;BeautifulSoup是用到的核心库,用于解析html内容。

2、重要函数

       usage函数:输出脚本的使用说明。

       parse_opt函数:解析输入参数。

url_read函数:解析并读取url地址的数据内容。

process函数:主要的处理部分,查找主要的bug信息,并抓取相应的列表。

write_file函数:将内容以分隔输出为csv格式文档。

 

脚本使用

       脚本使用可以通过 python bugcrawling -h(--help)来查看。主要参数有-i(--input=< HTTPURL >) :输入的URL地址;-o(--output=):输出的文件。由于Percona ServerURL地址为https类型,因此需要安装openssllibssl-dev库。

       抓取Percona Server 5.5bug列表如下所示:

python bugcrawling.py -i"" -o"Percona_Server_5.5_BugList.csv"

      

       为了进行批量抓取bug信息,编写批处理脚本batch.bat(batch.sh),批量导出Percona Server的所有bug列表和Percona Server 5.5bug列表。脚本参考附录内容。

 

运行结果

       batch脚本运行结果生成Percona_Server_Full_BugList.csvPercona_Server_5.5_BugList.csv文件。

 

附录

1bugcrawling.py脚本:


 

点击(此处)折叠或打开

  1. #!/usr/bin/python

  2. ###########################################################
  3. # Copyright (c) 2012, Heng.Wang. All rights reserved.
  4. #
  5. # This program is used to crawl the bug list from percona
  6. # server bug url .
  7. ###########################################################

  8. import urllib
  9. import re
  10. import os
  11. import sys
  12. import getopt
  13. from BeautifulSoup import BeautifulSoup

  14. def usage():
  15.     print u"Usage: $0 [-h] [configure-options]"
  16.     print u"-h, --help Show this help message."
  17.     print u"-i,--input= Set the input file path."
  18.     print u"-o,--output= Set the output file path."
  19.     print u"Note: this script is intended for internal use by developers."


  20. def parse_opt():
  21.     global input_file
  22.     global output_file

  23.     opts,args=getopt.getopt(sys.argv[1:],'hi:o:',['help','input=','output='])

  24.     for opt,value in opts:
  25.         if opt in ('-i','--input'):
  26.             input_file=value
  27.         elif opt in ('-o','--output'):
  28.             output_file=value
  29.         elif opt in ('-h','--help'):
  30.             usage()
  31.             sys.exit(0)
  32.         else:
  33.             print "Unknown options"
  34.             print "Please use -h/--help to show the usage!"
  35.             sys.exit(1)

  36. def url_read(input_file):
  37.     fsock=urllib.urlopen(input_file)
  38.     data=fsock.read()
  39.     return data

  40. def process(data):
  41.     global importance_list
  42.     global status_list
  43.     global bugnumber_list
  44.     global bugtitle_list
  45.     
  46.     soup=BeautifulSoup(data)
  47.     
  48.     importance_list = soup.findAll(attrs={'class':re.compile("importance importance")})
  49.     #for item in importance_list:
  50.     # print item;
  51.     
  52.     status_list = soup.findAll(attrs={'class':re.compile("status status")})
  53.     #for item in status_list:
  54.     # print item
  55.     
  56.     bugnumber_list = soup.findAll(attrs={'class':re.compile("bugnumber")})
  57.     #for item in bugnumber_list:
  58.     # print item
  59.     
  60.     bugtitle_list = soup.findAll(attrs={'class':re.compile("bugtitle")})
  61.     #for item in bugtitle_list:
  62.     # print item

  63. def write_file(output_file):
  64.     fd = open(output_file,'a+')
  65.     if (os.path.getsize(output_file) == 0):
  66.         fd.write("BugNo,Important,Status,BugHref,BugTitle")
  67.     
  68.     for i in range(0,len(bugnumber_list)):
  69.         line=[]
  70.         line.append(bugnumber_list[i].contents[0].strip().replace('\r\n',''))
  71.         line.append(importance_list[i].contents[0].strip().replace('\r\n',''))
  72.         line.append(status_list[i].contents[0].strip().replace('\r\n',''))
  73.         line.append(bugtitle_list[i].contents[0].strip().replace('\r\n','').replace(',','.'))
  74.         line.append(bugtitle_list[i]['href'].strip().replace('\r\n',''))
  75.         
  76.         fd.write('\n'+','.join(line))



  77. ##############################
  78. importance_list=[]
  79. status_list=[]
  80. bugnumber_list=[]
  81. bugtitle_list=[]
  82. input_file=""
  83. output_file="Percona_Server_Full_BugList.csv"

  84. parse_opt()

  85. if (input_file==""):
  86.     print u'Please input the html file address'
  87.     print u'or use -h/--help to show the usage!'
  88.     sys.exit(1)

  89. data=url_read(input_file)
  90. process(data)
  91. write_file(output_file)

 

2batch.bat(batch.sh)脚本:

点击(此处)折叠或打开

  1. python bugcrawling.py -i"" -o"Percona_Server_Full_BugList.csv"
  2. python bugcrawling.py -i"/+bugs?memo=75&start=75" -o"Percona_Server_Full_BugList.csv"
  3. python bugcrawling.py -i"/+bugs?memo=150&start=150" -o"Percona_Server_Full_BugList.csv"
  4. python bugcrawling.py -i"/+bugs?memo=225&start=225" -o"Percona_Server_Full_BugList.csv"

  5. python bugcrawling.py -i"" -o"Percona_Server_5.5_BugList.csv"


 

阅读(2221) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

7大爷2012-05-09 22:40:02

了解了一下,还是不太懂~~

king_wangheng2012-05-09 14:11:39

皮娃娃哈哈: 这个限制比较大啊~用的人多么?.....
主要用于爬取percona server的bug,通用性不好。最好参照beautiful soup根据需要编写!

皮娃娃哈哈2012-05-08 19:57:14

这个限制比较大啊~用的人多么?