断断续续学了一旦python的语法,然而一不用就又丢了。没办法就只能找点事来练练手,爬虫似乎比较简单(小白,勿喷),就试试呗。
一、首先说明一下:
时间:2022-02-10,时间关系到网站能否(爬虫)访问,以及一些库的版本。
开发环境:win10 64位系统,IDE pycharm PyCharm 2019.3.3 (Professional Edition)
python版本:Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32
二、访问的网页
https://www.shanghairanking.cn/rankings/bcur/2021
三、抄袭的代码
哈哈哈,代码是跟着某个视频做的。但是还是有部分改动。
import requests
from bs4 import BeautifulSoup
import re
def getHtmlText(url):
try:
r = requests.get(url)
r.raise_for_status() # 网页打开失败,触发异常
r.encoding = r.apparent_encoding
return r.text
except:
return "网页打开失败"
def getInfoFromHtml(uLIst,html):
soup = BeautifulSoup(html,"html.parser")
param = re.compile(r"\d{1,3}")
param1 = re.compile(r"\d{1,3}.\d?")
for child in soup.tbody.children: # 网页源码中有tbody标签
tds = child('td')
uLIst.append([param.findall(tds[0].string)[0], child.img.attrs["alt"], param1.findall(tds[4].string)[0]])
# print(uLIst)
def printList(List,num=20):
print("{:^10}\t{:^10}\t{:^10}".format("排名","学校名称","综合总分"))
for i in range(num):
itm = List[i]
print("{:^10}\t{:^10}\t{:^10}".format(itm[0],itm[1],itm[2]))
if __name__ == '__main__':
infoList = []
try:
fp = open("url_save",mode="r",encoding="utf-8") # 尝试去打开文件,打开失败就重新下载
html = fp.read() # 全部读出来
if len(html) < 1000: # if 不需要使用括号,读取的内容小于1000个字节,也是重新下载
raise() # 人为触发异常
except: # 文件打开失败的时候,就触发重新爬取一次
print("文件打开失败,下载网页")
url = "https://www.shanghairanking.cn/rankings/bcur/2021"
html = getHtmlText(url)
# print(len(html))
fp = open("url_save", mode="w", encoding="utf-8") # 把爬取的内容写到文件中,供下一次运行使用
fp.write(html)
fp.close()
if len(html) > 1000:
getInfoFromHtml(infoList, html)
printList(infoList,25)
else:
print("文件内容小于1000个字节,不做解析处理")
这里我增加了一个文件操作,就是把爬下来的网页放在文件中,这样我调试的时候,就不用老是去网站爬取网页了,避免被限制访问。
如果需要重新下载,删除掉缓存文件就好了。