爬虫爬取千千音乐榜单音乐

最近做了一个爬取千千音乐的demo,免去下载歌曲还要下载对应客户端的麻烦,刚开始接触爬虫,可能写的不太好,求别喷!话不多说,进入正题

1.获取主页信息(获取各个榜单的url)

这里想要说的就是关于千千音乐的登录问题,可能是我在浏览器其他地方登录了百度账号,导致点击退出之后它就会自动又登录上,本来想通过代码登录获取cookie等登录信息的,我也懒得清除缓存了,

索性直接从抓包工具中把请求头全部复制过来,稍微修改一下

# 获取主页
def gethomepage():
    # 创建会话
    s = requests.Session()
    home_url = ‘http://music.taihe.com/‘
    headers ={
        ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3‘,
        ‘Accept-Language‘:‘zh-CN,zh;q=0.9‘,
        ‘Cache-Control‘:‘max-age=0‘,
        ‘Connection‘:‘keep-alive‘,
        ‘Cookie‘:‘log_sid=1561218778562E9DB28E6A3CDA8ED552F27E3703A9AB4; BAIDUID=E9DB28E6A3CDA8ED552F27E3703A9AB4:FG=1; BDUSS=3AtOE5xTDJnOTBGb2h6UXVYVnZxTEl-Z2VKc0w2V0kyUVV6MmticWxmaHdlVEZkSUFBQUFBJCQAAAAAAAAAAAEAAADQRIc5uqO~3cqvwMMzNjUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDsCV1w7Aldc; flash_tip_pop=true; tracesrc=-1%7C%7C-1; u_lo=0; u_id=; u_t=; u_login=1; userid=965166288; app_vip=show; Hm_lvt_d0ad46e4afeacf34cd12de4c9b553aa6=1561206432,1561209820; __qianqian_pop_tt=8; Hm_lpvt_d0ad46e4afeacf34cd12de4c9b553aa6=1561218967‘,
        # ‘Host‘:‘music.taihe.com‘,
        ‘Referer‘:‘http://music.taihe.com/‘,
        ‘Upgrade-Insecure-Requests‘:‘1‘,
        ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36‘,
    }
    r = s.get(home_url,headers = headers)
    soup = BeautifulSoup(r.text, ‘lxml‘)

    # 获取新歌榜 热榜 网络歌曲榜的url
    list_m = soup.findAll(‘h4‘, class_=‘more-rank‘)
    for h in list_m:
        bd_url = h.find(‘a‘)[‘href‘]
        title = h.find(‘a‘)[‘title‘]
        entitle = h.find(‘a‘)[‘href‘].split(‘/‘)[-1]
        bd_url = ‘http://music.taihe.com‘ + bd_url
        gotolist(bd_url, headers, s, title, entitle)

2.获取每个榜单中的每首歌曲的id

# 获取各个榜单的歌曲id,并拼接成以逗号隔开的字符串
def gotolist(bd_url, headers, s, title, entitle):
    r = s.get(bd_url, headers = headers)
    r.encoding=‘utf8‘
    soup = BeautifulSoup(r.text, ‘lxml‘)
    m_list = soup.select(‘.song-item‘)
    m_num_list = ‘‘
    for m_num in m_list:
        soup = BeautifulSoup(str(m_num), ‘lxml‘)
        text = soup.find(‘span‘, class_=‘song-title‘).find(‘a‘)[‘href‘]
        m_num_list += text.split(‘/‘)[-1] + ‘,‘
    getjson(m_num_list.strip(‘,‘), title, entitle)

3.根据歌曲id获取每首歌曲的基本信息

json_url = ‘http://play.taihe.com/data/music/songlink‘
    formdata = {
        ‘songIds‘: num,
        ‘hq‘: ‘0‘,
        ‘type‘: ‘m4a,mp3‘,
        ‘rate‘: ‘‘,
        ‘pt‘: ‘0‘,
        ‘flag‘: ‘-1‘,
        ‘s2p‘: ‘-1‘,
        ‘prerate‘: ‘-1‘,
        ‘bwt‘: ‘-1‘,
        ‘dur‘: ‘-1‘,
        ‘bat‘: ‘-1‘,
        ‘bp‘: ‘-1‘,
        ‘pos‘: ‘-1‘,
        ‘auto‘: ‘-1‘,
    }
    r = requests.post(json_url,headers = headers, data = formdata)
    # 将获取到的歌曲信息保存在一个列表中
    songlist  = json.loads(r.text)[‘data‘][‘songList‘]

