日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python:使用爬虫获取中国最好的大学排名数据(爬虫入门)

發布時間:2024/5/15 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python:使用爬虫获取中国最好的大学排名数据(爬虫入门) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 問題描述
    • 結果展示
    • 解決思路
    • 代碼實現
    • 代碼講解
    • 總結一下
    • 使用 XPath 實現

問題描述

請使用 Python 爬取最好大學網的 大學排名數據 ,并保存為 CSV 和 Excel 格式。

結果展示

以爬取前 10 名大學為例:

解決思路

目標網站:軟科中國最好大學排名2019
使用 Python 的 BeautifulSoup 庫:BeautifulSoup官方文檔

這里主要使用了 BeautifulSoup 庫,該庫功能十分強大,我只使用了它不到 1% 的功能。更多的功能請大家看官方文檔,是中文的哦。

因為是使用爬蟲,所以必須引入的兩個庫是:requests 和 BeautifulSoup,另外設計存儲到 Excel 中,所以我選擇使用 pandas 庫,它的二維結構提供很方便的方法可以直接存儲到 Excel 中,另外用到pandas就會用到numpy用來生成二維數組。

所以用到的庫有:

  • 🔥 requests
  • 🔥 bs4
  • 🔥 pandas
  • 🔥 numpy

代碼實現

import requests as rq from bs4 import BeautifulSoup as Bs import pandas as pd import numpy as npdef getData(resLoc):rp = rq.get(resLoc)rp.encoding = 'utf-8'return rp.textdef dataProcessing(html, num):table = Bs(html, features='lxml').table.find_all('tr', limit=num, recursive=True)table_head = table[0]universityList = []for tr in table[1:]:tds = tr.find_all('td')contents = [td.contents for td in tds]contents[1] = contents[1][0].contentsuniversityList.append(contents)thf = [th.contents for th in table_head.find_all('th', limit=4)]for i in [op.contents for op in table_head.find_all('option', recursive=True)]:thf.append(i)thf = ["".join(th) for th in thf]univList = []for university in universityList:university = ["".join(attr) for attr in university]univList.append(university)return pd.DataFrame(np.array(univList), columns=thf)def saveData(data):data.to_csv('university.csv', index=False)data.to_excel('university.xlsx', index=False)def main(num):if num >= 549:returnelse:url = 'http://zuihaodaxue.com/zuihaodaxuepaiming2019.html'saveData(dataProcessing(getData(url), num + 1))# 測試,爬取前 10 名大學的信息 main(10)

但是,相信大家看了上面的代碼肯定想殺人,這代碼的可讀性幾乎為0,根本不是寫給人看的,所以下面我們講解一下代碼。

代碼講解

下面我采用注釋的方式帶大家一步一步的來解決這個問題,并且可以學到很多知識。

首先我們先導包:

import requests as rq from bs4 import BeautifulSoup as Bs import pandas as pd import numpy as np

我們使用的 BeautifulSoup 是 bs4 中的一個類,所以我們引入該類就可以了,順便起一個別名。

但是這個庫實際上是叫做 beautifulsoup的,我們 install 的時候也是安裝的 beautifulsoup ,但是執行的導包的時候是 bs4。

這里我們以一種自頂向下的思維編程,具體就是,先列出函數,函數具體怎么執行的我先不管,我只要你的返回值,然后我拿來使用。

所以我們先在 main 方法中定義一些函數,之后再實現。

def main(num):# 由于該網站最多有550個大學,所以輸入的數字不能大于550,否則什么也不做if num >= 550:print("數量不能大于550")returnelse:url = 'http://zuihaodaxue.com/zuihaodaxuepaiming2019.html'# 獲取數據text = getData(url)# 處理數據, num 是你要爬取前多少名大學的排名信息universityList = dataProcessing(text, num + 1)# 保存數據saveData(universityList)print("文件保存成功!")

我們打開這個網站來看一下:

