参考网址:https://music.douban.com/top250

因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先爬取进入详细页的网址链接,进而爬取数据。

需要爬取的信息有:歌曲名、表演者、流派、发行时间、出版者和评分等。

将数据分别使用TXT、JSON、CSV存储。

import re
import csv
import time
import json
import requests
from bs4 import BeautifulSoup
from requests import RequestException def get_one_page(url):
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36'
+ '(KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
response = requests.get(url, headers=headers)
#response.encoding = response.apparent_encoding
if response.status_code == 200:
return response.text
return None
except RequestException:
return None def get_detailurl(text):
detailurl = []
soup = BeautifulSoup(text, 'lxml')
nbg = soup.find_all(name='a', class_='nbg')
for i in nbg:
detailurl.append(i['href'])
return detailurl def parse_one_page(text):
soup = BeautifulSoup(text, 'lxml') #使用lxml XML 解析库
performer = soup.select('#info > span > span > a')
#有标签没有属性的情况下用select, 否则用find_all
song = soup.select('#wrapper > h1 > span') style = re.findall('流派:</span> (.*?)<br', text, re.S) #.*?非贪婪匹配
#re.S使.匹配包括换行在内的所有字符
if len(style) == 0: #有的页面没有流派,用NULL填充
style.append('NULL')
publisher = re.findall('出版者:</span> (.*?)?<br', text, re.S)
if len(publisher) == 0: #有的页面没有出版者,用NULL填充
publisher.append('NULL')
pattern = re.compile('发行时间:</span> (.*?)?<br', re.S)
#compile()将正则字符串编译成正则对象,方便之后复用
time = re.findall(pattern, text) score = soup.find_all(name='strong', class_="ll rating_num")
#有标签有属性的情况下用find_all
yield {
'performer': performer[0].string,
'song': song[0].string,
'style': style[0].strip(),
'time': time[0].strip(),
'publisher': publisher[0].strip(),
'score': score[0].string,
} def write_to_file(content):
with open('doubanMusicTop250.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False)+'\n')
#dumps将json对象转化为字符串 def write_to_json(content):
with open('doubanMusicTop250.json', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False)+'\n') def write_to_csv(content):
with open('doubanMusicTop250.csv', 'a', encoding='utf-8') as f:
fieldnames = ['publisher', 'style', 'song', 'score', 'performer', 'time']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(content) if __name__ == '__main__':
url = 'https://music.douban.com/top250?start={}'
urls = [url.format(page) for page in range(0,256,25)]
content = []
for url in urls:
text1 = get_one_page(url)
detailurl = get_detailurl(text1)
for i in detailurl:
text2 = get_one_page(i)
for item in parse_one_page(text2):
print(item)
write_to_file(item)
content.append(item)
time.sleep(1)
write_to_csv(content)
write_to_json(content)

爬取豆瓣音乐TOP250的数据的更多相关文章

  1. Python爬虫小白入门(七)爬取豆瓣音乐top250

      抓取目标: 豆瓣音乐top250的歌名.作者(专辑).评分和歌曲链接 使用工具: requests + lxml + xpath. 我认为这种工具组合是最适合初学者的,requests比pytho ...

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

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

  3. 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

    学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...

  4. Python爬虫:现学现用xpath爬取豆瓣音乐

    爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方式的对比. 这样一比较我我选择了Lxml(xpa ...

  5. python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库

    python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...

  6. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  7. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

  8. 【转】爬取豆瓣电影top250提取电影分类进行数据分析

    一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...

  9. Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed

    好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...

随机推荐

  1. Shell脚本 硬盘监控

    用shell 写了一个硬盘监控的小程序   #!/bin/bash MAX=95 EMAIL=zonghua@iyunshu.com PART=sda1   IP=`ifconfig |grep -w ...

  2. Nginx location配置 正则表达式

    一. location 的匹配符 Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }     1.  语法格式 ...

  3. 赛狗日源码分享 《Head First C#》第三版

    目录 前言 效果展示 步骤 熟读任务说明 搭界面 开始代码 From.cs Greyhound.cs Guy.cs Bet.cs 写在后面的话 本次遇见的一些问题 关于优化 可以设定狗的特性 去掉Be ...

  4. 学习shiro最佳实践,绝对正确

    按照https://blog.csdn.net/qq_34021712/column/info/26947学习,基本能解决shiro一切问题,谢谢该博主

  5. oracle数据库重要的查询语句

    查看所有数据文件(dbf文件)的存放位置 SQL> select name from v$datafile; 标红色的为默认表空间文件 SQL> select name from v$da ...

  6. Flink1.9重大改进和新功能

    一.Flink1.9.0的里程碑意义 二.重构 Flink WebUI Flink社区讨论了现代化 Flink WebUI 的提案,决定采用 Angular 的最新稳定版来重构这个组件.从Angula ...

  7. codewars--js--RGB To Hex Conversion

    问题描述: The rgb() method is incomplete. Complete the method so that passing in RGB decimal values will ...

  8. 记一次Postgres CPU爆满故障

    问题描述 公司项目测试环境调用某些接口的时候,服务器立即崩溃,并一定时间内无法提供服务. 问题排查 服务器配置不够 第一反应是服务器需要升配啦,花钱解决一切!毕竟测试服务器配置确实不高,2CPU + ...

  9. 解决BitLocker反复提示恢复密钥正确而无法进入系统的问题

    前一阵电脑因为装了grub,引导策略被改了.开Windows要求输入恢复密钥以进行恢复.我登陆过Microsoft账户所以在官网上找到了密钥并恢复了驱动器.但是进去提示"恢复密钥正确&quo ...

  10. 版本管理git

    Git 是目前世界上最先进的分布式版本控制系统. git的主要操作步骤 git.init  初始化,显示成功后去相应的文件夹中查看是不是多了一个git文(版本库)  命令1.    git confi ...