抓取目标:

豆瓣音乐top250的歌名、作者(专辑)、评分和歌曲链接

使用工具:

requests + lxml + xpath。

我认为这种工具组合是最适合初学者的,requests比python自带的urllib库好用,功能更强大。关于requests的使用方法,建议看它的官方文档:

http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

使用lxml来解析网页,速度是最快的,至少比BeatifulSoup快。关于lxml的使用方法,建议看这个:

http://lxml.de/

而xpath更是傻白甜的使用方式:直接在浏览器中复制即可,如果想要掌握xpath更具体的语法,建议看w3school的xpath教程:

http://www.w3school.com.cn/xpath/

首先目标url是: https://music.douban.com/top250?start=0

 
image.png

点击下一页,我们多观察几个页面的url:

 
image.png
 
image.png

我们会发现url的start=是以25的倍数增长的,起始为start=0,然后是start=25,每页25首音乐,一共十页。

所以,我们可以使用一个for循环来得出这十个页面的url:

for i in range(10):
# 一共有10个页面,每个页面25首音乐
url = "https://music.douban.com/top250?start={}".format(i * 25)

关于format()函数的使用方法,可以看菜鸟教程上的讲解:

http://www.runoob.com/python/att-string-format.html

关于range()函数的使用方法,可以看菜鸟教程上的讲解:

http://www.runoob.com/python/python-func-range.html

然后我们使用requests.get()来进行网页请求:

import requests
headers = {"User_Agent": "Mozilla/5.0(compatible; MSIE 5.5; Windows 8)"}
data = requests.get(url, headers=headers).text

使用lxml来解析网页:

from lxml import etree
s = etree.HTML(data)

接下来我们开始提取数据,打开目标页面,将每首音乐的完整信息的xpath信息复制下来:

 
image.png

重复这样的操作,多复制几首音乐的xpath信息,观察它的规律:

//*[@id="content"]/div/div[1]/div/table[1]
//*[@id="content"]/div/div[1]/div/table[2]
//*[@id="content"]/div/div[1]/div/table[3]

这样子规律就很明显了,每首音乐就是table后的序号不同。只要我们将序号去掉,就可以提取所有音乐的全部信息了:

# 歌曲整体的xpath
musics = s.xpath('//*[@id="content"]/div/div[1]/div/table')

我们再使用同样的方法来获取歌名的xpath信息:

 
image.png

多复制几个歌名信息的xpath来对比一下:

# 歌名的xpath
# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a
# //*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div/a

这是注意一下, 上面的xpath路径中,/tbody是多余的,我们要将其删掉,不然会出错,所以,有时候直接在浏览器复制xpath信息也不一定靠谱,这里要注意一下。

这样我们就可以提取出每首歌的歌名:

for music in musics:
music_name = music.xpath('./tr/td[2]/div/a/text()')[0].strip()

如果不加[0],我们得到的结果将是一个list类型,每个结果都被中括号[]裹起来,比较碍眼,所以使用[0]取出list的第一个值就可以了。strip()函数可以去除多余的空格。

还有,音乐的链接和名字的xpath路径是相同的,只是一个取href值,一个取text值。
所以每首歌的链接如下:

for music in musics:
music_name = music.xpath('./tr/td[2]/div/a/@href')[0]

我们再使用同样的方法复制作者(专辑)的xpath信息:

 
image.png

多复制几个作者的xpath信息来对比一下:

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/p[1]
# //*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div/p[1]

同样要将/tbody从xpath路径中删掉,这样我们可以提取到每首歌的作者信息:

for music in musics:
music_author = music.xpath('./tr/td[2]/div/p[1]/text()')[0].strip()

我们还使用同样的方法复制评分的xpath信息:

 
image.png

多复制几个评分的xpath信息来对比一下:

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/div/span[2]
# //*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div/div/span[2]

同理,我们就可以提取出每首歌的评分了:

for music in musics:
music_score = music.xpath('./tr/td[2]/div/div/span[2]/text()')[0]

到现在,我们已经获取了我们想要的所有信息。现在来整合一下代码,存储为TXT文件:

import requests
from lxml import etree
import time with open("豆瓣音乐top250.txt", "w", encoding="utf-8") as f:
for i in range(10):
# 一共有10个页面,每个页面25首音乐
url = "https://music.douban.com/top250?start={}".format(i * 25)
headers = {"User_Agent": "Mozilla/5.0(compatible; MSIE 5.5; Windows 8)"}
data = requests.get(url, headers=headers).text
s = etree.HTML(data) # 歌曲整体的xpath
musics = s.xpath('//*[@id="content"]/div/div[1]/div/table')
time.sleep(2) for music in musics:
music_name = music.xpath('./tr/td[2]/div/a/text()')[0].strip() # 歌名
music_author = music.xpath('./tr/td[2]/div/p[1]/text()')[0].strip() # 作者
music_score = music.xpath('./tr/td[2]/div/div/span[2]/text()')[0] # 评分
music_href = music.xpath('./tr/td[2]/div/a/@href')[0] # 链接 f.write("{} {} {} {}\n".format(music_name, music_author, music_score, music_href))

