关于Python网络爬虫与信息提取,除了提取最好大学排名字段,还可以批量下载图片(同步学校名称)

这两天学习了中国大学: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()

最终效果:
关于Python网络爬虫与信息提取,除了提取最好大学排名字段,还可以批量下载图片(同步学校名称)

上一篇:配置node.js环境


下一篇:20201116郑良奥-实验四python综合实践