溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python如何爬取歷年高考分?jǐn)?shù)線

發(fā)布時(shí)間:2021-10-26 10:22:22 來(lái)源:億速云 閱讀:971 作者:柒染 欄目:編程語(yǔ)言

本篇文章給大家分享的是有關(guān)Python如何爬取歷年高考分?jǐn)?shù)線,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

粉絲獨(dú)白

高考已經(jīng)結(jié)束了,相信絕大部分同學(xué)都在放松自己了,畢竟壓抑了這么久。現(xiàn)在雖然距離高考放榜還有一段時(shí)間,可能有一些同學(xué)已經(jīng)迫不及待地想知道自己考的怎樣。因此,現(xiàn)在就來(lái)爬取高考網(wǎng)上的近幾年高考分?jǐn)?shù)線,看一下近幾年分?jǐn)?shù)線的變化趨勢(shì),從而心里面有個(gè)底,這樣才能夠更加放松的去嗨皮。

使用的工具庫(kù)

1.總體思路

高考網(wǎng)上,可以查看各省的分?jǐn)?shù)線,其中文理科都有2009-2017年的數(shù)據(jù),所以可以直接爬取這些數(shù)據(jù)下來(lái)存到MongoDB中,然后再使用echarts進(jìn)行繪圖展示,從而可以更加直觀的看到高考分?jǐn)?shù)線的變化趨勢(shì)。

Python如何爬取歷年高考分?jǐn)?shù)線

2.爬取數(shù)據(jù)

(1)獲取各省的分?jǐn)?shù)線信息

有兩種方法可以達(dá)到這個(gè)目的

1).通過(guò)拼接URL鏈接切換省份,可以得出鏈接的變化規(guī)律:只要替換省份的拼音上去就可以請(qǐng)求到:

http://www.gaokao.com/guangdong/fsx/ 

http://www.gaokao.com/shanghai/fsx/

推薦使用pypinyin模塊——漢字拼音轉(zhuǎn)換模塊/工具。直接使用lazy_pinyin方法就可以得到各省的拼音。由于返回的是列表,所以還需要處理一下才能使用。

>>> from pypinyin import lazy_pinyin  >>> lazy_pinyin('北京')  ['bei', 'jing']

2).通過(guò)獲取地區(qū)導(dǎo)航中的各省鏈接,直接得到URL:

Python如何爬取歷年高考分?jǐn)?shù)線

獲取各省份的鏈接:

# 獲取省份及鏈接  pro_link = []  def get_provice(url):     web_data = requests.get(url, headers=header)     soup = BeautifulSoup(web_data.content, 'lxml')     provice_link = soup.select('.area_box > a')     for link in provice_link:         href = link['href']         provice = link.select('span')[0].text         data = {             'href': href,             'provice': provice         }         provice_href.insert_one(data)#存入數(shù)據(jù)庫(kù)         pro_link.append(href)

(2)爬取分?jǐn)?shù)線

接下來(lái)就可以開始爬取分?jǐn)?shù)線了,通過(guò)審查元素(如下圖),直接使用beautifulsoup來(lái)過(guò)濾內(nèi)容。

Python如何爬取歷年高考分?jǐn)?shù)線

# 獲取分?jǐn)?shù)線  def get_score(url):     web_data = requests.get(url, headers=header)     soup = BeautifulSoup(web_data.content, 'lxml')     # 獲取省份信息     provice = soup.select('.col-nav span')[0].text[0:-5]     # 獲取文理科     categories = soup.select('h4.ft14')     category_list = []     for item in categories:         category_list.append(item.text.strip().replace(' ', ''))#替換空格     # 獲取分?jǐn)?shù)     tables = soup.select('h4 ~ table')     for index, table in enumerate(tables):         tr = table.find_all('tr', attrs={'class': re.compile('^c_\S*')})#使用正則匹配         for j in tr:             td = j.select('td')             score_list = []             for k in td:                 # 獲取每年的分?jǐn)?shù)                 if 'class' not in k.attrs:                     score = k.text.strip()                     score_list.append(score)                  # 獲取分?jǐn)?shù)線類別                 elif 'class' in k.attrs:                     score_line = k.text.strip()                  score_data = {                     'provice': provice.strip(),#省份                     'category': category_list[index],#文理科分類                     'score_line': score_line,#分?jǐn)?shù)線類別                     'score_list': score_list#分?jǐn)?shù)列表                 }             score_detail.insert_one(score_data)#插入數(shù)據(jù)庫(kù)

