python 2.7.10
beautifulsoup4==4.4.1
lxml==3.4.4(remove)
requests==2.8.1
Ghost.py-0.2.3
我只是写了一个简单的架子,功能:
-
解析hao123的211/985名单
-
数据 《=》csv/json相互转化
-
按照用户选择解析各个学校、学院的在职员工数据(模糊匹配职称、电子邮件、电话等等基本信息),并抓取简历保存在学院目录。
-
按照设置规则文件抓取目标内容,规则内容如下:
self.zone_tag = '' self.zone_attr = {}
self.tag_name = tag_name or ''
self.parents = []
self.attrs = {}
self.select = []
一般来说,找到合适的zone、目标的tag、属性就能找到要找的内容。
解析员工数据时,先编辑对应学校下面的json文件,在目标学院的json结构里添加抓取规则。然后在学院目录下定义MyHandler.py文件,写合适的解析脚本进行解析即可得到想要的数据。
由于每个学院的解析模式各不相同,所以需要在每个学院目录下自己实现两个方法:
- handler:将找到的目标转化为员工数据实体
- profile_handler:保存简历正文到文件,模糊匹配员工数据并返回
json中的主要数据结构如下所示:
"__classname__": "Academy", 表示数据的类型,自动写好的
"__module__": "models", 表示类的模块,自动写好的
"departments": { [*] 找到一个学院的所有教师名单的索引页面,并填写进去,这个页面将用来解析employee(在职员工)
格式为名字:网址
"全职教员":"http://www.math.pku.edu.cn/static/quanzhijiaoyuan.html"
},
departmentsRule结构暂时不用管,没用到
"departmentsRule": {
"__classname__": "ParseRule",
"__module__": "models",
"attrs": {},
"parents": [],
"select": [],
"tag_name": "",
"zone_attr": {},
"zone_tag": ""
},
"departmentsUrl": "", 没用到
"done": false, 没用到
"employees": [], 没用到,自动生成,不用管
"eng_name": "www.math.pku.edu.cn", 自动解析生成学院的英文名字,不用管
"hasDepartments": false, 不用管
"name": "数学科学学院", 自动解析生成,不用管
"parser": null,
"rule": { [*]Rule是你的重点,这是一个规则配置文件
"__classname__": "ParseRule", 表示数据的类型,自动写好的
"__module__": "models", 表示类的模块,自动写好的
"attrs": {}, 目标tag_name的属性,类似zone_attr
"parents": [], [*]这个也是重点,目标的父标签,用于缩小解析范围的
"select": [], 忽略永不到
"tag_name": "a", [*]目标tag,这个也是重点
"zone_attr": {"id":"main"}, [*]目标tag的属性,这个也是重点,如<a class="link">中的class属性为link,所以规则为{"class":"link"}
"zone_tag": "div" [*]目标区域tag,这个也是重点,(标签,如<table>,<html>,<p>都是标签),zone用于缩小网站目标范围,过滤冗余信息
},
"sname": "math", 学院简称
"url": "http://www.math.pku.edu.cn/", 学院主页,自动解析出来的
"web_engine": "urllib2" 一般用urllib2,对于特定的js网站,需要用selen
####菜单
q.Exit
p.Print colleges
s.Save to china211
1.Fetch colleges save to json
2.Make output dirs
3.Test Academies parser
4.Auto Fetch all academiesUrl
5.Auto Fetch Academy
6.Auto Fetch Employees
7.MyParser Test
What would you like to do?
-
out目录下如果存在
china211.json
则将其大学目录数据导入。如果不存在,可运行python run.py
选择菜单1从hao123抓取。 -
编辑
china985.json
,删除不感兴趣的大学。如仅保留985+理工。 -
运行 $ python run.py 选择6菜单 选择学校 选择院系 开始解析
China211
collges + rule
academies
Department
employees
####Parser
l_parsers = {
"Parser": Parser,
"Hao123_211_Parser": Hao123_211_Parser,
"SimpleAParser": SimpleAParser,
"AutoAcademyParser": AutoAcademyParser,
"SimpleTableParser":SimpleTableParser
}
####Models
###浏览器
对于一些比较变态的主页(主要是javascript数据),使用selenium调用firefox获取数据
-
JSon"陷阱"
对于自定义类的json化,需要注意成员必须事先定义好。否则在dump时会出现循环解析
的问题。 -
BeautifulSoup解析器
社区推荐优先使用lxml,主要是速度较快。但是使用时发现有时解析不到目标,改为python自带的"html-parser"。 后期将分析原因,或者向社区提交bug
- 20Nov15: 完成主体框架,parser,log,config,rule和主菜单几个模块
- 22Nov15: 对学院的解析添加学校的导航保存到index.html文件功能,下次读取优先从文件读取进行分析。一是可以提高速度,不用每次都从网上抓取,二十可以自己对原网站内容进行编辑手动去除冗余再进行分析。
- 24Nov15:添加profile parser轻松解析不是梦
- 对departments中的分页的处理进行支持