马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 233倔强不秃 于 2020-3-26 16:59 编辑
爬取2019全国大学排名
一、准备
获取排名首先需要一个靠谱的URL:最好大学,这个网站的数据是比较权威的。其次我们需要用python的第三方库:BeautifulSoup库和requests库。
二、梳理思路:
(1)导入BeautifulSoup库和requests库,用requests库获取网页的源代码,用BeautifulSoup将html文本做成一锅汤
(2)右键查看网页源代码,看一下数据是不是js动态生成的。可以用Ctrl+F直接搜索。比如搜索清华大学,可以发现排名信息是能找到的,所以不是动态生成的。
(3)经观察发现这些排名信息都在<tbody>标签下的<tr>标签中,每个<tr>包含了一个大学的所有信息,这些信息在<td>标签下
(4)使用BeautifulSoup库解析,从网页源代码中提取<tbody>-<tr>-<td>
(5)从中提取有效信息,存到本地的文件中
三、编写函数:
编写三个函数,分别是:
(1)openURL 用于获取页面的html文本信息
(2)getUinfo 提取排行榜等相关信息
(3)saveUinfo 将获取到的信息保存到本地
四、细节剖析:
openURL中:
(1)向服务器提交申请时,服务器会检查申请的来源,发现来自python会进行屏蔽,所以通过更改headers参数解决。
(2)运用try-except语句进行异常检测,requests库中的r.raise_for_status()函数可以获取状态码(正常打开为200),不能正常打开时引发异常
(3)进行编码转换 r.encoding = r.apparent_encoding
getUinfo中:
(1)用BeautifulSoup库的find函数找到<tbody>的孩子标签<tr>,再从<tr>中找<td>时,用instance函数可以过滤掉不为“bs4.Element.Tag”的内容
(2)从<tr>标签下获取到的所有<td>标签为一个列表,而我们要提取的内容是每个学校的四项基本信息(排名,学校名称,省市,总分),还有总的排行榜,所有用列表中嵌套列表的存储方法最为合适。
则append函数的参数应该也是一个列表。
saveUinfo中:
(1)保存时直接写入就可以,不用以二进制写入,因为已经进行了编码转换
(2)保存的格式可以用 format 函数来控制,这里应该特别注意一下 format 的运用。存在一个中文对齐的问题。
五、源代码:
import requests
from bs4 import BeautifulSoup
import bs4
def openURL(url):
head = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}
try:
r = requests.get(url, headers = head, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return '网页打开异常'
def getUinfo(ulist, html):
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
return ulist
def saveUinfo(ulist):
with open('F:\\Python demo\\爬虫\\2019大学排名.txt', 'w') as f:
tplt = '\t\t{0:^10}\t\t {1:{4}^10} \t {2:^10} \t {3:^10}\n\n'
f.write(tplt.format('排名', '学校名称', '省市', '总分', chr(12288)))
for u in ulist:
f.write(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
if __name__ == '__main__':
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
html = openURL(url)
ulist = getUinfo(uinfo, html)
saveUinfo(ulist)
六、心得
看完排名很自闭
附件:
|