数据挖掘 Week1作业

第一周作业要求

2组
人工搜集中国科学院院士、中国工程院院士的名单,在百度自动获取院士个人主页url,编写爬虫采集院士人类学、学位、研究方向和国家科技奖数据,设计数据库表,保存数据。

小组分工

CHY:科学院院士信息抓取
ZBC:数据到MySQL
me:工程院院士信息抓取

Step1 网站分析

中国工程院院士名单:http://www.cae.cn/cae/html/main/col48/column_48_1.html 可以看到所有学部的院士信息已经汇总在一个网页中,后续编写爬虫抓取个人主页url很方便。
view-sourse

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中依次爬取院士主页的个人信息。
view-sourse2


    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)