第一周作业要求
2组
人工搜集中国科学院院士、中国工程院院士的名单,在百度自动获取院士个人主页url,编写爬虫采集院士人类学、学位、研究方向和国家科技奖数据,设计数据库表,保存数据。
小组分工
CHY:科学院院士信息抓取
ZBC:数据到MySQL
me:工程院院士信息抓取
Step1 网站分析
中国工程院院士名单:http://www.cae.cn/cae/html/main/col48/column_48_1.html 可以看到所有学部的院士信息已经汇总在一个网页中,后续编写爬虫抓取个人主页url很方便。
Step2 抓取url
在编写爬虫时用到了XPath,XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
- XPath 使用路径表达式在 XML 文档中进行导航
- XPath 包含一个标准函数库
- XPath 是 XSLT 中的主要元素
- XPath 是一个 W3C 标准
在这里通过XPath的语法分别抓取li标签下的herf的内容和text的内容,以获得院士个人主页的url和院士的姓名,存储在list中。def getURL(): #抓取工程院院士的URL和姓名 page = urllib.request.urlopen('http://www.cae.cn/cae/html/main/col48/column_48_1.html') html = page.read() urlList = [] sel = Selector(text=html, type="html") urlList = sel.xpath('//li[re:test(@class, "name_list")]//@href').extract() nameList = sel.xpath('//li[re:test(@class, "name_list")]//a/text()').extract() #print(url) i = 0 for i in range(len(urlList)): urlList[i] = "http://www.cae.cn" + urlList[i] return urlList, nameList #print(url)
Step3 抓取个人信息
接着仍使用XPath语法从urlList中依次爬取院士主页的个人信息。
infoPage = urllib.request.urlopen(academyURL)
infoHTML = infoPage.read()
infoSelect = Selector(text=infoHTML, type="html")
info = infoSelect.xpath('//div[@class="intro"]/p/text()').extract()[0]
return info
Step4 信息提取
可以发现院士信息页中大部分信息描述具有某些规律,比如描述院士在某个专业方面的成就时的描述会采用“金属材料及粉末冶金专家”、“耳鼻咽喉学专家”等以“专家”、“学家”结尾的格式,可以通过正则表达式和findall()函数找出对应的描述。
pattern = re.compile(r'(\d{4}年(?:\d{1,2}月)?(?:\d{0,2}日)?)(?:(?:出生)|(?:生,)|(?:生于)|(?:出生于))')
birthday = pattern.findall(c)
pattern2 = re.compile(r'^.*?(?:(?:学家)|(?:专家))')
direction = pattern2.findall(c)
pattern3 = re.compile(r'(?:获)[^(?:。)]+(?:奖)')
award = pattern3.findall(c)
pattern4 = re.compile(r'博士|硕士|学士')
degree = pattern4.findall(c)