Python——beautiful,requests,歌单(多线程)

2023-11-15

目录

一、定义三个函数方便之后调用

1.由url获取soup函数

2.传入soup,进具体信息进行解析

3.由图片链接保存到本地

二、生产-消费主模块(精华部分)

1.获取一个分类下的所有歌单的id,相当于生产者

2.对每个id,获取歌单的详细信息,相当于消费者

三、主要代码展示

一、定义三个函数方便之后调用

1.由url获取soup函数

2.传入soup,进具体信息进行解析

3.由图片链接保存到本地

def get_soup(url):
    '''传入url,得到soup库解析后的结果'''
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    return soup

def parsing_information(ids,soup,count):
    '''传入上一节的解析内容,对具体信息进行解析'''
    # 获取歌单标题,替换英文分割符
    title = ids[count]['title'].replace(',', ',')
    # 获取歌单id
    id = ids[count]['href']
    #获取创建者昵称
    nickname = soup.select('.s-fc7')[0].get_text()
    #获取介绍
    description = soup.select('p')[1].get_text()
    #获取歌曲数量
    song_num = soup.select('span span')[0].get_text()
    #获取播放量
    play_num = soup.select('strong')[0].get_text() 
    #获取分享次数
    share_num = soup.select('a i')[2].get_text()    
    #获取评论次数
    comment_num = soup.select('a i')[4].get_text()  #评论次数
    list1 = [title,id,nickname,description,song_num,play_num,share_num,comment_num]
    return list1
    
