IT帮

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 21|回复: 0

用爬虫抓取网易云好听的歌曲

[复制链接]

35

主题

41

帖子

48

积分

小学生

Rank: 1

热心值
2
IT币
229
贡献值
1
QQ
发表于 2021-9-8 16:23:29 | 显示全部楼层 |阅读模式
最近,网易云音乐积极响应反垄断政策,取消了音乐的“独家”标签,然后很多好的音乐都听不到了。刚好小编最近学了很多爬虫的教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊!
首先我们要需要找到歌曲的id,如果你只是想下载一首歌,比如静茹-勇气,那就没有必要爬虫,但是需要注意的是,网易返回的链接,数据是js动态加载,也就是爬虫得到的网页数据和浏览器得到的dom内容和结构不一样,其中,搜索列表爬虫回来的内容,完全得不到歌曲id。那遇到这样的情况要怎么解决呢?
解决方法就是使用使用selenium无头浏览器,如果我们需要大量获取数据,就一定要挂上代理,这是爬虫必备的工作。用python,就一定要简单,我认为复杂的东西,还是尽量少做,能取巧就取巧,所以代理我们就使用最简单的动态转发方式就好了。
  1. from selenium import webdriver
  2.     import string
  3.     import zipfile

  4.     # 代理服务器(产品官网 www.16yun.cn)
  5.     proxyHost = "t.16yun.cn"
  6.     proxyPort = "31111"

  7.     # 代理验证信息
  8.     proxyUser = "username"
  9.     proxyPass = "password"

  10.     def create_proxy_auth_extension(proxy_host, proxy_port,
  11.                                    proxy_username, proxy_password,
  12.                                    scheme='http', plugin_path=None):
  13.         if plugin_path is None:
  14.             plugin_path = r'D:/{}_{}@t.16yun.zip'.format(proxy_username, proxy_password)

  15.         manifest_json = """
  16.         {
  17.             "version": "1.0.0",
  18.             "manifest_version": 2,
  19.             "name": "16YUN Proxy",
  20.             "permissions": [
  21.                 "proxy",
  22.                 "tabs",
  23.                 "unlimitedStorage",
  24.                 "storage",
  25.                 "",
  26.                 "webRequest",
  27.                 "webRequestBlocking"
  28.             ],
  29.             "background": {
  30.                 "scripts": ["background.js"]
  31.             },
  32.             "minimum_chrome_version":"22.0.0"
  33.         }
  34.         """

  35.         background_js = string.Template(
  36.             """
  37.             var config = {
  38.                 mode: "fixed_servers",
  39.                 rules: {
  40.                     singleProxy: {
  41.                         scheme: "${scheme}",
  42.                         host: "${host}",
  43.                         port: parseInt(${port})
  44.                     },
  45.                     bypassList: ["foobar.com"]
  46.                 }
  47.               };

  48.             chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

  49.             function callbackFn(details) {
  50.                 return {
  51.                     authCredentials: {
  52.                         username: "${username}",
  53.                         password: "${password}"
  54.                     }
  55.                 };
  56.             }

  57.             chrome.webRequest.onAuthRequired.addListener(
  58.                 callbackFn,
  59.                 {urls: [""]},
  60.                 ['blocking']
  61.             );
  62.             """
  63.         ).substitute(
  64.             host=proxy_host,
  65.             port=proxy_port,
  66.             username=proxy_username,
  67.             password=proxy_password,
  68.             scheme=scheme,
  69.         )

  70.         with zipfile.ZipFile(plugin_path, 'w') as zp:
  71.             zp.writestr("manifest.json", manifest_json)
  72.             zp.writestr("background.js", background_js)

  73.         return plugin_path

  74.     proxy_auth_plugin_path = create_proxy_auth_extension(
  75.         proxy_host=proxyHost,
  76.         proxy_port=proxyPort,
  77.         proxy_username=proxyUser,
  78.         proxy_password=proxyPass)

  79.     option = webdriver.ChromeOptions()

  80.     option.add_argument("--start-maximized")

  81.     # 如报错 chrome-extensions
  82.     # option.add_argument("--disable-extensions")

  83.     option.add_extension(proxy_auth_plugin_path)

  84.     # 关闭webdriver的一些标志
  85.     # option.add_experimental_option('excludeSwitches', ['enable-automation'])        

  86.     driver = webdriver.Chrome(chrome_options=option)

  87.     # 修改webdriver get属性
  88.     # script = '''
  89.     # Object.defineProperty(navigator, 'webdriver', {
  90.     # get: () => undefined
  91.     # })
  92.     # '''
  93.     # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})     



  94.     driver.get("https://music.163.com/#/song?id=557581284")
复制代码



ITbang.Net是一个IT教程分享社区!

寻找论坛资源请善用论坛搜索功能,这样会为你节约不少学习时间;

论坛资源如有过期链接失效等,请到教程反馈区发帖反馈,我们会为您良好的行为点赞加分!

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
IT帮论坛所发布的一切视频资源、工具软件和网络技术相关的文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该资源,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:Service@ITbang.Net

QQ|Archiver|手机版|小黑屋|IT帮社区 ( 冀ICP备19002104号-2 )

GMT+8, 2021-9-19 21:05 , Processed in 0.058386 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表