爬虫——用Scrapy爬取清华某学院的教授信息

Scrapy爬取清华教授信息

第一个爬虫任务——爬取清华教授的信息。由于清华每个院的网站结构不一样,所以从其中一个院入手——我选择的是土木水利院,进行爬取,需要爬取的信息是教授的名字、教育背景、研究领域、学术成果(若干篇论文)以及百度学术中这些论文的摘要。

工具

使用scrapy框架,解析页面过程中使用xpath进行元素定位。

过程

  1. 新建scrapy项目: 在打算存储该项目的目录下打开命令行,输入scrapy startproject tsinghua_professor

  2. 将项目导入pycharm,首先确定爬取的内容,编写items.py;

  3. 编辑pipelines.py文件,把结果写到json文件里面

class TsinghuaProfessorPipeline(object):
    def __init__(self):
        self.file = codecs.open('civil_eng_prof.json','w',encoding='utf-8')

    def process_item(self, item, spider):
        lines = json.dumps(dict(item),ensure_ascii=False)+'\n'
        self.file.write(lines)
        return item

    def spider_closed(self,spider):
        self.file.close()
  1. 编辑settings.py;
BOT_NAME = 'tsinghua_professor'
SPIDER_MODULES = ['tsinghua_professor.spiders']
NEWSPIDER_MODULE = 'tsinghua_professor.spiders'
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
   'tsinghua_professor.pipelines.TsinghuaProfessorPipeline': 300,
}
#不设置delay的话,百度学术在爬取了一定次数以后,会把页面重定向到验证码界面
DOWNLOAD_DELAY = 2 

结果

爬虫——用Scrapy爬取清华某学院的教授信息_第1张图片
爬虫——用Scrapy爬取清华某学院的教授信息_第2张图片

主要问题

  • 按本篇文章这样写出来的爬虫,最后的结果是一个教授有很多条记录,每一篇的achie和abs属性不同,其他属性均相同。但是最初我的想法是以dict的结构存储achie与其对应的abstract, 每一个教授的学术成果属性是这样一个dict。在scrapy中,一般都是在最后的parse函数中yield item,如果想把achie属性作为一个dict,必须在最后一个parse函数中循环处理professor.achie,最后再yield professor。我尝试了几种写法,都不太行,最后只能先像前述的代码那样,先把数据都爬下来再说。

你可能感兴趣的:(数据挖掘)