def save_picture(soup):
    '''这是一个传入soup,保存照片到路径的函数'''
    lis = soup.select('#m-playlist')
    img_url = lis[0].select('.j-img')[0]['data-src']
    img = requests.get(url=img_url)
    name_id = str(random.random())
    if os.path.exists(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id) == False:
        os.mkdir(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片' + name_id)
    f = open('E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id +  + ".jpg", "wb")
    f.write(img.content)
    f.close()

二、生产-消费主模块(精华部分)

1.获取一个分类下的所有歌单的id,相当于生产者

传入的q是多线程中使用的队列,函数末尾使用put()函数传入

def producer(q,url):  
    soup = get_soup(url)
    # 获取包含歌单详情页网址的标签
    #对dec a的class进行选择
    ids = soup.select('.dec a')
    q.put(ids)  

2.对每个id,获取歌单的详细信息,相当于消费者

def consumer(q):
    row_topname = ['歌曲标题','id','昵称','简介','歌曲数量','播放量','分享次数','评论次数']
    file = open('playlist.csv', 'w', encoding='utf-8')
    csv_writer = csv.writer(file)  #csv格式写入文件file
    csv_writer.writerow(row_topname)
    ids = q.get()
    count = 0
    for id in ids:
        url = 'https://music.163.com/' + id['href']  #生产者传递的id链接
        soup = get_soup(url)
        #使用自定义的解析函数,返回信息列表
        list1 = parsing_information(ids, soup, count)
        #使用自定义的图片保存函数
        save_picture(soup)
        #写入信息进csv文件
        csv_writer.writerow(list1)
        count = count + 1  #计数器
    file.close()

三、主要代码展示

def get_soup(url):
    '''传入url,得到soup库解析后的结果'''
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    return soup

def parsing_information(ids,soup,count):
    '''传入上一节的解析内容,对具体信息进行解析'''
    # 获取歌单标题,替换英文分割符
    title = ids[count]['title'].replace(',', ',')
    # 获取歌单id
    id = ids[count]['href']
    #获取创建者昵称
    nickname = soup.select('.s-fc7')[0].get_text()
    #获取介绍
    description = soup.select('p')[1].get_text()
    #获取歌曲数量
    song_num = soup.select('span span')[0].get_text()
    #获取播放量
    play_num = soup.select('strong')[0].get_text() 
    #获取分享次数
    share_num = soup.select('a i')[2].get_text()    
    #获取评论次数
    comment_num = soup.select('a i')[4].get_text()  #评论次数
    list1 = [title,id,nickname,description,song_num,play_num,share_num,comment_num]
    return list1
    
def save_picture(soup):
    '''这是一个传入soup,保存照片到路径的函数'''
    lis = soup.select('#m-playlist')
    img_url = lis[0].select('.j-img')[0]['data-src']
    img = requests.get(url=img_url)
    name_id = str(random.random())
    if os.path.exists(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id) == False:
        os.mkdir(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片' + name_id)
    f = open('E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id +  + ".jpg", "wb")
    f.write(img.content)
    f.close()

def producer(q,url):  
    soup = get_soup(url)
    # 获取包含歌单详情页网址的标签
    #对dec a的class进行选择
    ids = soup.select('.dec a')
    q.put(ids)  

def consumer(q):
    row_topname = ['歌曲标题','id','昵称','简介','歌曲数量','播放量','分享次数','评论次数']
    file = open('playlist.csv', 'w', encoding='utf-8')
    csv_writer = csv.writer(file)  #csv格式写入文件file
    csv_writer.writerow(row_topname)
    ids = q.get()
    count = 0
    for id in ids:
        url = 'https://music.163.com/' + id['href']  #生产者传递的id链接
        soup = get_soup(url)
        #使用自定义的解析函数,返回信息列表
        list1 = parsing_information(ids, soup, count)
        #使用自定义的图片保存函数
        save_picture(soup)
        #写入信息进csv文件
        csv_writer.writerow(list1)
        count = count + 1  #计数器
    file.close()
if __name__ == '__main__':
    url_list = []
    plist,clist = [],[]
    q = Queue()
    for n in range(0,1355,35):
        url = f'https://music.163.com/discover/playlist/?order=hot&cat=%E8%AF%B4%E5%94%B1&limit=35&offset={n}'
        url_list.append(url)
    for url in url_list:
        p = Thread(target=producer,args=(q,url,))
        plist.append(p)
    for p in plist:  
        p.start()
    for t in plist:
        p.join()
    for i in range(100): 
        c = Thread(target=consumer,args=(q,))
        clist.append(c)
    for c in clist:  #启动线程
        c.start()
    for c in clist:
        q.put(None)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python——beautiful,requests,歌单(多线程) 的相关文章

随机推荐

  • 【C++】类的小练习

    目录 基本知识 例题1 正方体 完整代码 不足 例题2 点与圆 要点 完整代码 头文件point h 源文件 基本知识 class 类名 访问权限 属性 参数 行为 函数 注 类中的属性和行为统称为成员 属性 也称 成员属性 成员变量 行为
  • Binder机制详解(三)

    系列目录 Binder机制详解 一 Binder机制详解 二 文章目录 前言 一 Binder机制理解 二 应用层 1 Linux下的进程通信 2 binder通信 3 stub 4 流程总结 三 native层 1 Binder基于mma
  • 【计算机视觉

    文章目录 一 分割 语义相关 18篇 1 1 TomatoDIFF On plant Tomato Segmentation with Denoising Diffusion Models 1 2 CGAM Click Guided Att
  • k8s跨namespace复制pvc方式之一

    前言 今天发现小伙伴把mysql的pod部署到了default命名空间下 而且已经用了好久 而恰巧我们清理k8s空间 就把他pod删了 小伙伴很恼火 哈哈哈哈 default命名空间禁止部署业务pod 幸好pvc还在 那如何把default
  • 如何用 Github Pages 免费部署静态站点

    最低成本部署静态网站 所谓静态网站 是指它所有内容都是静态的 即预先编写好并存储在服务器上 访问者获取到的是事先准备好的静态文件 所以完全不需要购买服务器 除了域名之外 几乎不会有其他花销 我在构建五个静态站点的过程中 积累了大量经验 本篇
  • sql uniqueidentifier转换成varchar 数据类型

    塗聚文 Geovin Du DECLARE myid uniqueidentifier SET myid NEWID SELECT CONVERT char 255 myid AS char GO 塗聚文 Geovin Du declare
  • css背景图片和背景颜色一起显示

    如果需要在一个元素中既要显示背景图片也要显示背景颜色 我们都知道背景图片可以使用background image url 来指定 也可以省略image 但是如果我们既显示背景图片又要显示背景颜色 那么我们可以将background url
  • 使用grep 过滤logcat输出

    转自 http www xmumu com post 2012 02 15 15478732 如何过滤 adb logcat 输出 简介 本文介绍如何在shell 命令行中过滤 adb logcat 输出的几个小技巧 开发当中经常看到别人的
  • 自定义busybox文件系统存在的问题

    1 串口终端看不到命令行入口 只能在显示器端HDMI 看到 2 内核默认无法加载除了busybox openwrt文件系统 debian ubuntu无法加载
  • 缓冲转换流

    只用字符流时可能出现乱码 而转换流可以解决这个问题 再加上缓冲流又可以提高效率 import java io BufferedReader import java io BufferedWriter import java io FileI
  • C++&QT-day5

    作业 多重继承 1 定义一个学生类 Student 私有成员属性 姓名 年龄 分数 成员方法 无参构造 有参构造 析构函数 show函数 2 再定义一个党员类 Party 私有成员属性 党组织活动 组织 成员方法 无参构造 有参构造 析构函
  • python封装一个logging模块,可以直接使用

    记录下遇到的问题以及解决方法 日志等级 等级 等级代码 翻译 NOTSET 0 未设置 DEBUG 10 调试 INFO 20 信息 WARNING 30 警告 WARN 30 警告 ERROR 40 错误 CRITICAL 50 至关重要
  • 【论文阅读】Multimodal Fusion with Co-Attention Networks for Fake News Detection --- 虚假新闻检测,多模态融合

    本博客系本人理解该论文之后所写 非逐句翻译 预知该论文详情 请参阅论文原文 论文标题 Multimodal Fusion with Co Attention Networks for Fake News Detection 作者 Yang
  • 学深度学习可以做什么?可以从事什么工作?

    学习深度学习可以让您涉足人工智能领域的前沿 为各种领域带来巨大的创新和改进机会 深度学习的核心思想是通过多层神经网络模拟人类大脑的工作方式 从而实现对复杂数据的高级处理和理解 这为以下方面的应用提供了广泛的可能性 学深度学习可以做什么 首先
  • 分布式爬虫学习笔记

    安装python 虚拟环境 将使用python2 3的项目分开 1 安装virtualenvcmd cmd命令 pip install virtualenv 2 因为下载开发包很慢 所以下载开发包的第三方镜像 python豆瓣源 百度 安装
  • 精品,全网最详细-软件测试技术自动化测试总结,最屌详解看了默默卷起来

    目录 导读 一 自动化测试 二 自动化测试的意义 三 手工测试的局限性 四 自动化测试带来的好处 五 自动化测试的前提条件 1 需求变动不频繁 2 项目周期足够长 3 自动化测试脚本可重复使用 4 手工测试无法完成 六 自动化测试的方法 七
  • 使用Python编写一个多线程的12306抢票程序

    国庆长假即将到来 大家纷纷计划着自己的旅行行程 然而 对于很多人来说 抢购火车票人们成了一个令人头疼的问题 12306网站的服务器经常因为流量高而崩溃 导致抢票变得越来越严重异常困难 首先 让我们来了解一下12306抢票的难点 由于很多人都
  • 程序员的职级和薪酬体系

    今天我们要讨论一个程序员都关心的话题 学了程序到底能赚多少钱 老有人问学程序到底有没有前途 我应该是学前端呢 还是应该学大数据 程序员百万年薪到底有多难 其实 这些问题抛开兴趣的本质都在问一个问题 当了程序员能赚多少钱 我相信广大程序员的力
  • MYSQL lag()和lead()函数用法

    这两个函数是偏移量函数 可以查出一个字段的前面N个值或者后面N个值 配合over来使用 下面举例说明 新建表格如下 drop table if exists exam record CREATE TABLE exam record id i
  • Python——beautiful,requests,歌单(多线程)

    目录 一 定义三个函数方便之后调用 1 由url获取soup函数 2 传入soup 进具体信息进行解析 3 由图片链接保存到本地 二 生产 消费主模块 精华部分 1 获取一个分类下的所有歌单的id 相当于生产者 2 对每个id 获取歌单的详