首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

院士(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_64\Lib\site-packages\pywin32_system32下的所有东西拷贝到C:\Windows\System32下面

爬虫流程

在E盘下面建立文件夹project_scrapy,

建立爬虫项目 在E盘下面建立文件夹project_scrapy,进入该文件夹下面,打开cmd窗口,然后运行下面的命令搭建爬虫框架。scrapy startproject engaca_spider目录树如下:

E:\project_scrapy>tree /f

卷 新加卷 的文件夹 PATH 列表

卷序列号为 00000001 7009:36A5

E:.

└─engaca_spider

│ scrapy.cfg

└─engaca_spider

│ items.py

│ middlewares.py

│ pipelines.py

│ settings.py

│ __init__.py

└─spiders

__init__.py

设置输出内容 在items.py 中添加如下内容

#-*- coding: utf-8 -*-

importscrapy

classEngacaSpiderItem(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

importscrapy

fromscrapy.spidersimportSpider

fromscrapy.selectorimportSelector

importre

fromengaca_spider.settingsimportstarturl

fromengaca_spider.itemsimportEngacaSpiderItem

frompprintimportpprint

importjson

importurllib

fromurlparseimporturljoin

importjieba

pro_list=[i.strip().decode('utf-8')foriinopen("pro_list.txt").readlines()]

classEngAcaSpider(Spider):

'''

'''

name="EngAca"

#需要处理的http状态

handle_httpstatus_list=[404,403]

defstart_requests(self):

'''

'''

yieldscrapy.Request(starturl,self.getnames)

defgetnames(self,response):

'''

'''

ifresponse.status==403:

print'meet 403, sleep 600 seconds'

importtime

time.sleep(600)

yieldscrapy.Request(response.url,callback=self.getnames)

#404,页面不存在,直接返回即可

elifresponse.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')

forname_liinnames_li:

'''

'''

items=EngacaSpiderItem()

items['name']=name_li.xpath("./text()").extract_first()#unicode

urlhref=name_li.xpath('./@href').extract_first()

newurl=urljoin(response.url,urlhref)

yieldscrapy.Request(newurl,callback=self.getplaces,meta={'items':items})

defgetplaces(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)

forplaceinseg_list:

place=place.replace(u"省",'')

place=place.replace(u"市",'')

print"place:",place

ifplaceinpro_list:

items['place']=place

break

else:

items['place']='None'

pprint(items)

yielditems

结果输出代码 在pipelines.py 处理输出内容,可以把内容保存到数据库或者文本中。 这里我直接保存到文本result.txt中。

#-*- coding: utf-8 -*-

classEngacaSpiderPipeline(object):

defprocess_item(self,item,spider):

returnitem

frompprintimportpprint

importcodecs

classShopinfoPipeline(object):

defprocess_item(self,item,spider):

returnitem

classJsonWithEncodingPipeline(object):

def__init__(self):

self.file=codecs.open('result.txt','w',encoding='utf-8')#保存为json文件

line="name place\n"

self.file.write(line)#写入文件中

defprocess_item(self,item,spider):

'''

'''

keylist=['name','place']

baseline=""

foriinkeylist:

baseline+=item[i]+''

baseline+="\n"

pprint(baseline)

self.file.write(baseline)#写入文件中

defspider_closed(self,spider):#爬虫结束时关闭文件

self.file.close()

在settings.py指定输出管道

ITEM_PIPELINES={

'engaca_spider.pipelines.JsonWithEncodingPipeline':300,

}

运行爬虫

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

scrapy crawl EngAca

利用pycharts进行数据可视化

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

项目所有文件

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

总结

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180120A0RXNJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券