使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来。

首先进行url分析,可以看到:

歌手网页:

薛之谦网页:

可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码:

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 30 14:18:33 2017 @author: 24630
""" import requests
from lxml import etree
import urllib.parse as urlparse # 获得热门的前几个有封面的歌手
def get_info_artist(url):
html = requests.get(url).text
html=etree.HTML(html)
hotlist = html.xpath('//div[@class="hot-head clearfix"]/dl/dd/a[1]/@href')
return hotlist def get_info_single(url):
html = requests.get(url).text
html=etree.HTML(html)
songlist = html.xpath('//div[@class="song-item"]//span[@class="song-title "]/a[1]/text()')
albumlist = html.xpath('//div[@class="song-item"]//span[@class="album-title"]/a[1]/text()')
downloadUrl = html.xpath('//div[@class="song-item"]//span[@class="song-title "]/a[1]/@href') #无法找到下一页的跳转连接
#next_page = //div[@class="page-inner"]/a[last()]/text()
print(len(songlist)) url = 'http://music.baidu.com/artist'
hotlist = get_info_artist(url)
#urljoin主要是拼接URL,
#它以base作为其基地址,
#然后与url中的相对地址相结合组成一个绝对URL地址。
#函数urljoin在通过为URL基地址附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用。
#需要注意的是:
#如果基地址并非以字符/结尾的话,那么URL基地址最右边部分就会被这个相对路径所替换。
#如果希望在该路径中保留末端目录,应确保URL基地址以字符/结尾。 for u in hotlist:
#获得单个歌手的链接
url_singer = urlparse.urljoin(url,u)
get_info_single(url_singer)

  可以看到,我读完一页后,想要继续进行下一页的数据的获取就没那么容易了。

有时候显示:

至于怎么获得下一页的信息:

通过上面可以分析,上面三处有数据的地方分别是点击下一页的时候产生的,可以在上面找一下。

这个时候,可以分析到:

实际上,跳转路径的动态请求隐藏在:

这样一个路径下。

因此,实际上可以构建该路径进行获取歌曲信息。

可以看到,该路径下动态请求的页面是一个json格式数据,可以通过json解析,获取其中的html源码。

代码修改为:

import requests
from lxml import etree
import urllib.parse as urlparse
import json,re,os
import sqlite3 def writeDB(song_dict):
global num
c = conn.cursor()
sql = '''insert into baiduMusic (id, songName,singer,albumname,download) values (?,?,?,?,?)'''
para = (num,song_dict['歌曲'],song_dict['歌手'],song_dict['专辑'],song_dict['下载路径'])
c.execute(sql,para)
conn.commit()
num += 1 # 获得热门的前几个有封面的歌手
def get_info_artist(url):
html = requests.get(url).text
html=etree.HTML(html)
hotlist = html.xpath('//div[@class="hot-head clearfix"]/dl/dd/a[1]/@href')
return hotlist def get_info_single(url):
re_com = re.compile('artist/(\d+)')
ting_uid = re_com.findall(url)[0]
get_info_single_page(0,ting_uid) def get_info_single_page(i,ting_uid):
page = 'http://music.baidu.com/data/user/getsongs?start={0}&ting_uid={1}'.format(i,ting_uid) html = requests.get(page).text
html = json.loads(html)["data"]["html"]
html=etree.HTML(html)
songlist = html.xpath('//div[@class="song-item"]//span[@class="song-title "]/a[1]/text()')
albumlist = html.xpath('//div[@class="song-item"]//span[@class="album-title"]/a[1]/text()')
downloadUrl = html.xpath('//div[@class="song-item"]//span[@class="song-title "]/a[1]/@href')
try:
singer = html.xpath('//div[@class="song-item"]//span[@class="song-title "]/a[1]/@title')[0]
re_com = re.compile('(\S+?)《') #这种解析歌手的方法不好,为了省事先这么弄的
singer = re_com.findall(singer)[0]
except:
singer = ' '
print(singer)
for songName,album,download in zip(songlist,albumlist,downloadUrl):
song_dict = {}
song_dict['歌曲'] = songName
song_dict['歌手'] = singer
song_dict['专辑'] = album
song_dict['下载路径'] = download
writeDB(song_dict)
#歌曲都获取全了,即获得某一页歌曲数少于25
if (len(songlist) == 25):
get_info_single_page(i+25,ting_uid) num = 1
if not os.path.isfile('test.db'):
conn = sqlite3.connect('test.db') c = conn.cursor()
c.execute('''create table baiduMusic (id integer primary key,songName varchar(10),singer varchar(10),
albumname varchar(10),
download varchar(10));''')
conn.commit()
else:
conn = sqlite3.connect('test.db')
url = 'http://music.baidu.com/artist'
hotlist = get_info_artist(url)
#urljoin主要是拼接URL,
#它以base作为其基地址,
#然后与url中的相对地址相结合组成一个绝对URL地址。
#函数urljoin在通过为URL基地址附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用。
#需要注意的是:
#如果基地址并非以字符/结尾的话,那么URL基地址最右边部分就会被这个相对路径所替换。
#如果希望在该路径中保留末端目录,应确保URL基地址以字符/结尾。 for u in hotlist:
#获得单个歌手的链接
url_singer = urlparse.urljoin(url,u)
get_info_single(url_singer) conn.close()

  

最终获得效果:

当然,上面的download链接是歌曲的跳转链接,如果需要下载的话,可以继续分析:

如上,可以继续分析如何构建歌曲文件的url,然后完成下载。

requests爬取百度音乐的更多相关文章

  1. python+requests爬取百度文库ppt

    实验网站:https://wenku.baidu.com/view/c7752014f18583d04964594d.html 在下面这种类型文件中的请求头的url打开后会得到一个页面 你会得到如下图 ...

  2. Python 爬虫实例(14) 爬取 百度音乐

    #-*-coding:utf-8-*- from common.contest import * import urllib def spider(): song_types = ['新歌','热歌' ...

  3. requests爬取百度贴吧:python 美女 3

    import requests import sys class Tieba(object): def __init__(self, tieba_name, pn): self.tieba_name ...

  4. requests+xpath+map爬取百度贴吧

    # requests+xpath+map爬取百度贴吧 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 # 分解: # requests获取网页 # xpath提取内容 # map实现多线程爬虫 impo ...

  5. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  6. Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  7. python3 爬取qq音乐作者所有单曲 并且下载歌曲

    1 import requests import re import json import os # 便于存放作者的姓名 zuozhe = [] headers = {'User-Agent': ' ...

  8. 写一个python 爬虫爬取百度电影并存入mysql中

    目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...

  9. Python爬虫实战一之爬取QQ音乐

    一.前言   前段时间尝试爬取了网易云音乐的歌曲,这次打算爬取QQ音乐的歌曲信息.网易云音乐歌曲列表是通过iframe展示的,可以借助Selenium获取到iframe的页面元素, 而QQ音乐采用的是 ...

随机推荐

  1. SearchSploit

    在我们的GitHub上的Exploit Database存储库中包含一个名为"searchsploit"的Exploit-DB的命令行搜索工具,该工具还允许您在任何地方随身携带一个 ...

  2. POJ 1185 炮兵阵地 (状态压缩DP)

    题目链接 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用& ...

  3. Python练习-一个Break跳出所有循环

    Alex大神的需求:三层循环,在最内层循环中使用break,让所有循环结束; # 编辑者:闫龙 i=1; count=0; while 1==i : while 1==i: while 1==i: c ...

  4. 《区块链100问》第84集:资产代币化之对标黄金Digix

    黄金是避险的不二选择.Digix发行的黄金代币则是数字资产世界里的黄金,其代币简称DGX,能够在数字资产世界中起到避险的作用. DGX如何实现对标黄金呢?它将黄金资产进行了上链(即:区块链)操作.举个 ...

  5. 解决Win7&Win8 64位下Source Insight提示未完整安装的问题[转]

    转自:http://www.cnblogs.com/sixiweb/p/3421533.html 网上的破解版的注册表文件都是针对32位系统的,所以在64位系统里运行根本无法破解.下面分别贴出这俩系统 ...

  6. eclipse安装阿里代码扫描插件

    1.首先打开eclipse软件,点击工具栏上的Help,选择Install New Soft进行安装新的插件. 2.进入插件安装界面,点击Add,弹出插件地址填写界面,也可以直接在市场上搜索关键字al ...

  7. openjudge-NOI 2.5-1700 八皇后问题

    题目链接:http://noi.openjudge.cn/ch0205/1700/ 题解: 经典深搜题目…… #include<cstdio> ][]; int num; void pri ...

  8. quartz的一个误导

    quartz文档提到,如果在集群环境下,最好将配置项org.quartz.jobStore.txIsolationLevelSerializable设置为true 问题: 这个选项在mysql下会非常 ...

  9. python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)

    ftp server 1) 读取文件名 2)检查文件是否存在 3)打开文件 4)检查文件大小 5)发送文件大小给客户端 6)等客户端确认 7)开始边读边(md5计算)发数据 8)给客户端发md5 ft ...

  10. sizeof求结构体大小

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...