3.開始爬取

由于有30多個(gè)省份,所以這里使用多線程來(lái)爬取,可以提高爬取效率。 

if __name__ == '__main__':      header = {         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',         'Connection': 'keep - alive'         }     url = 'http://www.gaokao.com/guangdong/fsx/'      get_provice(url)     pool = Pool()     pool.map(get_score, [i for i in pro_link])#使用多線程

使用多線程爬取的話,不用1分鐘就可以爬完所有的數(shù)據(jù)了???,多線程可牛逼了,叉會(huì)腰先。

4.數(shù)據(jù)可視化

爬取數(shù)據(jù)只是***步,接下來(lái)就要對(duì)數(shù)據(jù)進(jìn)行處理展示了。從mongodb 中查找出數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行清洗整理,由于我這里的pyecharts有點(diǎn)問題,所以使用echarts進(jìn)行展示。

1).篩選省份等信息

直接通過(guò)mongodb的find函數(shù),限制查找的內(nèi)容。

import pymongo  import charts  client = pymongo.MongoClient('localhost', 27017)  gaokao = client['gaokao']  score_detail = gaokao['score_detail']   # 篩選分?jǐn)?shù)線、省份、文理科  def get_score(line,pro,cate):     score_list=[]     for i in score_detail.find({"$and":[{"score_line":line},{"provice":pro},{'category': cate}]}):         score_list = i['score_list']         score_list.remove('-')#去掉沒有數(shù)據(jù)的欄目         score_list = list(map(int, score_list))         score_list.reverse()         return score_list

2).定義相關(guān)數(shù)據(jù)

# 獲取文理科分?jǐn)?shù)  line = '一本'  pro = '北京'  cate_wen = '文科'  cate_li = '理科'  wen=[]  li = []  wen=get_score(line,pro,cate_wen)#文科  li=get_score(line,pro,cate_li)#理科   # 定義年份  year = [2017,2016,2015,2014,2013,2012,2011,2010,2009]  year.reverse()

3).折線圖展示

series = [     {     'name': '文 科',    'data': wen,     'type': 'line'  }, {     'name': '理科',     'data': li,     'type': 'line',     'color':'#ff0066'  }          ]  options = {     'chart'   : {'zoomType':'xy'},     'title'   : {'text': '{}省{}分?jǐn)?shù)線'.format(pro,line)},     'subtitle': {'text': 'Source: gaokao.com'},     'xAxis'   : {'categories': year},     'yAxis'   : {'title': {'text': 'score'}}     }   charts.plot(series, options=options,show='inline')

這樣就可以得到下面的歷年分?jǐn)?shù)線趨勢(shì)圖了。當(dāng)然,可以修改get_score的參數(shù)就可以的到其他省份的信息了。

5.預(yù)測(cè)分?jǐn)?shù)線

通過(guò)折線圖,可以大概的預(yù)測(cè)2018年北京高考一本的分?jǐn)?shù)線:文科在550-560分之間;理科在530-540分之間。當(dāng)然,這只是預(yù)測(cè)的,如果有特殊情況的話,可能波動(dòng)會(huì)比較大。另外,還可以通過(guò)拉格朗日插值法求出今年的分?jǐn)?shù)線,這樣比較準(zhǔn)確,但是由于過(guò)程比較麻煩,所以這里只是目測(cè)而已。

以上就是Python如何爬取歷年高考分?jǐn)?shù)線,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI