233倔强不秃 发表于 2020-3-26 16:58:07

爬取2019全国大学排名

本帖最后由 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(.string, tds.string, tds.string, tds.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, u, u, u, chr(12288)))


if __name__ == '__main__':
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
    html = openURL(url)
    ulist = getUinfo(uinfo, html)
    saveUinfo(ulist)
   
   



六、心得
        看完排名很自闭

附件:

不二如是 发表于 2020-3-26 17:18:42

不错哈

233倔强不秃 发表于 2020-3-26 17:25:14

不二如是 发表于 2020-3-26 17:18
不错哈

谢谢鼓励{:10_332:}
页: [1]
查看完整版本: 爬取2019全国大学排名