刚刚入门学爬虫,学习mooc上嵩天老师的爬取大学排名,练习了一下爬取最好大学网
源码如上图所示
从上面源码可以看出每一个大学的信息都是用tr标签的保存的其中排名为奇数的大学class=alt,排名为偶数的大学为class = alt2,可以考虑使用beautifulsoup库的正则表达式用法把它们都提取出来。
trL = soup.find_all("tr",class_=re.compile(r"alt.*"))
又因为tr标签内的前5个标签是排名,学校,国家图片,地区排名,总分。
为了获取国家缩写使用字符串的切片把国家名字切出来。后面6个标签是相关的分数。它们结构都比较整齐,用列表把他们都存下来。
world_rank = m[0].get_text()
name = m[1].get_text()
country = m[2].img.get("src")
country = country.split('/')[-1].split('.')[0]
place_rank = m[3].get_text()
total_score = m[4].get_text()
for i in range(6):
#index =m[5+i].get("class")[-1]
scoreL.append(m[5+i].get_text())
最后通过循环把前1000名的学校都爬取下来,并用pandas保存
# -*- coding: utf-8 -*-
#爬取世界大学排名
import requests as rq
from bs4 import BeautifulSoup
import re
import pandas as pd
def getHTMLText(url):
try:
html = rq.get(url,timeout=30)
html.raise_for_status()
html.encoding = html.apparent_encoding
return html.text
except:
return " "
def getun(num,data,trL):
scoreL =[]
m = list(trL[num].children)
world_rank = m[0].get_text()
name = m[1].get_text()
country = m[2].img.get("src")
country = country.split('/')[-1].split('.')[0]
place_rank = m[3].get_text()
total_score = m[4].get_text()
for i in range(6):
#index =m[5+i].get("class")[-1]
scoreL.append(m[5+i].get_text())
data.append([world_rank,name,country,place_rank,total_score,scoreL])
#print([world_rank,name,country,place_rank,total_score,scoreL])
def getdata(html,data):
soup = BeautifulSoup(html,"html.parser")
trL = soup.find_all("tr",class_=re.compile(r"alt.*"))
for num in range(len(trL)):
getun(num,data,trL)
return data
if __name__=="__main__":
url = "http://www.zuihaodaxue.com/ARWU2019.html"
data = [["排名",'学校','国家','地区排名','总分','[alumi,award,hici,ns,pub,pcp]']]
html = getHTMLText(url)
getdata(html,data)
df = pd.DataFrame(data)
df.to_excel('世界大学排名.xlsx',header=False,index=False)
print("世界大学排名爬取完成")
Python网络爬虫与信息提取;
BeautifulSoup中文官网