目的
bugcrawling脚本用于爬取Percona Server的bug列表,并输出为csv格式。该文档主要用于说明bugcrawling脚本的运行依赖环境、脚本详细说明、使用说明以及运行结果,供开发和维护人员使用。
运行环境
1、依赖
脚本运行环境依赖:Python 2.7、setuptools、Beautiful 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、引用库
脚本执行需要引用的库有:urllib、re、os、sys、getopt、BeautifulSoup。其中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 Server的URL地址为https类型,因此需要安装openssl和libssl-dev库。
抓取Percona Server 5.5的bug列表如下所示:
python bugcrawling.py -i"" -o"Percona_Server_5.5_BugList.csv" |
为了进行批量抓取bug信息,编写批处理脚本batch.bat(batch.sh),批量导出Percona Server的所有bug列表和Percona Server 5.5的bug列表。脚本参考附录内容。
运行结果
batch脚本运行结果生成Percona_Server_Full_BugList.csv和Percona_Server_5.5_BugList.csv文件。
附录
1、bugcrawling.py脚本:
- #!/usr/bin/python
- ###########################################################
- # Copyright (c) 2012, Heng.Wang. All rights reserved.
- #
- # This program is used to crawl the bug list from percona
- # server bug url .
- ###########################################################
- import urllib
- import re
- import os
- import sys
- import getopt
- from BeautifulSoup import BeautifulSoup
- def usage():
- print u"Usage: $0 [-h] [configure-options]"
- print u"-h, --help Show this help message."
- print u"-i,--input= Set the input file path."
- print u"-o,--output= Set the output file path."
- print u"Note: this script is intended for internal use by developers."
- def parse_opt():
- global input_file
- global output_file
- opts,args=getopt.getopt(sys.argv[1:],'hi:o:',['help','input=','output='])
- for opt,value in opts:
- if opt in ('-i','--input'):
- input_file=value
- elif opt in ('-o','--output'):
- output_file=value
- elif opt in ('-h','--help'):
- usage()
- sys.exit(0)
- else:
- print "Unknown options"
- print "Please use -h/--help to show the usage!"
- sys.exit(1)
- def url_read(input_file):
- fsock=urllib.urlopen(input_file)
- data=fsock.read()
- return data
- def process(data):
- global importance_list
- global status_list
- global bugnumber_list
- global bugtitle_list
-
- soup=BeautifulSoup(data)
-
- importance_list = soup.findAll(attrs={'class':re.compile("importance importance")})
- #for item in importance_list:
- # print item;
-
- status_list = soup.findAll(attrs={'class':re.compile("status status")})
- #for item in status_list:
- # print item
-
- bugnumber_list = soup.findAll(attrs={'class':re.compile("bugnumber")})
- #for item in bugnumber_list:
- # print item
-
- bugtitle_list = soup.findAll(attrs={'class':re.compile("bugtitle")})
- #for item in bugtitle_list:
- # print item
- def write_file(output_file):
- fd = open(output_file,'a+')
- if (os.path.getsize(output_file) == 0):
- fd.write("BugNo,Important,Status,BugHref,BugTitle")
-
- for i in range(0,len(bugnumber_list)):
- line=[]
- line.append(bugnumber_list[i].contents[0].strip().replace('\r\n',''))
- line.append(importance_list[i].contents[0].strip().replace('\r\n',''))
- line.append(status_list[i].contents[0].strip().replace('\r\n',''))
- line.append(bugtitle_list[i].contents[0].strip().replace('\r\n','').replace(',','.'))
- line.append(bugtitle_list[i]['href'].strip().replace('\r\n',''))
-
- fd.write('\n'+','.join(line))
- ##############################
- importance_list=[]
- status_list=[]
- bugnumber_list=[]
- bugtitle_list=[]
- input_file=""
- output_file="Percona_Server_Full_BugList.csv"
- parse_opt()
- if (input_file==""):
- print u'Please input the html file address'
- print u'or use -h/--help to show the usage!'
- sys.exit(1)
- data=url_read(input_file)
- process(data)
- write_file(output_file)
2、batch.bat(batch.sh)脚本:
- python bugcrawling.py -i"" -o"Percona_Server_Full_BugList.csv"
- python bugcrawling.py -i"/+bugs?memo=75&start=75" -o"Percona_Server_Full_BugList.csv"
- python bugcrawling.py -i"/+bugs?memo=150&start=150" -o"Percona_Server_Full_BugList.csv"
- python bugcrawling.py -i"/+bugs?memo=225&start=225" -o"Percona_Server_Full_BugList.csv"
- python bugcrawling.py -i"" -o"Percona_Server_5.5_BugList.csv"
阅读(2199) | 评论(3) | 转发(0) |