習慣上我們使用 F12 打開,也可以右鍵表格,點擊檢查:

我們需要的數據就在這里面:

每一個 tr 里面都有一行數據,這就是我們想要的,而表頭就是標題,我們后面都會用到。

現在我們一個一個的實現這些函數:

首先是 getData(url) 方法,該方法就是通過程序獲取我們在瀏覽器看到的 Html 頁面。

# 獲取數據,就是通過訪問網頁,把他的html源代碼拿過來 def getData(resLoc):rp = rq.get(resLoc)rp.encoding = 'utf-8'return rp.text

get 表示是 GET 請求,encoding 設置編碼。

好了,獲取了數據,我們就要分割處理數據了。

就是 dataProcessing(html, num) 方法,num 是爬取的大學數量。

首先創建一個 BeautifulSoup 對象:

bs = Bs(html, features='lxml')

然后呢,這個 bs 其實代表是整個 HTML 的 DOM 樹,我們要做的就是從這個 DOM 樹中取東西。

我們之前已經看過 HTML 的格式了,他只有一個 table 標簽,所以我們可以通過點的方式獲取這個 table 元素。

然后他返回的還是一個 bs 對象,只不過這個 DOM 樹變小了,所以我們可以使用 find_all 方法來獲取 table 下的所有 tr標簽。

# 包含表頭的列表 table = bs.table.find_all('tr', limit=num, recursive=True)

但是這里是有問題的,因為這張表有表頭,表頭的 tr我們需要單獨拿出來。

table_head = table[0] print(table_head)

我們打印出來看一下表頭是啥:

# 看一下表頭是什么:# <tr># <th style="text-align: center;">排名</th># <th style="text-align: center;">學校名稱</th># <th class="hidden-xs" style="text-align: center; width: 80px;">省市</th># <th style="text-align: center;">總分</th># <th class="hidden-xs" style="text-align: center; width: 265px;">指標得分<br/># <select class="form-control" id="select-indicator-type" name="type" style="text-align: left;"># <option selected="selected" title="生源質量(新生高考成績得分)" value="indicator5">生源質量(新生高考成績得分)</option># <option title="培養結果(畢業生就業率)" value="indicator6">培養結果(畢業生就業率)</option># <option title="社會聲譽(社會捐贈收入·千元)" value="indicator7">社會聲譽(社會捐贈收入·千元)</option># <option title="科研規模(論文數量·篇)" value="indicator8">科研規模(論文數量·篇)</option># <option title="科研質量(論文質量·FWCI)" value="indicator9">科研質量(論文質量·FWCI)</option># <option title="頂尖成果(高被引論文·篇)" value="indicator10">頂尖成果(高被引論文·篇)</option># <option title="頂尖人才(高被引學者·人)" value="indicator11">頂尖人才(高被引學者·人)</option># <option title="科技服務(企業科研經費·千元)" value="indicator12">科技服務(企業科研經費·千元)</option># <option title="成果轉化(技術轉讓收入·千元)" value="indicator13">成果轉化(技術轉讓收入·千元)</option># <option title="學生國際化(留學生比例) " value="indicator14">學生國際化(留學生比例)</option># </select># </th># </tr>

這正是我們想要的數據,我們可以通過 contents 獲取 標簽對 里面的數據,就大功告成了。

# 這里為什么只要四個呢? 因為第五個是下拉選框,我們后面再單獨處理 ths = table_head.find_all('th', limit=4) # 這里是表頭的前四個元素 [['排名'], ['學校名稱'], ['省市'], ['總分']], th_four 代表前四個th thf = [th.contents for th in ths]

在仔細看你會發現后面有一個不是普通的列表,他是一個 select!所以我們上面只要了前四個。

下面處理下拉框中的元素 option;

options = [op.contents for op in table_head.find_all('option', recursive=True)]

打印出來看看:

