爬取豆瓣音乐TOP250的数据
参考网址: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的数据的更多相关文章
- Python爬虫小白入门(七)爬取豆瓣音乐top250
抓取目标: 豆瓣音乐top250的歌名.作者(专辑).评分和歌曲链接 使用工具: requests + lxml + xpath. 我认为这种工具组合是最适合初学者的,requests比pytho ...
- 实例学习——爬取豆瓣音乐TOP250数据
开发环境:(Windows)eclipse+pydev+MongoDB 豆瓣TOP网址:传送门 一.连接数据库 打开MongoDBx下载路径,新建名为data的文件夹,在此新建名为db的文件夹,d ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- Python爬虫:现学现用xpath爬取豆瓣音乐
爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方式的对比. 这样一比较我我选择了Lxml(xpa ...
- python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库
python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
- Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed
好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...
随机推荐
- table-cell设置宽高、居中
table-cell默认宽高由内容决定 <style type="text/css" rel="stylesheet"> .content { co ...
- 分形的奥秘!分形着色器!shader 编程入门实战 ! Cocos Creator!
极致的数学之美! 什么是分形? "一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状" 简单来说,分形(fractal)就像这个doge表情包 ...
- JavaScript-装饰器模式
装饰器模式 为对象添加新功能 不改变其原有的结构和功能 传统 UML 类图 javascript 中的装饰器 装饰类 @testDec clss Demo { } function testDec(t ...
- redis 5.0.7 源码阅读——整数集合intset
redis中整数集合intset相关的文件为:intset.h与intset.c intset的所有操作与操作一个排序整形数组 int a[N]类似,只是根据类型做了内存上的优化. 一.数据结构 ty ...
- Centos 7.5 搭建FTP配置虚拟用户
Centos 7.5 搭建FTP配置虚拟用户 1.安装vsftpd #vsftpd下载地址 http://mirror.centos.org/centos/7/os/x86_64/Packages/v ...
- 【POJ - 2533】Longest Ordered Subsequence (最长上升子序列 简单dp)
Longest Ordered Subsequence 搬中文 Descriptions: 给出一个序列,求出这个序列的最长上升子序列. 序列A的上升子序列B定义如下: B为A的子序列 B为严格递增序 ...
- LeetCode 57. Insert Interval 插入区间 (C++/Java)
题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...
- 通过sql的stuff 把一列几行的记录拼接在一行一个字段
---通过sql的stuff 把一列几行的记录拼接在一行一个字段 select FID,a.FCustomerID as 工地ID , 应验收节点 = (stuff((select ',' + isn ...
- Redis-异步消息
关于异步消息,大家都知道,如下: 这些用起来都是比较复杂的,RabbitMQ先要创建Exchange,在创建Queue,还要将Queue和Exchange通过某种规则绑定起来.发消息之前要指定rout ...
- BizCharts使用采坑教程
了不起的BizCharts 最近项目的管理后台都在用阿里粑粑开源的管理框架Ant Design Pro,说真话,还是比较好用的.该框架内部也封装了一些图标插件,但是在最近的一个项目中发现,这些图标 ...