4.遍历并下载歌曲

r = requests.get(music_url, timeout = 500)这行代码中的
timeout = 500得加上,数字可以按情况填写,因为我下载的时候如果不加这个参数下载到中途就会被服务器关闭连接,从而报错
  # 遍历找到歌曲的下载地址/播放地址
    for song in songlist:
        music_url = song[‘linkinfo‘][‘128‘][‘songLink‘]
        print(music_url)
        # 创建父目录
        dirname = ‘paihangbang‘
        if not os.path.exists(dirname):
           os.mkdir(dirname)

        #创建对应排行榜目录
        dirname = dirname + ‘/‘ + entitle + ‘/‘
        if not os.path.exists(dirname):
           os.mkdir(dirname)

        try:
            # 歌曲以歌曲名+歌手名进行命名
            filename = dirname + str(song[‘songName‘]) + ‘-‘ + str(song[‘artistName‘]) + ‘.mp3‘
            r = requests.get(music_url, timeout = 500)
            with open(filename, ‘wb‘) as fp:
                fp.write(r.content)
        except FileNotFoundError as e:
            print(filename + ‘未找到!‘)
        time.sleep(1)

以上就是全部的代码,下载成功后的目录使这样的

原文地址:https://www.cnblogs.com/cwhome/p/11075709.html

时间: 2024-08-13 17:56:54

爬虫爬取千千音乐榜单音乐的相关文章

【图文详解】scrapy安装与真的快速上手——爬取豆瓣9分榜单

写在开头 现在scrapy的安装教程都明显过时了,随便一搜都是要你安装一大堆的依赖,什么装python(如果别人连python都没装,为什么要学scrapy-.)wisted, zope interface,pywin32---现在scrapy的安装真的很简单的好不好! 代码我放github上了,可以参考: https://github.com/hk029/doubanbook 为什么要用scrapy 我之前讲过了requests,也用它做了点东西,([图文详解]python爬虫实战--5分钟做

使用requests爬取猫眼电影TOP100榜单

Requests是一个很方便的python网络编程库,用官方的话是"非转基因,可以安全食用".里面封装了很多的方法,避免了urllib/urllib2的繁琐. 这一节使用requests库对猫眼电影的TOP100榜进行抓取. 1 获得页面. 首先确定要爬取的url为http://maoyan.com/board/4,通过requests模块,打印出页面的信息 def get_a_page(url): try: response = requests.get(url) if respon

爬虫实战01——爬取猫眼电影top100榜单

#需求:抓取猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取的结果会以文件的形式保存下来 import requests import time from lxml import etree import json import csv import codecs class MaoYanTop100Spider: #存储电影详情页的url film_page_url_list = [] #存储每个的电影信息 #film_info = {} film_info_list = [] #

使用scrapy简易爬取豆瓣9分榜单图书

注:部分内容参考http://www.cnblogs.com/voidsky/p/5490798.html 首先创建一个项目douban9fen [email protected]:~/pachong$ scrapy startproject douban9fen New Scrapy project 'douban9fen', using template directory '/usr/local/lib/python2.7/dist-packages/scrapy/templates/pr

爬虫---Beautiful Soup 爬取知乎热榜

前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过豆瓣网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批量获取自己网站信息的一种方式.关键也在于批量. 反反爬虫机制 增加请求头---headers为了模拟更真实的用户场景 更改IP地址---网站会根据你的IP对网站访问频密,判断你是否属于爬虫 ua限制---UA是用户访问网站时候的浏览器标识,其反爬机制与ip限制类似 模拟帐号登录----通过reque

Python编写网页爬虫爬取oj上的代码信息

OJ升级,代码可能会丢失. 所以要事先备份. 一开始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启发和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 python2.7版本, 试了一下修改到3.0版本, 要做很多包的更替,感觉比较烦,所以索性就在这个2.7版本上完善了. 首先观赏一下原始代码,我给加了一些注释: # -*- coding: cp936 -*- import urllib2 import urllib import re import

用Python爬虫爬取广州大学教务系统的成绩(内网访问)

用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是"选择器"."选择器"指明了{}中的"样式"的作用对象,也就是"样式"作用于网页中的哪些元素.可参考:http://www.w3school.com.cn/cssref/css_selectors.asph

爬取百度热搜榜

1.打开网站:http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b42 2.按Ctrl+u查看网页源代码 3.招到要爬取的数据 4. import requests from bs4 import BeautifulSoup import pandas as pd url = 'http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b341_c513' headers = {'Use

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 结果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.