# [ ['生源質量(新生高考成績得分)'],# ['培養結果(畢業生就業率)'],# ['社會聲譽(社會捐贈收入·千元)'],# ['科研規模(論文數量·篇)'],# ['科研質量(論文質量·FWCI)'],# ['頂尖成果(高被引論文·篇)'],# ['頂尖人才(高被引學者·人)'],# ['科技服務(企業科研經費·千元)'],# ['成果轉化(技術轉讓收入·千元)'],# ['學生國際化(留學生比例)'] ]

正是我們想要的,不過他是二維列表,不怕后面我們再處理。

將這個和之前的 4 個合并。

for i in options:thf.append(i)

現在我們處理表體,也就是最最干貨的內容。

# 去掉表頭,只要表體 table_body = table[1:]

打印出來看一下每一條 tr 里面是什么?

# [ <tr class="alt"># <td>1</td> --排名# <td><div align="left">清華大學</div></td> --學校名稱# <td>北京</td> --省市# <td>94.6</td> --總分# <td class="hidden-xs need-hidden indicator5">100.0</td> --生源質量# <td class="hidden-xs need-hidden indicator6" style="display: none;">98.30%</td> --培養結果# <td class="hidden-xs need-hidden indicator7" style="display: none;">1589319</td> --社會聲譽# <td class="hidden-xs need-hidden indicator8" style="display: none;">48698</td> --科研規模# <td class="hidden-xs need-hidden indicator9" style="display: none;">1.512</td> --科研質量# <td class="hidden-xs need-hidden indicator10" style="display: none;">1810</td> --頂尖成果# <td class="hidden-xs need-hidden indicator11" style="display: none;">126</td> --頂尖人才# <td class="hidden-xs need-hidden indicator12" style="display: none;">1697330</td> --科技服務# <td class="hidden-xs need-hidden indicator13" style="display: none;">302898</td> --成果轉化# <td class="hidden-xs need-hidden indicator14" style="display: none;">6.81%</td> --學生國際化# </tr> ]

我們可以無視上面標簽中的屬性值,只關注內容,也就是說對于table_body中的每一個tr標簽,我們要做的是取出來其中的td中的content,作為二維列表。

編寫一個循環來遍歷每一個 tr:

universityList = [] for tr in table_body:tds = tr.find_all('td')

這個時候我們打印一下tds看看:

# tds 的結果是:# print(tds)# [ <td>1</td>,# <td><div align="left">清華大學</div></td>,# <td>北京</td>, <td>94.6</td>,# <td class="hidden-xs need-hidden indicator5">100.0</td>,# <td class="hidden-xs need-hidden indicator6" style="display: none;">98.30%</td>,# <td class="hidden-xs need-hidden indicator7" style="display: none;">1589319</td>,# <td class="hidden-xs need-hidden indicator8" style="display: none;">48698</td>,# <td class="hidden-xs need-hidden indicator9" style="display: none;">1.512</td>,# <td class="hidden-xs need-hidden indicator10" style="display: none;">1810</td>,# <td class="hidden-xs need-hidden indicator11" style="display: none;">126</td>,# <td class="hidden-xs need-hidden indicator12" style="display: none;">1697330</td>,# <td class="hidden-xs need-hidden indicator13" style="display: none;">302898</td>,# <td class="hidden-xs need-hidden indicator14" style="display: none;">6.81%</td> ]

可以看到是一個列表,我們獲取每一個 td 標簽的 content:

contents = [td.contents for td in tds] # for td in tds:# print(td.contents)# 得到的結果如下:# ['1']# [<div align="left">清華大學</div>]# ['北京']# ['94.6']# ['100.0']# ['98.30%']# ['1589319']# ['48698']# ['1.512']# ['1810']# ['126']# ['1697330']# ['302898']# ['6.81%']

但是有一個問題就是 [<div align="left">清華大學</div>] 這里有一個 div 標簽,我們要把它替換成他里面的元素值。

contents[1] = contents[1][0].contents

大家注意我們現在還在for循環當中哦,我們要這些遍歷到的contents存到外面的變量中才能保存起來

