摘要院士(Academician)源于Academy, Academy是古希臘傳說(shuō)中的一位拯救雅典免遭劫難而犧牲的英雄,屬于科學(xué)及學(xué)術(shù)界的最高榮譽(yù)頭銜,。哪里盛產(chǎn)生院士?python爬蟲(chóng)告訴你,。 背景調(diào)研目前中國(guó)院士共有1500余人,,其中科學(xué)院院士799人,工程院院士875人,。 這里我以工程院院士信息抓取進(jìn)行講解,。 工程院士出生地分布圖必備模塊通過(guò) pip 安裝scrapy 爬蟲(chóng)框架模塊 通過(guò) pip 安裝 jieba 分詞模塊 通過(guò) pip 安裝win32api 如果報(bào)ImportError: DLL load failed: 找不到指定的模塊。 安裝好后,,把 D:\Python27_64\Lib\site-packages\pywin32_system32下的所有東西拷貝到C:\Windows\System32下面
爬蟲(chóng)流程在E盤下面建立文件夾project_scrapy, 建立爬蟲(chóng)項(xiàng)目 在E盤下面建立文件夾project_scrapy,進(jìn)入該文件夾下面,,打開(kāi)cmd窗口,然后運(yùn)行下面的命令搭建爬蟲(chóng)框架,。 scrapy startproject engaca_spider 目錄樹(shù)如下:
E:\project_scrapy>tree /f 卷 新加卷 的文件夾 PATH 列表 卷序列號(hào)為 00000001 7009:36A5 E:. └─engaca_spider │ scrapy.cfg │ └─engaca_spider │ items.py │ middlewares.py │ pipelines.py │ settings.py │ __init__.py │ └─spiders __init__.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
starturl = 'http://www./cae/html/main/col48/column_48_1.html'
#!python #coding: utf-8 import scrapy from scrapy.spiders import Spider from scrapy.selector import Selector import re from engaca_spider.settings import starturl from engaca_spider.items import EngacaSpiderItem from pprint import pprint import json import urllib from urlparse import urljoin import jieba pro_list =[ i.strip().decode('utf-8') for i in open('pro_list.txt').readlines()] class EngAcaSpider(Spider): ''' ''' name = 'EngAca'
#需要處理的http狀態(tài) 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,,頁(yè)面不存在,直接返回即可 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
# -*- coding: utf-8 -*- class EngacaSpiderPipeline(object): def process_item(self, item, spider): return item from pprint import pprint import codecs class ShopinfoPipeline(object): def process_item(self, item, spider): return item class JsonWithEncodingPipeline(object): def __init__(self): self.file = codecs.open('result.txt', 'w', encoding='utf-8') #保存為json文件 line='name place\n' self.file.write(line)#寫入文件中 def process_item(self, item, spider): ''' ''' keylist=['name','place'] baseline='' for i in keylist: baseline+=item[i]+' ' baseline+='\n' pprint(baseline) self.file.write(baseline)#寫入文件中 def spider_closed(self, spider):#爬蟲(chóng)結(jié)束時(shí)關(guān)閉文件 self.file.close()
ITEM_PIPELINES = { 'engaca_spider.pipelines.JsonWithEncodingPipeline': 300, }
運(yùn)行爬蟲(chóng)在這個(gè)目錄scrapy.cfg的同層文件夾下打開(kāi)cmd窗口運(yùn)行爬蟲(chóng),在該目錄下生成結(jié)果文件result.txt,。 scrapy crawl EngAca
利用pycharts進(jìn)行數(shù)據(jù)可視化參照教程,繪制地圖熱圖,。微信好友的全國(guó)分布的熱圖,,你的微信朋友遍布全中國(guó)了嗎? 從這張圖上,,我們可以看出江蘇院士最多,,超過(guò)100人,,人杰地靈當(dāng)之無(wú)愧。 項(xiàng)目所有文件鏈接:https://pan.baidu.com/s/1-fr_kWtIgzzjsNV_2Yu0JA 密碼:vrsu 總結(jié)這是最基本也是最重要的爬蟲(chóng)練習(xí),。里面沒(méi)有涉及到JS加密,、反爬措施。借助這個(gè)練習(xí),,可以熟悉爬蟲(chóng)框架,。 數(shù)據(jù)預(yù)測(cè)未來(lái),做事先人一步,。
|