中国大学排名爬取(以2016为例)
本帖最后由 yinda_peng 于 2024-2-19 17:33 编辑此案例来源于【中国大学MOOC】,或者见【哔哩哔哩网课】,bilibili在P29开始,我发现这个案例由于原url链接变化已导致失效,是以在原课程示例代码的基础上自行修改,以实现功能。不废话,url:https://www.shanghairanking.cn/rankings/bcur/201611代码:import requests
from bs4 import BeautifulSoup
import bs4
import pandas as pd
def getHTMLText(url):
try:
r = requests.get(url)
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('div')
td = tr('td')
ulist.append(.string,tds[-1].string[:-13],td[-2].string])
def main():
uinfo = []
url = "https://www.shanghairanking.cn/rankings/bcur/201611"
html = getHTMLText(url)
fillUnivList(uinfo,html)
df = pd.DataFrame(uinfo, columns=["排名", "学校名称", "总分"])
writer = pd.ExcelWriter('C:/Users/Lenovo/Desktop/university_ranking.xlsx', engine='xlsxwriter')
df.to_excel(writer, index=False)
writer.close()
print('已将数据保存到指定路径的Excel文件中')
main()
自己运行的时候记得修改路径,在main函数witer = pd.ExcelWriter("……")那一行,我运行得到的结果如下(貌似没法上传xlsx附件?):
代码本身是正确的,只是填充数据的时候有一些小问题。根据你给出的代码,我稍微修改了一下可以得到正确的结果。
首先,修改 `fillUnivList` 函数,将取值的方式修改为 `.text` 而不是 `.string`。
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('div')
td = tr('td')
ulist.append(.text, tds.text, td.text])
然后,修改 `pd.DataFrame` 生成 DataFrame 时的列名,目前写成了空的,修改为 `['排名', '学校名称', '总分']`。
df = pd.DataFrame(uinfo, columns=['排名', '学校名称', '总分'])
最后,将 `.to_excel` 的路径改为自己本地合适的路径即可。代码运行后会在指定路径生成一个 `university_ranking.xlsx` 文件。
注:由于数据量较大,可能要等待一段时间才能成功保存。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 支持! 学习编程中的Ben 发表于 2024-2-19 17:38
支持!
{:10_254:}{:10_275:} 支持 {:10_256:}{:10_256:}{:10_256:}有意思,如何爬取公网上最新的大学数据也是有趣的课题
页:
[1]