universityList.append(contents)

現在我們得到的列表就是類似于這種形式[[[清華], [1], ...], [[北大], [2], ...], ...]

降維打擊!

# 下面的問題是, 我們有了表頭列表 thf(二維),有了表體列表 universityList(三維), 怎么把它們合并呢? # thf: [['排名'], ['學校名稱'], ['省市'], ['總分'], ['生源質量(新生高考成績得分)'], ['培養結果(畢業生就業率)'], ['社會聲譽(社會捐贈收入·千元)'], ['科研規模(論文數量·篇)'], ['科研質量(論文質量·FWCI)'], ['頂尖成果(高被引論文·篇)'], ['頂尖人才(高被引學者·人)'], ['科技服務(企業科研經費·千元)'], ['成果轉化(技術轉讓收入·千元)'], ['學生國際化(留學生比例)']] # universityList: [ # [['1'], ['清華大學'], ['北京'], ['94.6'], ['100.0'], ['98.30%'], ['1589319'], ['48698'], ['1.512'], ['1810'], ['126'], ['1697330'], ['302898'], ['6.81%']], # [['2'], ['北京大學'], ['北京'], ['76.5'], ['95.2'], ['98.07%'], ['570497'], ['47161'], ['1.409'], ['1402'], ['100'], ['554680'], ['14445'], ['6.15%']] # ]

我們使用 DataFrame配合 numpy 可以實現這個功能,因為DataFrame有一個功能就是可以將幾行和一列數據一一對應形成一個表格。

# 但是還有一個問題就是DataFrame是二維結構,我們這里是三維結構,顯然需要降維打擊! # 我們把最里面的列表可以轉化為字符串,實現降維 # 降維的過程 thf = ["".join(th) for th in thf] univList = [] for university in universityList:university = ["".join(attr) for attr in university]univList.append(university)# 下面使用 DataFrame 的構造函數,傳入一個 numpy 構造的數組和一個列表作為表頭 pd_universityList = pd.DataFrame(np.array(univList), columns=thf)return pd_universityList

上面的代碼值得一提的就是這一個pd.DataFrame(np.array(univList), columns=thf),這里先是傳入了一個二維數組,然后第二個參數columns指的就是表頭,也就是說他會形成一種一一對應的關系,columns的每一個元素,對應二維數組的每一個元素的對應元素。

比如說我們的二維數組是:

1,清華大學,北京 2,北京大學,北京

那么columns對應的就是排名,學校名稱,省市,他會自動將排名和1,2對應,學校和清華大學對應。

在調試的過程中可能 DataFrame 顯示不全,可以采用下面的方法顯示全。

# 顯示所有列 # pd.set_option('display.max_columns', None) # 顯示所有行 # pd.set_option('display.max_rows', None) # 設置value的顯示長度為100,默認為50 # pd.set_option('max_colwidth', 100) # print(pd_universityList)

到此為止,我們最重要的方法就介紹完了,下面我們編寫第三個函數吧。

# 負責保存數據到本地磁盤 def saveData(data):data.to_csv('university.csv', index=False)data.to_excel('university.xlsx', index=False)

這里直接使用DataFrame自帶的方法就可以實現保存到本地。

好了,全部都做完了,下面我們只需要調用一下主函數即可運行程序。

輸入幾就可以獲取前幾名大學的數據,但是不能超過550,因為那網頁上就只有549個 。

# 測試,爬取前10名大學的信息 main(10)


帶注釋的代碼展示:

