pyspider爬取2018年自主招生初审数据

使用pyspider爬取了2018年自主招生的初审通过名单共计153008条数据(不含合肥工业大学宣城校区)

数据分析

数据分析之省市

按照省份分布图

省份排名前五如下:

排名 省份 人数
1 山东省 24788
2 江苏省 14696
3 河北省 13028
4 湖北省 10444
5 河南省 10199

数据分析之中学

按照各中学人数分布

可以看出京津冀以及上海一带人数分布较多。
学校排名前五如下:

排名 学校 人数
1 衡水第一中学 1152
2 山东省莱芜市第一中学 1038
3 山东省实验中学 1038
4 石家庄市第二中学 938
5 邯郸市第一中学 793

数据分析之清北

清北自招分布图

数据分析之性别

性别分布图

源代码之pyspider

pyspider是一个国人编写的强大的网络爬虫系统并带有强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。
但是由于url自动去重的原因,常规的编写只能每页返回一条结果,需要通过构造虚拟的url重载send_message以及on_message两个函数来完成单页的多输出
send_message和on_message源码如下:

1    def send_message(self, project, msg, url='data:,on_message'):
2        """Send messages to other project."""
3        self._messages.append((project, msg, url))
4    def on_message(self, project, msg):
5        """Receive message from other project, override me."""
6        pass

官方给出的解释:网页链接
网页地址:http://docs.pyspider.org/en/latest/apis/self.send_message/

 1from pyspider.libs.base_handler import *
 2class Handler(BaseHandler):
 3    crawl_config = {
 4        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'
 5    }
 6    @every(minutes=24 * 60)
 7    def on_start(self):
 8        self.crawl('https://gaokao.chsi.com.cn/zzbm/mdgs/orgs.action?lx=1&a=a', callback=self.index_page, retries=10)
 9    @config(age=10 * 24 * 60 * 60)
10    def index_page(self, response):
11        for each in response.doc('td a').items():
12            if 'subOrgs' not in each.attr.href:
13                self.crawl(each.attr.href + '&start=0', callback=self.detail_page, save={'collagename': each.text()},
14                           allow_redirects=False, retries=10)
15            else:
16                self.crawl(each.attr.href, callback=self.second_page, allow_redirects=False, retries=10)
17    def second_page(self, response):
18        for each in response.doc('td a').items():
19            self.crawl(each.attr.href + '&start=0', callback=self.detail_page, save={'collagename': each.text()},
20                       allow_redirects=False, retries=10)
21    @config(priority=2, age=10 * 24 * 60 * 60)
22    def detail_page(self, response):
23        list_data = response.doc('td').text().split()
24        del list_data[0:4]
25        for each in range(int(len(list_data) / 4)):
26            data_dict = {
27                'collagename': response.save['collagename'],
28                "url": response.url,
29                'name': list_data[each * 4 + 0],
30                'sex': list_data[each * 4 + 1],
31                'schoolname': list_data[each * 4 + 2],
32                'provice': list_data[each * 4 + 3],
33            }
34            self.send_message(self.project_name, data_dict, url="%s#%s" % (response.url, each))
35        for item in response.doc('form > a').items():
36            if item.text() == '下一页>>':
37                self.crawl(item.attr.href, callback=self.detail_page, allow_redirects=False,
38                           save={'collagename': response.save['collagename']}, retries=10)
39    def on_message(self, project, msg):
40        return msg

源代码之经纬度

通过对接百度地图或者谷歌地图的api接口,可以轻松获取学校的经纬度信息。

api接口函数如下:

 1import requests,time,random,csv,json
 2def lon_lat_request_bd(address):#百度地图api接口
 3    try:
 4        url= 'http://api.map.baidu.com/geocoder?output=json&key=OBVgfrY37VoctmdWOCrCWDjw3EuGuomK&address='+str(address)
 5        response = requests.get(url)
 6        answer = response.json()
 7        lon = float(answer['result']['location']['lng'])
 8        lat = float(answer['result']['location']['lat'])
 9        return (lon,lat)
10    except:
11        with open('wu_school_name.text','a',encoding='utf8') as file:
12            file.write(address+'\n')
13def lon_lat_request_gd(address):#高德地图api接口
14    try:
15        url= 'http://restapi.amap.com/v3/geocode/geo?key=ce11503ca47b2ce6d5d16b172ccc3fff&address='+str(address)
16        response = requests.get(url)
17        answer = response.json()
18        location = list(map(float,answer['geocodes'][0]['location'].split(',')))
19        lon = location[0]
20        lat = location[1]
21        print(lon,lat,address+'正在采集中')
22        return (lon,lat)
23    except:
24        with open('wu_school_name.text','a',encoding='utf8') as file:
25            file.write(address+'\n')

主代码如下:

 1school_name_dict = {}
 2school_loc = {}
 3with open('zzzs_school_loc.js','w') as schoolfile_loc:
 4    with open('zzzs_school_number.js','w',encoding='utf8') as schoolfile_number:
 5        with open('zzzs.csv','r',encoding='utf8') as csvfile:
 6            reader = csv.reader(csvfile)
 7            for row in reader:
 8                school_name = row[4]
 9                if school_name != 'schoolname':
10                    if school_name in school_name_dict:
11                        school_name_dict[school_name] = school_name_dict[school_name] +1
12                    else:
13                        school_name_dict[school_name] = 1
14            for address in school_name_dict:
15               school_loc[address] = lon_lat_request_gd(address)
16               print(1)
17            json.dump(school_loc, schoolfile_loc)
18            json.dump(school_name_dict,schoolfile_number)
19            print('加载入完成……')

后续数据处理均使用Excel数据透视表以及相应的插件完成,故无代码。

数据来源:阳光高考网自主招生公示平台
文案:幻华

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270