python爬虫学习笔记(二)——Beautiful Soup库

中国大学排名top100的定向爬虫实例

最好大学网:http://www.zuihaodaxue.cn/zuihaodaxuepaiming-zongbang-2020.html

功能描述

输入:大学排名URL链接

输出:大学排名信息的屏幕输出(排名,大学名称,总分)

技术路线:requests­--bs4

定向爬虫:仅对输入URL进行爬取,不扩展爬取

程序的结构设计:

步骤1:从网络上获取大学排名网页内容         gethtmltext()

步骤2:提取网页内容中信息到合适的数据结构        fillunivlist()

步骤3:利用数据结构展示并输出结果        printunivlist()

2020年10月3号-更新:

最近有人看了这篇文章后,发现爬取不信息了,我重新看了下官网,发现网站重构了,稍微调整了下代码,现在能爬取了,新官网的地址:http://www.shanghairanking.cn/rankings/bcur/2020,学校名称现在是存在td标签下a标签,所以爬取学校的名称时要向下查找a标签。

爬取优化

中国大学排名定向爬虫的中文对齐问题的原因:

当中文字符宽度不够时,采用西文字符填充;中西文字符占用宽度不同

解决:

采用中文字符的空格填充 chr(12288)

#使用的库

import requests
import bs4
from bs4 import BeautifulSoup

#发起请求的函数——gethtmltext()

def gethttptext(url):
    try:
        r=requests.get(url,timeout=30)  #通过get获取url信息,且设定timeout时间为30秒
        r.raise_for_status()  #如果状态不是200,引发HTTPError异常 
        r.encoding=r.apparent_encoding  #修改编码
        return r.text
    except:
        return ""

#解析网页内容的函数——fillunivlist()

这里使用了BeautifulSoup库,我们通过查看网页源代码可以看到,所有大学信息被封装在一个表格中,这个表格的标签叫tbody,在tbody中,每个大学的信息被封装在一个标签中,这个标签叫tr,每个tr标签里又有一个td标签,每个大学的具体信息就被这个标签包围。我们首先遍历tbody标签,获得所有大学信息,然后在tbody标签中找到tr标签,获得每个大学信息,最后在tr标签里找到td标签,把我们需要的相关数据写在我们的ulist列表中。