""" @author: shoo Wang @contact: wangsuoo@foxmail.com @file: demo02.py @time: 2020/5/6 0006 """ import requests as rq from bs4 import BeautifulSoup as Bs import pandas as pd import numpy as np# 獲取數據,就是通過訪問網頁,把他的html源代碼拿過來 def getData(resLoc):rp = rq.get(resLoc)rp.encoding = 'utf-8'return rp.text# 最關鍵的部分: 數據處理,我們的目標是將文本格式的 html 網頁轉化為表格的形式; def dataProcessing(html, num):bs = Bs(html, features='lxml')# 包含表頭的列表table = bs.table.find_all('tr', limit=num, recursive=True)table_head = table[0]# print(table_head)# 看一下表頭是什么:# <tr># <th style="text-align: center;">排名</th># <th style="text-align: center;">學校名稱</th># <th class="hidden-xs" style="text-align: center; width: 80px;">省市</th># <th style="text-align: center;">總分</th># <th class="hidden-xs" style="text-align: center; width: 265px;">指標得分<br/># <select class="form-control" id="select-indicator-type" name="type" style="text-align: left;"># <option selected="selected" title="生源質量(新生高考成績得分)" value="indicator5">生源質量(新生高考成績得分)</option># <option title="培養結果(畢業生就業率)" value="indicator6">培養結果(畢業生就業率)</option># <option title="社會聲譽(社會捐贈收入·千元)" value="indicator7">社會聲譽(社會捐贈收入·千元)</option># <option title="科研規模(論文數量·篇)" value="indicator8">科研規模(論文數量·篇)</option># <option title="科研質量(論文質量·FWCI)" value="indicator9">科研質量(論文質量·FWCI)</option># <option title="頂尖成果(高被引論文·篇)" value="indicator10">頂尖成果(高被引論文·篇)</option># <option title="頂尖人才(高被引學者·人)" value="indicator11">頂尖人才(高被引學者·人)</option># <option title="科技服務(企業科研經費·千元)" value="indicator12">科技服務(企業科研經費·千元)</option># <option title="成果轉化(技術轉讓收入·千元)" value="indicator13">成果轉化(技術轉讓收入·千元)</option># <option title="學生國際化(留學生比例) " value="indicator14">學生國際化(留學生比例)</option># </select># </th># </tr># 去掉表頭,只要表體table_body = table[1:]# print(table_body)# 看一下每一條 tr 里面是什么?# [ <tr class="alt"># <td>1</td> --排名# <td><div align="left">清華大學</div></td> --學校名稱# <td>北京</td> --省市# <td>94.6</td> --總分# <td class="hidden-xs need-hidden indicator5">100.0</td> --生源質量# <td class="hidden-xs need-hidden indicator6" style="display: none;">98.30%</td> --培養結果# <td class="hidden-xs need-hidden indicator7" style="display: none;">1589319</td> --社會聲譽# <td class="hidden-xs need-hidden indicator8" style="display: none;">48698</td> --科研規模# <td class="hidden-xs need-hidden indicator9" style="display: none;">1.512</td> --科研質量# <td class="hidden-xs need-hidden indicator10" style="display: none;">1810</td> --頂尖成果# <td class="hidden-xs need-hidden indicator11" style="display: none;">126</td> --頂尖人才# <td class="hidden-xs need-hidden indicator12" style="display: none;">1697330</td> --科技服務# <td class="hidden-xs need-hidden indicator13" style="display: none;">302898</td> --成果轉化# <td class="hidden-xs need-hidden indicator14" style="display: none;">6.81%</td> --學生國際化# </tr> ]# for tr in table_body:# 我們可以無視上面標簽中的屬性值,只關注內容# 也就是說對于table_body中的每一個tr標簽,我們要做的是取出來其中的td中的content,作為二維列表universityList = []for tr in table_body:tds = tr.find_all('td')# tds 的結果是:# print(tds)# [ <td>1</td>,# <td><div align="left">清華大學</div></td>,# <td>北京</td>, <td>94.6</td>,# <td class="hidden-xs need-hidden indicator5">100.0</td>,# <td class="hidden-xs need-hidden indicator6" style="display: none;">98.30%</td>,# <td class="hidden-xs need-hidden indicator7" style="display: none;">1589319</td>,# <td class="hidden-xs need-hidden indicator8" style="display: none;">48698</td>,# <td class="hidden-xs need-hidden indicator9" style="display: none;">1.512</td>,# <td class="hidden-xs need-hidden indicator10" style="display: none;">1810</td>,# <td class="hidden-xs need-hidden indicator11" style="display: none;">126</td>,# <td class="hidden-xs need-hidden indicator12" style="display: none;">1697330</td>,# <td class="hidden-xs need-hidden indicator13" style="display: none;">302898</td>,# <td class="hidden-xs need-hidden indicator14" style="display: none;">6.81%</td> ]# 可以看到是一個列表,我們獲取每一個 td 標簽的 contentcontents = [td.contents for td in tds]# for td in tds:# print(td.contents)# 得到的結果如下:# ['1']# [<div align="left">清華大學</div>]# ['北京']# ['94.6']# ['100.0']# ['98.30%']# ['1589319']# ['48698']# ['1.512']# ['1810']# ['126']# ['1697330']# ['302898']# ['6.81%']# 但是有一個問題就是 [<div align="left">清華大學</div>] 這里有一個 div 標簽,我們要把它替換成他里面的元素值contents[1] = contents[1][0].contents# 大家注意我們現在還在for循環當中哦,我們要這些遍歷到的contents存到外面的變量中才能保存起來universityList.append(contents)# 現在我們得到的列表就是類似于這種形式[[[清華], [1], ...], [[北大], [2], ...], ...]# print(universityList)# 但是現在還沒有把表頭加上,現在我們加上表頭,但是表頭還是那個亂七八糟的形式,所以我們要先處理一下# 這里為什么只要四個呢? 因為第五個是下拉選框,我們后面再單獨處理ths = table_head.find_all('th', limit=4)# 這里是表頭的前四個元素 [['排名'], ['學校名稱'], ['省市'], ['總分']], th_four 代表前四個ththf = [th.contents for th in ths]# 下面處理下拉框中的元素 optionoptions = [op.contents for op in table_head.find_all('option', recursive=True)]# print(options)# [ ['生源質量(新生高考成績得分)'],# ['培養結果(畢業生就業率)'],# ['社會聲譽(社會捐贈收入·千元)'],# ['科研規模(論文數量·篇)'],# ['科研質量(論文質量·FWCI)'],# ['頂尖成果(高被引論文·篇)'],# ['頂尖人才(高被引學者·人)'],# ['科技服務(企業科研經費·千元)'],# ['成果轉化(技術轉讓收入·千元)'],# ['學生國際化(留學生比例)'] ]# 好了,現在我們合并表頭for i in options:thf.append(i)# print(thf)# 下面的問題是, 我們有了表頭列表 thf(二維),有了表體列表 universityList(三維), 怎么把它們合并呢?# thf: [['排名'], ['學校名稱'], ['省市'], ['總分'], ['生源質量(新生高考成績得分)'], ['培養結果(畢業生就業率)'], ['社會聲譽(社會捐贈收入·千元)'], ['科研規模(論文數量·篇)'], ['科研質量(論文質量·FWCI)'], ['頂尖成果(高被引論文·篇)'], ['頂尖人才(高被引學者·人)'], ['科技服務(企業科研經費·千元)'], ['成果轉化(技術轉讓收入·千元)'], ['學生國際化(留學生比例)']]# universityList: [# [['1'], ['清華大學'], ['北京'], ['94.6'], ['100.0'], ['98.30%'], ['1589319'], ['48698'], ['1.512'], ['1810'], ['126'], ['1697330'], ['302898'], ['6.81%']],# [['2'], ['北京大學'], ['北京'], ['76.5'], ['95.2'], ['98.07%'], ['570497'], ['47161'], ['1.409'], ['1402'], ['100'], ['554680'], ['14445'], ['6.15%']]# ]# 但是還有一個問題就是DataFrame是二維結構,我們這里是三維結構,顯然需要降維打擊!# 我們把最里面的列表可以轉化為字符串,實現降維thf = ["".join(th) for th in thf]# universityList = ["".join(attr) for attr in [university for university in universityList]]# print(universityList)|univList = []for university in universityList:university = ["".join(attr) for attr in university]univList.append(university)pd_universityList = pd.DataFrame(np.array(univList), columns=thf)return pd_universityList# 顯示所有列# pd.set_option('display.max_columns', None)# 顯示所有行# pd.set_option('display.max_rows', None)# 設置value的顯示長度為100,默認為50# pd.set_option('max_colwidth', 100)# print(pd_universityList)# 負責保存數據到本地磁盤 def saveData(data):data.to_csv('university.csv', index=False)data.to_excel('university.xlsx', index=False)def main(num):# 由于該網站最多有550個大學,所以輸入的數字不能大于550,否則什么也不做if num >= 550:print("數量不能大于550")returnelse:url = 'http://zuihaodaxue.com/zuihaodaxuepaiming2019.html'# 獲取數據text = getData(url)# 處理數據, num 是你要爬取前多少名大學的排名信息universityList = dataProcessing(text, num + 1)# 保存數據saveData(universityList)print("文件保存成功!")# 測試,爬取前10名大學的信息 main(10)

