20211122唐嘉浩 2021-2022-2《python程序设计》 实验四 Python综合实践

项目实践名称:爬取并下载网易云歌曲

项目要求:

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

批阅:注意本次实验不算做实验总分,前三个实验每个实验10分,累计30分。本次实践算入综合实践,打分为25分。
评分标准:
(1)程序能运行,功丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分

(4)如果没有使用华为云服务(ECS或者MindSpore均可),本次实践扣10分。

实验分析及设计过程

1.抓取网页URL和元素地址:

edge浏览器:

 

 Google浏览器:

 

 个人角度讲Google浏览器很明显在元素抓取这方面比edge好得多,至少不会像edge一样元素腰斩。

2.网页外链的获取:

  • 现在已经知道下载链接是这样的:
  • http://music.163.com/song/media/outer/url?id='
  • 我能够找到的爬虫链接是这样的:
    #歌曲清单
    music_list = 'https://music.163.com/#/playlist?id=2412826586' 
    #歌手排行榜
    artist_list = 'https://music.163.com/#/artist?id=8325'
    #搜索列表 
    search_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹'(但有一说一,最开始找链接人都麻了,后来查了资料,参考链接如下:如何获取网易云音乐播放外链 - 知乎 (zhihu.com)
  • 爬虫代码:
  • 1:涉及到的模板:
    • requests:专业用于请求处理,requests库学习文档中文版
    • lxml:其实可以用python自带的正则表达式库re,但是为了更加简单入门,用 lxml 中的 etree 进行网页数据定位爬取。
    • re:python正则表达式处理
    • json:python的json处理库
      (因为课上没有跟上王老师,又忘记了云班课上有视频回放,导致了我重新一个个看了一遍这几个怎么用:
    • 对应的学习链接:(10条消息) Python(爬虫篇)---Requests模块_Zachary579的博客-CSDN博客
    • (10条消息) Python-- lxml用法_ydw_ydw的博客-CSDN博客_lxml python
    • (10条消息) python中re模块的用法_yjj20007665的博客-CSDN博客_python中re
    • (10条消息) Json和JS模板的使用_小蚂蚁有力量的博客-CSDN博客_json和js
      (离谱的是,最开始没用反应过来etree是lxml的一个模板,然后我看着代码上的bug陷入了沉思。。。。。还好CSDN确实给力)
      2:对字符串进行去空格和转协议处理:
      url = url.replace('/#', '').replace('https', 'http')
      3:请求头和页面源码:
    • res = requests.get(url=url, headers=headers).text
    • headers = {
              'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
              'Referer': 'https://music.163.com/',
              'Host': 'music.163.com'(我隐约记得王老师上课讲过,但是啥还是得重新学。。。。。)
    • 整个代码:
    • import os
      import re
      import json
      import requests
      from lxml import etree


      def download_songs(url=None):
      if url is None:
      url = 'https://music.163.com/#/playlist?id=2384642500'

      url = url.replace('/#', '').replace('https', 'http')
      out_link = 'http://music.163.com/song/media/outer/url?id='
      headers = {
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
      'Referer': 'https://music.163.com/',
      'Host': 'music.163.com'
      }
      res = requests.get(url=url, headers=headers).text

      tree = etree.HTML(res)
      song_list = tree.xpath('//ul[@class="f-hide"]/li/a')
      artist_name_tree = tree.xpath('//h2[@id="artist-name"]/text()')
      artist_name = str(artist_name_tree[0]) if artist_name_tree else None

      #song_list_tree = tree.xpath('//*[@id="m-playlist"]/div[1]/div/div/div[2]/div[2]/div/div[1]/table/tbody')
      song_list_name_tree = tree.xpath('//h2[contains(@class,"f-ff2")]/text()')
      song_list_name = str(song_list_name_tree[0]) if song_list_name_tree else None

      folder = './' + artist_name if artist_name else './' + song_list_name

      if not os.path.exists(folder):
      os.mkdir(folder)

      for i, s in enumerate(song_list):
      href = str(s.xpath('./@href')[0])
      song_id = href.split('=')[-1]
      src = out_link + song_id
      title = str(s.xpath('./text()')[0])
      filename = title + '.mp3'
      filepath = folder + '/' + filename
      print('开始下载第{}首音乐:{}\n'.format(i + 1, filename))

      try:
      #download_lyric(title, song_id)

      data = requests.get(src).content

      with open(filepath, 'wb') as f:
      f.write(data)
      except Exception as e:
      print(e)

      print('{}首全部歌曲已经下载完毕!'.format(len(song_list)))


      def download_lyric(song_name, song_id):
      url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
      headers = {
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
      'Referer': 'https://music.163.com/',
      'Host': 'music.163.com'
      }
      res = requests.get(url=url, headers=headers).text
      json_obj = json.loads(res)
      lyric = json_obj['lrc']['lyric']
      reg = re.compile(r'\[.*\]')
      lrc_text = re.sub(reg, '', lyric).strip()

      print(song_name, lrc_text)




      if __name__ == '__main__':
      #music_list = 'https://music.163.com/#/playlist?id=2384642500'
      music_list = 'https://music.163.com/#/artist?id=8325'
      # music_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹'
      download_songs(music_list)

      3:华为云ESC服务器上PUTTY的运行截图:
    •  

       

    •  

       本地文件夹的保存截图:

    •  

       代码实验思路:

    •  

       yysy,自己写的时候,大概就是这样的情况:

    •  

       我明白我驾驭不住:于是我选择跟着教学打代码:

    • 13.网易云音乐评论爬虫举例 - Python网络爬虫实战_哔哩哔哩_bilibili
    • 20行Python代码简单爬取网易云音乐_哔哩哔哩_bilibili
    • 等等;(但是好多都用了selenium,事实上我压根没看懂,所以最后选了一个没有selenium的代码。。。。。。虽然整整100行,但是至少勉强,也许懂了)
      ·遇到的问题以及解决方法:
    • 一:无法在putty上运行python文件:
    • 解决办法:下载python,通过创建python文件用Python.文件名.py运行;
    • 二:上面的也运行不了:
    •  

       

    • 解决办法:重新下载所有运用到文件里的库,例如lxml、request、os等
      三:文件有中文python3运行不了:
    • 后来加了utf-8还是没解决,最后没办法了只能把中文给换掉了。
      四:lxml在python和python3里都没法下载,用pip也没用:
    • 参考了(10条消息) Python安装模块(包/库)的方法_Smilecoc的博客-CSDN博客_python 安装模块
    • 最后还是靠(10条消息) lxml-4.6.2.tar.gz安装报错处理(Please make sure the libxml2 and libxslt development packages are installed)_了尘自无心的博客-CSDN博客解决的。
      本学期所学内容
      • 变量赋值
      • 运算符及其优先级
      • 基本数据类型
      • 循环语句
      • 列表、元组、字典、集合
      • 字符串与正则表达式
      • 函数
      • 面向对象程序设计
      • 文件操作及异常处理
      • Python操作数据库
      • Python爬虫
        对于python的理解:
      • 总的而言python相对于C语言确实具有非常强大的容错率和简便性。好多库以及网上的很多资源都是python用户们可以共享使用的,比如pygame这个神奇的python库。而且python编程使用的语言和逻辑体系相对于C语言来讲通俗易懂很多。
      • 其次python的运行并不依赖于二进制,可以直接通过源代码运行程序。并且可以直接移植到很多操作平台里面。
        本学期课程的感悟:
      • 我个人来讲很佩服王老师,老师的对学生的问题回答十分详细耐心,并且有给出了相关的学习视频,课堂氛围也很好。
      • 但个人来讲很难受的一点,因为是密码专业导致导论课一些相关的基础完全没有,跟课的时候好多理论基础的都是都是一头雾水,并且打代码跟不上是最难受的,很多课下来自己电脑上的代码都是东拼西凑,有时候低头敲了一个代码,抬头就不知道老师在讲啥了,这不是老师的问题,但我希望老师能不能适当慢一点,敲代码跟不上是真的绝望。
      • 但是总的来讲,我很喜欢这门课的老师,也很喜欢python。
      • 人生苦短,我用python(手动滑稽)

 

posted @ 2022-05-29 22:40  天问—九章  阅读(156)  评论(0编辑  收藏  举报