def fillunivlist(ulist,html):
    soup=BeautifulSoup(html,'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds=tr('td')
            tda=tr('a')
            ulist.append([tds[0].string,tda[0].string,tds[4].string])

 


#输出爬取结果的函数——printunivlist()

def printunivlist(ulist,num):
    tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"   #格式化输出
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u=ulist[i]
        if u[2]==None:   #如果没有总分,则为None
            u[2]='None'
        print(tplt.format(u[0],u[1],u[2],chr(12288)))

#主函数

def main():
    uinfo=[]
    url='http://www.shanghairanking.cn/rankings/bcur/2020'
    html=gethttptext(url)
    fillunivlist(uinfo,html)
    printunivlist(uinfo,100)

main()

#完整代码

import requests
import bs4
from bs4 import BeautifulSoup


def gethttptext(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent.encoding
        return r.text
    except:
        return ""


def fillunivlist(ulist,html):
    soup=BeautifulSoup(html,'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds=tr('td')
            tda=tr('a')
            ulist.append([tds[0].string,tda[0].string,tds[4].string])


def printunivlist(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"  # 0、1、2为槽,{3}表示若宽度不够,使用format的3号位置处的chr(12288)(中文空格)进行填充
    print(tplt.format("排名", "学校名称", "总分", chr(12288)))
    for i in range(num):
        u = ulist[i]
        if u[2] != None:
            print(tplt.format(u[0], u[1], u[2], chr(12288)))


def main():
    uinfo=[]
    url='http://www.shanghairanking.cn/rankings/bcur/2020'
    html=gethttptext(url)
    fillunivlist(uinfo,html)
    printunivlist(uinfo,100)

main()

输出结果

排名    学校名称    总分
1    清华大学    852.5
2    北京大学    746.7
3    浙江大学    649.2
4   上海交通大学   625.9
5    南京大学    566.1
6    复旦大学    556.7
7  中国科学技术大学  526.4
8   华中科技大学   497.7
9    武汉大学    488.0
10    中山大学    457.2
11   西安交通大学   452.5
12  哈尔滨工业大学   450.2
13  北京航空航天大学  445.1
14   北京师范大学   440.9
15    同济大学    439.0
16    四川大学    435.7
17    东南大学    432.7
18   中国人民大学   409.7
19    南开大学    402.1
20   北京理工大学   395.6
21    天津大学    390.3
22    山东大学    387.9
23    厦门大学    383.3
23  北京协和医学院   None
24    吉林大学    379.5
25   华南理工大学   379.4
26    中南大学    378.6
27   大连理工大学   365.1
28   西北工业大学   359.6
29   华东师范大学   358.0
30   中国农业大学   351.5
30   上海财经大学   None
31    湖南大学    348.3
32   电子科技大学   334.8
33   北京科技大学   321.8
34    重庆大学    320.9
35  南京航空航天大学  319.5
36   南京理工大学   317.1
36   中央财经大学   None
37    东北大学    314.0
38    苏州大学    306.8
39   华中农业大学   300.5
40    兰州大学    300.4
40 香港中文大学(深圳) None
41  西安电子科技大学  299.4
41  对外经济贸易大学  None
42   华东理工大学   294.6
43   北京交通大学   293.6
44   华中师范大学   292.4
45    上海大学    290.0
46   南方科技大学   289.0
46   首都医科大学   None
47   南京农业大学   283.2
47   南京医科大学   None
48    暨南大学    282.6
49   中国海洋大学   281.2
50   南京师范大学   279.9
51  哈尔滨工程大学   279.4
52   武汉理工大学   277.6
52  中南财经政法大学  None
53   西南交通大学   277.3
54 中国地质大学(武汉) 274.9
55   北京邮电大学   273.7
55   中国政法大学   None
56   东北师范大学   272.5
57 中国石油大学(北京) 272.4
58    河海大学    271.8
59    江南大学    271.5
59   中国医科大学   None
60   中国矿业大学   264.9
61    西北大学    262.4
61   上海纽约大学   None
62   上海科技大学   261.5
62   天津医科大学   None
63   北京工业大学   260.5
64   北京化工大学   259.7
65    深圳大学    259.1
66    西南大学    257.5
67   华南师范大学   254.4
67   西南财经大学   None
68  西北农林科技大学  251.1
68  宁波诺丁汉大学   None
69    扬州大学    250.5
70 中国地质大学(北京) 248.8
70  北京外国语大学   None
70   东北财经大学   None
71 中国矿业大学(北京) 247.0
72    江苏大学    245.9
73    东华大学    245.2
74 中国石油大学(华东) 244.8
75    宁波大学    244.3
75   南方医科大学   None
76    福州大学    243.8
77   北京林业大学   242.3
78   合肥工业大学   240.5
78  哈尔滨医科大学   None
78   中国传媒大学   None
79   陕西师范大学   239.9
80   华北电力大学   235.7
81   浙江工业大学   235.5
82   南京工业大学   235.4
83    郑州大学    234.9
84    云南大学    234.1
85   湖南师范大学   233.4
85   首都师范大学   233.4
87    南昌大学    228.4
87  上海外国语大学   None
87  上海中医药大学   None
88   华南农业大学   227.1
89   上海理工大学   221.4
90    安徽大学    219.2
91    长安大学    218.9
91   中央民族大学   None
92    燕山大学    216.7
93  南京信息工程大学  216.6
93   中国药科大学   None
94    湖北大学    214.5
95   广东工业大学   214.2
96   南京邮电大学   213.9
97    河南大学    212.9
98   上海师范大学   212.8
99  杭州电子科技大学  211.6
99  西交利物浦大学   None
100    广州大学    211.1

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值