python进阶(二)——request 爬取中国最好大学排名
這是要爬取的網址
http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html
效果如下,代碼思路均來自于中國大學mooc python嵩老師的課程(推薦一下)
前置知識
python基本語法,看得懂html (找到要爬取的內容)
簡單的request(爬蟲工具,不會也沒關系)
beautifulsoup(將爬下的內容轉換為人看的懂的工具,這是核心,有注釋,但要理解清楚還得再多看點文章)
如果以上都問題不大,那么接下來將會很輕松(如果你水平可以,你也可以直接看文末代碼)
代碼框架
#獲取網頁內容 def getHTML(url): #將網頁中目標內容移動到列表中 def moveToList(): #打印 def printHTML(): main():url="http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"uinfo=[]html=getHTML(url)moveToList(uinfo,html)printHTML(uinfo,20)以上是整個代碼的骨架,思路很清晰,我始終認為,代碼骨架可以使得思路清晰,比起具體的代碼有更少的記憶負擔和更好的效果
核心分析
request和beautifulsoup都是需要導入的,所以我們還得
import requests from bs4 import BeautifulSoup import bs4為什么要導入兩次bs4?不是的,一次是BeautifulSoup,用來解析爬下來的內容,
一次是bs4,用來過濾無關的內容
有三個知識核心,看這個代碼
#將url這個網址的html內容返回到r中 r=request.get(url)print(r.text)就可以直接打印出html代碼,這是最簡單的爬蟲
# 將html文件使用html解析器進行解析,返回的soup就是排好格式的html,soup = BeautifulSoup(html, "html.parser")這是承接上面的,注意,此時soup仍是html
#在soup對象中尋找<tbody>標簽的子標簽for tr in soup.find('tbody').children:為什么是tbody?因為
網頁上面的大學都在tbody里面,而tbody有很多的tr,就是一行大學,包括名字,省份,排名等
所以tbody的子標簽就是tr,但是不是所有的tr都是大學,還得過濾(代碼有介紹)
最后是是將過濾好的數據轉換格式
#將“排名”房子0處,“學校名稱”放在1處,省份放在2處 #^表示居中,<表示居左,后面的數字表示占位大小 #chr(12288)表示用中文的空格補齊空缺(避免錯位)tplt="{0:^6}\t{1:{3}^10}\t{2:<10}"print(tplt.format("排名", "學校名稱", "省份",chr(12288)))如果你已經理解了以上3個核心問題,那么你就可以直接看代碼了
源代碼
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/2/13 13:33 # @Author : cs # @decription: 爬取中國最好大學排名import requests from bs4 import BeautifulSoup import bs4 from pandas import DataFramedef getHTML(url):try:r = requests.get(url, timeout=30)r.raise_for_status()#解碼格式r.encoding = r.apparent_encodingreturn r.textexcept:print("獲取錯誤")def moveToList(ulist, html):soup = BeautifulSoup(html, "html.parser")# print(soup.find('tbody').childern)# 找到目標數據標簽,遍歷tbody的孩子for tr in soup.find('tbody').children:# 過濾,如果tr的類型是bs4.element.Tag,那就是目標類型if isinstance(tr, bs4.element.Tag):# print(tr)#將所有td標簽(列值)存儲到列表中tds = tr('td')# 將每個列表添加到大列表中作為一個元素,只取前三列(排名,大學,省份)的string(內容)ulist.append([tds[0].string, tds[1].string, tds[2].string])def printHTML(ulist,num):tplt="{0:^6}\t{1:{3}^10}\t{2:<10}"print(tplt.format("排名", "學校名稱", "省份",chr(12288)))for i in range(num):u=ulist[i]print(tplt.format(u[0], u[1], u[2],chr(12288)))passdef main():url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"html = getHTML(url)# print(html)uinfo = []moveToList(uinfo, html)frame=DataFrame(uinfo)#這里可以將內容輸出到csv文件,data是項目下的包,修改相對路勁即可#frame.to_csv("../data/bestUniversity.csv",index=0)printHTML(uinfo,20) main()這是在pycharm中打開的csv文件,在wps中打開格式會更好
總結
以上是生活随笔為你收集整理的python进阶(二)——request 爬取中国最好大学排名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AR(3)模型递推最小二参数估计的MAT
- 下一篇: python里else中文意思_Pyth