如上,一共23行代码。

爬取结果如下:

 
image.png

本来我想存为CSV文件的,结果发现有的歌曲有多个歌手,而且几个歌手之间是用逗号(,)分开的,这就和CSV中的逗号产生了混淆,导致结果比较错乱。

好吧,我暂时不知道存为CSV格式时,怎样消除其本身携带的逗号产生的影响。

当然,同样的爬取思路,我们还可以爬取豆瓣电影top250、豆瓣图书top250。只需要将url和xpath路径修改一下就可以了。

每天学习一点点,每天进步一点点。

Python爬虫小白入门(七)爬取豆瓣音乐top250的更多相关文章

  1. Python爬虫入门:爬取豆瓣电影TOP250

    一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...

  2. Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP

    自己写了一个爬虫爬取豆瓣小说,后来为了应对请求不到数据,增加了请求的头部信息headers,为了应对豆瓣服务器的反爬虫机制:防止请求频率过快而造成“403 forbidden”,乃至封禁本机ip的情况 ...

  3. python爬虫:利用正则表达式爬取豆瓣读书首页的book

    1.问题描述: 爬取豆瓣读书首页的图书的名称.链接.作者.出版日期,并将爬取的数据存储到Excel表格Douban_I.xlsx中 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目 ...

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

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

  5. Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析

    上次使用了BeautifulSoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢.本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快. 本次爬取的豆瓣书籍排行榜的首页地 ...

  6. Scrapy爬虫(4)爬取豆瓣电影Top250图片

      在用Python的urllib和BeautifulSoup写过了很多爬虫之后,本人决定尝试著名的Python爬虫框架--Scrapy.   本次分享将详细讲述如何利用Scrapy来下载豆瓣电影To ...

  7. 实例学习——爬取豆瓣音乐TOP250数据

    开发环境:(Windows)eclipse+pydev+MongoDB 豆瓣TOP网址:传送门 一.连接数据库   打开MongoDBx下载路径,新建名为data的文件夹,在此新建名为db的文件夹,d ...

  8. 爬取豆瓣音乐TOP250的数据

    参考网址:https://music.douban.com/top250 因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先爬取进入详细页的网址链接,进而爬取数据. 需要爬取的信息有:歌曲名.表演 ...

  9. Python爬虫之利用BeautifulSoup爬取豆瓣小说(二)——回车分段打印小说信息

    在上一篇文章中,我主要是设置了代理IP,虽然得到了相关的信息,但是打印出来的信息量有点多,要知道每打印一页,15个小说的信息全部会显示而过,有时因为屏幕太小,无法显示全所有的小说信息,那么,在这篇文章 ...

随机推荐

  1. 二,表格<table>的使用细节

    如有不足请不吝赐教!最先接触的布局表格,表格灵活性,加载速度都不如<div>灵活,但是对于萌新来说再定位某些,例如div里面套文字,而刚接触html+css又不懂得那么多使用<spa ...

  2. Java-KTVByLinkedList模拟点歌工具

    import java.util.LinkedList; import java.util.Scanner; public class KTVByLinkedList { public static ...

  3. Thunar左侧边栏不完全显示PLACES的解决

    场景 我的笔记本装上系统时用的英文,安装中文之后,发现文件管理器的默认的几个文件夹 Desktop.Music.Videos.Downloads等都变成了中文,由于是新安装的系统,就重新生成 loca ...

  4. [JavaWeb基础] 031.dom4j写入xml的方法

    上一篇我们讲述了dom4j读取xml的4种方法,甚是精彩,那么怎么样写入xml呢?我们直接看下源码实现. public static void main(String[] args) throws E ...

  5. Matlab GUI程序设计入门——信号发生器+时域分析

    背景:学习matlab gui编程入门,完成一个基于GUIDE的图形化界面程序,结合信号生成及分析等. 操作步骤: 1.新建程序 新建一个GUIDE程序 这里选择第一个选项,即创建一个空白的GUIDE ...

  6. 02 . Python之数据类型

    Python入门之数据类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数 ...

  7. spring Resource

    在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源.File资源资源.ClassPath相关资源.服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源.因此处理这 ...

  8. Java实现 LeetCode 784 字母大小写全排列(DFS)

    784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" ...

  9. (Java实现) 美元汇率

    时空限制 1000ms/128MB 题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后 ...

  10. Java实现 蓝桥杯VIP 算法训练 薪水计算

    算法训练 薪水计算 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 编写一个程序,计算员工的周薪.薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么 ...