Artigo de referência: rastreamento de classificação de universidade de melhor rede de universidade em Python (2020)
A segunda semana do MOOC Professor Songtian Python Web Crawler Unidade 6 da Universidade Chinesa da China Exemplo 1 A página da web de classificação da universidade rastreada mudou. O blog de Zhiyuan foi modificado com base no código original do professor e descobri que a página da web mudou novamente., Continue a modificar, forneça o último processo de rastreamento e código.
1. Análise da web
Link da Web: https://www.shanghairanking.cn/rankings/bcur/2020
Lugares que mudaram 1 (consulte o blog de Zhiyuan)
O hiperlink é adicionado ao nome da universidade, e o nome é envolvido na tag a sob a tag td. Preste atenção
Lugares que mudaram 2
Na etiqueta td, existem linhas em branco na etiqueta td [0] que representa o número de série e na etiqueta td [4] que representa a pontuação.
Se você usar diretamente
td[0].string
Como o objeto está vazio, o formato na função printUnivList relatará um erro:
TypeError: unsupported format string passed to NoneType.__format__
Portanto, as linhas em branco precisam ser removidas.
A primeira coisa que vem à mente é o método replace ():
tds[0].text.replace("\n", "")
Após a depuração, é realmente viável.
Depois de consultar a documentação do bs4, encontrei o método stripped_strings:
tds[0].stripped_strings
Dois, o código:
# -*- coding: utf-8 -*-
# Created on 2021/3/6 14:01
import requests
from bs4 import BeautifulSoup
import bs4
# 获取目标网页的文本信息
def getHTMLText(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.find_all('td')
name = tds[1].find('a').string.strip()
rank = tds[0].text.replace("\n", "").strip()
score = tds[4].text.replace("\n", "").strip()
ulist.append([rank, name, score])
# 打印列表内容
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]
print(tplt.format(u[0].strip(), u[1].strip(), u[2].strip(), chr(12288)))
def main():
uinfo = []
url = 'https://www.shanghairanking.cn/rankings/bcur/2020'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)
main()
Outra maneira de escrever fillUnivList:
# 通过BeautifulSoup库解析网页,将信息加入列表中
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr.find_all('td')
tlist = [] # 创建临时列表
for rank in tds[0].stripped_strings: # 使用stripped_strings去掉换行、空格等
tlist.append(rank)
name = tds[1].find('a').string.strip()
tlist.append(name)
for score in tds[4].stripped_strings:
tlist.append(score)
ulist.append([tlist[0], tlist[1], tlist[2]]) # 将临时列表元素填充到ulist
Resultado de saída:
排名 学校名称 总分
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
10 中山大学 457.2
11 西安交通大学 452.5
12 哈尔滨工业大学 450.2
13 北京航空航天大学 445.1
14 北京师范大学 440.9
15 同济大学 439
16 四川大学 435.7
17 东南大学 432.7
18 中国人民大学 409.7
19 南开大学 402.1
20 北京理工大学 395.6
É isso, primeiro blog, críticas e orientações são bem vindas