这两天学习了中国大学:https://www.icourse163.org,实例6 中国大学排名,于是操作了下,由于嵩天老师提供的网页目前已经发生变化,给一起学习的小伙伴带来些困扰,按照老师教授的知识,我突发奇想,可不可以用所学知识将实例中“最好大学”最新网页上的图片爬取下来呢?答案是可以的,以下为我的实践输出,还希望各位大佬互相学习。如有不明白的地方,可留言私信,
#将网站上的图片资源获取下来(单个网页上所有图片获取下来,并修改文件名称)
#
import os
import requests
import bs4
from bs4 import BeautifulSoup
import re
#获取目标文本【爬取网页通用代码框架】,所需参数url为主函数提供
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "获取网页文本失败"
#自定义函数,设定传入参数,参数从getHTMLText(url)方法运算后的结果赋予的变量-demo,解析网页并遍历所需标签,提取所需内容后返回给主函数变量供其他模块函数调用
def jiexi(ulist,demo,url1,schoolname):
soup = BeautifulSoup(demo,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag): #这个地方是判断是否为Tag标签,如果不是则舍弃
tds = tr('td') #将td标签内容加入tds列表中,以上为遍历<tbody>儿子标签内容,并赋予一个变量tds
for tag in tds[1].find_all(re.compile('img')): #正则表达式、find_all函数、for循环一次,匹配变量tds[1]中所有'img'标签,一旦匹配成功,如下:
url1.append(tag.get('src')) #则使用主函数main()中传入的空列表[]url1和append的函数;get()函数用于解析'img'标签,提取'src'后的链接内容
for schnam in tds[1].find_all(re.compile('a')): #正则表达式、find_all函数、匹配变量tds[1]中所有'a'标签,一旦匹配成功,如下:
schoolname.append(schnam.string) #则使用主函数main()中传入的空列表[]schoolname和append的函数 ;标签.string 用于提取标签内非属性字符串
#自定义函数,设定传入参数:url1,schoolname,其参数从jiexi()函数中运算得来,再次运算,该函数也引用了【网络图片存储通用代码框架】
def download(url1,schoolname):
root = "D://pics2//"
path = ""
for i in url1:
#ss = ''.join(i) #由于url1中的元素为列表类型,需转换成字符成类型方可进一步操作,其实不需要,只要将url1.append([tag.get('src')]) 中[]去掉即可,pass
path = root + schoolname[url1.index(i)*2] + ".png" #文件路径、名称
#print(path) 调试用,pass
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(i)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print('文件保存成功')
else:
print('文件已存在')
except:
print('爬取失败')
def main():
url = 'https://www.shanghairanking.cn/rankings/bcur/2020'
demo = getHTMLText(url)
ulist = []
url1 = []
schoolname = []
jiexi(ulist,demo,url1,schoolname)
download(url1,schoolname)
main()
最终效果: