院士(Academician)源于Academy, Academy是古希腊传说中的一位拯救雅典免遭劫难而牺牲的英雄,属于科学及学术界的最高荣誉头衔。哪里盛产生院士?python爬虫告诉你。
背景调研
目前中国院士共有1500余人,其中科学院院士799人,工程院院士875人。
科学院院士名单 http://www.casad.cas.cn/chnl/371/index.html
工程院院士名单 http://www.cae.cn/cae/html/main/col48/column_48_1.html
这里我以工程院院士信息抓取进行讲解。
工程院士出生地分布图
必备模块
-
通过 pip 安装scrapy 爬虫框架模块
-
通过 pip 安装 jieba 分词模块
-
通过 pip 安装win32api
如果报ImportError: DLL load failed: 找不到指定的模块。 安装好后,把 D:Python27_64Libsite-packagespywin32_system32下的所有东西拷贝到C:WindowsSystem32下面
爬虫流程
在E盘下面建立文件夹project_scrapy,
-
建立爬虫项目 在E盘下面建立文件夹project_scrapy,进入该文件夹下面,打开cmd窗口,然后运行下面的命令搭建爬虫框架。 scrapy startproject engaca_spider 目录树如下:
E:project_scrapy>tree /f卷 新加卷 的文件夹 PATH 列表卷序列号为 00000001 7009:36A5E:.└─engaca_spider │ scrapy.cfg │ └─engaca_spider │ items.py │ middlewares.py │ pipelines.py │ settings.py │ __init__.py │ └─spiders __init__.py
-
设置输出内容 在items.py 中添加如下内容
# -*- coding: utf-8 -*- import scrapy class EngacaSpiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() name = scrapy.Field() place = scrapy.Field() pass
-
在settings.py 中设置爬虫源头
在settings.py 文件添加如下语句
starturl = 'http://www.cae.cn/cae/html/main/col48/column_48_1.html'
-
省份列表文件 scrapy.cfg的同层文件夹中存放pro_list.txt
链接:https://pan.baidu.com/s/1brg0MIz 密码:selo
-
爬虫核心代码 在spiders文件夹下面建立 aca_spider.py
#!python #coding: utf-8 import scrapyfrom scrapy.spiders import Spiderfrom scrapy.selector import Selector import refrom engaca_spider.settings import starturlfrom engaca_spider.items import EngacaSpiderItemfrom pprint import pprintimport jsonimport urllibfrom urlparse import urljoin import jiebapro_list =[ i.strip().decode('utf-8') for i in open("pro_list.txt").readlines()]class EngAcaSpider(Spider): ''' ''' name = "EngAca" #需要处理的http状态 handle_httpstatus_list = [404,403] def start_requests(self): ''' ''' yield scrapy.Request(starturl,self.getnames) def getnames(self,response): ''' ''' if response.status == 403: print 'meet 403, sleep 600 seconds' import time time.sleep(600) yield scrapy.Request(response.url, callback=self.getnames) #404,页面不存在,直接返回即可 elif response.status == 404: print 'meet 404, return' #正常处理 else: print "second:",response.url self.logger.info('a response from %s',response.url) names_li=response.selector.xpath('//li[@class="name_list"]/a') for name_li in names_li: ''' ''' items=EngacaSpiderItem() items['name']=name_li.xpath("./text()").extract_first() #unicode urlhref=name_li.xpath('./@href').extract_first() newurl=urljoin(response.url,urlhref) yield scrapy.Request(newurl,callback=self.getplaces,meta={'items':items}) def getplaces(self,response): ''' ''' items = response.meta['items'] # get first content; # 中英文 混用 .encode('gbk','ignore') 忽略英文空格 ptext=response.selector.xpath('//div[@class="intro"]/p[1]/text()').extract_first() content=ptext.split(u'。')[1] seg_list = jieba.cut(content) for place in seg_list: place=place.replace(u"省",'') place=place.replace(u"市",'') print "place:",place if place in pro_list: items['place']=place break else: items['place']='None' pprint(items) yield items
-
结果输出代码 在pipelines.py 处理输出内容,可以把内容保存到数据库或者文本中。 这里我直接保存到文本result.txt中。
# -*- coding: utf-8 -*- class EngacaSpiderPipeline(object): def process_item(self, item, spider): return itemfrom pprint import pprintimport codecsclass ShopinfoPipeline(object): def process_item(self, item, spider): return itemclass JsonWithEncodingPipeline(object): def __init__(self): self.file = codecs.open('result.txt', 'w', encoding='utf-8') #保存为json文件 line="name place " self.file.write(line)#写入文件中 def process_item(self, item, spider): ''' ''' keylist=['name','place'] baseline="" for i in keylist: baseline+=item[i]+' ' baseline+=" " pprint(baseline) self.file.write(baseline)#写入文件中 def spider_closed(self, spider):#爬虫结束时关闭文件 self.file.close()
-
在settings.py指定输出管道
ITEM_PIPELINES = { 'engaca_spider.pipelines.JsonWithEncodingPipeline': 300, }
运行爬虫
在这个目录scrapy.cfg的同层文件夹下打开cmd窗口运行爬虫,在该目录下生成结果文件result.txt。
scrapy crawl EngAca
利用pycharts进行数据可视化
参照教程,绘制地图热图。matplotlib[05]——微信好友的全国分布的热图
从这张图上,我们可以看出江苏院士最多,超过100人,人杰地灵当之无愧。
项目所有文件
链接:https://pan.baidu.com/s/1smligBN 密码:jdst
总结
这是最基本也是最重要的爬虫练习。里面没有涉及到JS加密、反爬措施。借助这个练习,可以熟悉爬虫框架。 数据预测未来,做事先人一步。
本文的代码直接就缩水了,如果想复制完整的代码,可以阅读原文。请搜索:python项目实践[02]爬虫——scrapy院士出生地分析
本文由dcpeng 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
以上所述就是小编给大家介绍的《Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 中科院谭铁牛院士、陈霖院士:抓住AI发展大潮的8大思考和3点布局
- 「新一代人工智能院士高峰论坛」周一即将开幕!多位院士领衔解读「人工智能开源开放平台的技术挑战」
- 中国工程院院士胡盛寿:智慧医疗离我们还很远
- 陈纯院士:2018年全球认知领域技术趋势及我国成果总结
- 中科院院士: 建立国家主权区块链基础平台迫在眉睫
- 中国工程院院士沈昌祥:做主动免疫的网络安全防线
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。