Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

栏目: 编程工具 · 发布时间: 6年前

院士(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

这里我以工程院院士信息抓取进行讲解。

工程院士出生地分布图

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

必备模块

  • 通过 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

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

  • 设置输出内容 在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

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

  • 在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

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

  • 结果输出代码 在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()

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

  • 在settings.py指定输出管道

    ITEM_PIPELINES = { 'engaca_spider.pipelines.JsonWithEncodingPipeline': 300, }

运行爬虫

在这个目录scrapy.cfg的同层文件夹下打开cmd窗口运行爬虫,在该目录下生成结果文件result.txt。

scrapy crawl EngAca

利用pycharts进行数据可视化

参照教程,绘制地图热图。matplotlib[05]——微信好友的全国分布的热图

Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵

从这张图上,我们可以看出江苏院士最多,超过100人,人杰地灵当之无愧。

项目所有文件

链接:https://pan.baidu.com/s/1smligBN 密码:jdst

总结

这是最基本也是最重要的爬虫练习。里面没有涉及到JS加密、反爬措施。借助这个练习,可以熟悉爬虫框架。 数据预测未来,做事先人一步。

本文的代码直接就缩水了,如果想复制完整的代码,可以阅读原文。请搜索:python项目实践[02]爬虫——scrapy院士出生地分析

本文由dcpeng 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


以上所述就是小编给大家介绍的《Python大佬批量爬取中国院士信息,告诉你哪个地方人杰地灵》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro CSS and HTML Design Patterns

Pro CSS and HTML Design Patterns

Michael Bowers / Apress / April 23, 2007 / $44.99

Design patterns have been used with great success in software programming. They improve productivity, creativity, and efficiency in web design and development, and they reduce code bloat and complexit......一起来看看 《Pro CSS and HTML Design Patterns》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码