總結一下

最重要的還是看 文檔,我這里只用了一個方法就是find_all,他還有非常多強大的功能,我們只需要會使用就行了,我太 CAI 了,只是一個 API 選手,你敢信就這幾行代碼我扣了倆小時才寫出來😔,還是得更努力的學,雖然學到最后還只是一個 API 調用者。

會這一個方法就可以爬一些網站的數據了,其他的也是以此類推,只需要分析另一個網頁的 DOM 結構即可,所以方法是通用的,如果你也是初學,不妨使用這個項目練練手。

使用 XPath 實現

從http://www.zuihaodaxue.cn/網站中爬蟲數據,獲取中國大學排名(Top10)

  • 爬取的數據保存為CSV文件(.CSV)
  • 采用xpath語法提取數據
""" @author: shoo Wang @contact: wangsuoo@foxmail.com @file: demo01.py @time: 2020/5/11 0011 """ import requests as rq from lxml import etree import pandas as pd import numpy as np# 獲取數據,就是通過訪問網頁,把他的html源代碼拿過來 def getData(resLoc):rp = rq.get(resLoc)rp.encoding = 'utf-8'return rp.text# 最關鍵的部分: 數據處理,我們的目標是將文本格式的 html 網頁轉化為表格的形式; def dataProcessing(html, num):html = etree.HTML(html)# 獲取表頭 //thead//th[position() < 5] //thead//optionth = html.xpath('//thead//th[position() < 5]/text()')th_select = html.xpath('//thead//option/text()')th.extend(th_select)# 大學名稱univ = html.xpath('//tbody/tr/td/div/text()')[:num]# //tbody/tr[1]/td/text() 獲取每一條記錄的數值nums = [[j for j in html.xpath('//tbody/tr[' + str(i + 1) + ']/td/text()')] for i in range(num)]idx = 0for num in nums:num.insert(1, univ[idx])idx += 1# 轉化為 DataFrame 結構,因為這種結構很好轉化為 Excelpd_universityList = pd.DataFrame(np.array(nums), columns=th)return pd_universityList# 負責保存數據到本地磁盤 def saveData(data):data.to_csv('university_china.csv', index=False)def main(num):# 由于該網站最多有 1000 個大學,所以輸入的數字不能大于 1000 ,否則什么也不做if num >= 1000:print("數量不能大于1000")returnelse:url = 'http://zuihaodaxue.com/zuihaodaxuepaiming2019.html'universityList = dataProcessing(getData(url), num)saveData(universityList)print("文件保存成功!")# 測試,爬取前10名大學的信息 main(10)

總結

以上是生活随笔為你收集整理的Python:使用爬虫获取中国最好的大学排名数据(爬虫入门)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。