• Python——爬取歌单(含源代码)


    目录

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

    1.由url获取soup函数

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

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

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

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

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

    三、主要代码展示

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

    1.由url获取soup函数

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

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

    1. def get_soup(url):
    2. '''传入url,得到soup库解析后的结果'''
    3. response = requests.get(url)
    4. html = response.text
    5. soup = BeautifulSoup(html, 'html.parser')
    6. return soup
    7. def parsing_information(ids,soup,count):
    8. '''传入上一节的解析内容,对具体信息进行解析'''
    9. # 获取歌单标题,替换英文分割符
    10. title = ids[count]['title'].replace(',', ',')
    11. # 获取歌单id
    12. id = ids[count]['href']
    13. #获取创建者昵称
    14. nickname = soup.select('.s-fc7')[0].get_text()
    15. #获取介绍
    16. description = soup.select('p')[1].get_text()
    17. #获取歌曲数量
    18. song_num = soup.select('span span')[0].get_text()
    19. #获取播放量
    20. play_num = soup.select('strong')[0].get_text()
    21. #获取分享次数
    22. share_num = soup.select('a i')[2].get_text()
    23. #获取评论次数
    24. comment_num = soup.select('a i')[4].get_text() #评论次数
    25. list1 = [title,id,nickname,description,song_num,play_num,share_num,comment_num]
    26. return list1
    27. def save_picture(soup):
    28. '''这是一个传入soup,保存照片到路径的函数'''
    29. lis = soup.select('#m-playlist')
    30. img_url = lis[0].select('.j-img')[0]['data-src']
    31. img = requests.get(url=img_url)
    32. name_id = str(random.random())
    33. if os.path.exists(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id) == False:
    34. os.mkdir(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片' + name_id)
    35. f = open('E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id + + ".jpg", "wb")
    36. f.write(img.content)
    37. f.close()

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

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

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

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

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

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

    三、主要代码展示

    1. def get_soup(url):
    2. '''传入url,得到soup库解析后的结果'''
    3. response = requests.get(url)
    4. html = response.text
    5. soup = BeautifulSoup(html, 'html.parser')
    6. return soup
    7. def parsing_information(ids,soup,count):
    8. '''传入上一节的解析内容,对具体信息进行解析'''
    9. # 获取歌单标题,替换英文分割符
    10. title = ids[count]['title'].replace(',', ',')
    11. # 获取歌单id
    12. id = ids[count]['href']
    13. #获取创建者昵称
    14. nickname = soup.select('.s-fc7')[0].get_text()
    15. #获取介绍
    16. description = soup.select('p')[1].get_text()
    17. #获取歌曲数量
    18. song_num = soup.select('span span')[0].get_text()
    19. #获取播放量
    20. play_num = soup.select('strong')[0].get_text()
    21. #获取分享次数
    22. share_num = soup.select('a i')[2].get_text()
    23. #获取评论次数
    24. comment_num = soup.select('a i')[4].get_text() #评论次数
    25. list1 = [title,id,nickname,description,song_num,play_num,share_num,comment_num]
    26. return list1
    27. def save_picture(soup):
    28. '''这是一个传入soup,保存照片到路径的函数'''
    29. lis = soup.select('#m-playlist')
    30. img_url = lis[0].select('.j-img')[0]['data-src']
    31. img = requests.get(url=img_url)
    32. name_id = str(random.random())
    33. if os.path.exists(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id) == False:
    34. os.mkdir(r'E:/学习文件/大三上/现代程序设计/第十二次作业/图片' + name_id)
    35. f = open('E:/学习文件/大三上/现代程序设计/第十二次作业/图片/' + name_id + + ".jpg", "wb")
    36. f.write(img.content)
    37. f.close()
    38. def producer(q,url):
    39. soup = get_soup(url)
    40. # 获取包含歌单详情页网址的标签
    41. #对dec a的class进行选择
    42. ids = soup.select('.dec a')
    43. q.put(ids)
    44. def consumer(q):
    45. row_topname = ['歌曲标题','id','昵称','简介','歌曲数量','播放量','分享次数','评论次数']
    46. file = open('playlist.csv', 'w', encoding='utf-8')
    47. csv_writer = csv.writer(file) #csv格式写入文件file
    48. csv_writer.writerow(row_topname)
    49. ids = q.get()
    50. count = 0
    51. for id in ids:
    52. url = 'https://music.163.com/' + id['href'] #生产者传递的id链接
    53. soup = get_soup(url)
    54. #使用自定义的解析函数,返回信息列表
    55. list1 = parsing_information(ids, soup, count)
    56. #使用自定义的图片保存函数
    57. save_picture(soup)
    58. #写入信息进csv文件
    59. csv_writer.writerow(list1)
    60. count = count + 1 #计数器
    61. file.close()
    62. if __name__ == '__main__':
    63. url_list = []
    64. plist,clist = [],[]
    65. q = Queue()
    66. for n in range(0,1355,35):
    67. url = f'https://music.163.com/discover/playlist/?order=hot&cat=%E8%AF%B4%E5%94%B1&limit=35&offset={n}'
    68. url_list.append(url)
    69. for url in url_list:
    70. p = Thread(target=producer,args=(q,url,))
    71. plist.append(p)
    72. for p in plist:
    73. p.start()
    74. for t in plist:
    75. p.join()
    76. for i in range(100):
    77. c = Thread(target=consumer,args=(q,))
    78. clist.append(c)
    79. for c in clist: #启动线程
    80. c.start()
    81. for c in clist:
    82. q.put(None)

  • 相关阅读:
    python之pyttsx3库实现语音播报
    TIDB 性能测试(TIUP-TPCC)
    Python自动化之跨平台GUI利器PyAutoGUI
    【小程序入门】App函数注册小程序实例
    Docker镜像原理
    Qt程序打包成安装包exe
    Python使用virtualenvwrapper模块创建虚拟环境
    Flink ON YARN
    MySQL【数据处理的增删改】
    Solidity - 算术运算的截断模式(unchecked)与检查模式(checked)- 0.8.0新特性
  • 原文地址:https://blog.csdn.net/m0_56134806/article/details/128173463