爬取对象 url = http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html
工具:python3.6 IDLE
程序总体上也是分为三步:一、requests.get()获取url信息,并返回r.text;二、用BeautifulSoup解析r.text内容,后去标签中的信息,将爬取到的类似于 “大学名称”、“省份”、“排名”等信息用存入 ulist 列表中;三、对存入ulist列表中的信息进行:打印、输出、保存等进一步详细的操作。
附上程序所有代码:(同样生成了.exe程序文件)
import requests
from bs4 import BeautifulSoup
import bs4
import os
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): #如果tr标签不是bs4库定义的Tag类型将过滤掉
tds = tr('td') #将所有的td标签存为一个列表类型tds
ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string])
def printUnivList(ulist, num, province):
root = "F://pics//"
tplt = "{0:^4}\t{1:{5}^10}\t{2:{5}^6}\t{3:^4}\t{4:^16}"
print(tplt.format("排名", "学校名称", "省市", "总分", "新生高考成绩得分", chr(12288)))
if not os.path.exists(root):
os.mkdir(root)
with open('F://pics//university_infos.txt', 'a', encoding = 'utf-8') as f:
f.write(tplt.format("排名", "学校名称", "省市", "总分", "新生高考成绩得分", chr(12288)) + '\n')
f.close()
for i in range(num):
u = ulist[i]
p = province[0:2] #获取省份的前两个字符
if p in u[2]:
print(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)))
with open('F://pics//university_infos.txt', 'a', encoding = 'utf-8') as f:
f.write(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)) + '\n')
f.close()
elif province in ["所有"]:
print(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)))
with open('F://pics//university_infos.txt', 'a', encoding = 'utf-8') as f:
f.write(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)) + '\n')
f.close()
def check(inputchar):
a = ['北京市', '天津市', '上海市', '江苏省', '浙江省', '安徽省', '福建省', '江西省', '湖南省',\
'山东省', '河南省', '内蒙古自治区', '湖北省', '宁夏回族自治区', '新疆维吾尔自治区', \
'广东省', '海南省', '四川省','西藏自治区', '广西壮族自治区', '河北省', '贵州省', \
'重庆省', '陕西省', '山西省', '云南省', '辽宁省','吉林省', '甘肃省', '黑龙江省', '青海省'\
'北京', '天津', '上海', '江苏', '浙江', '安徽', '福建', '江西', '湖南',\
'山东', '河南', '内蒙古', '湖北', '宁夏', '新疆', \
'广东', '海南', '四川','西藏', '广西', '河北', '贵州', \
'重庆', '陕西', '山西', '云南', '辽宁','吉林', '甘肃', '黑龙江', '青海','所有']
if inputchar[0:2] in a:
main(inputchar[0:2])
else:
cha = input("请正确输入省/市: ")
check(cha)
def main(province):
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 600, province)
while True:
comd = input("是否继续检索(是/否):")
if comd in ["是"]:
str_province = input("请输入需要查询的'省份或所有':")
check(str_province)
else:
break
if __name__ == '__main__':
print('爬取《最好大学网》2018大学排名,输出信息,保存到F:/pics/university_infos.txt')
str_province = input("请输入需要查询的'省份或所有':")
check(str_province)
check函数主要是用来检验 输入的信息是否符合要求,自己觉得代码写的太繁琐,以后养成好习惯,慢慢完善。