Python实例---爬去酷狗音乐
项目一:获取酷狗TOP 100
http://www.kugou.com/yy/rank/home/1-8888.html
排名
文件&&歌手
时长
效果:
附源码:
import time
import json
from bs4 import BeautifulSoup
import requests class Kugou(object):
def __init__(self):
self.header = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'
} def getInfo(self, url):
html = requests.get(url, headers=self.header)
soup = BeautifulSoup(html.text, 'html.parser')
# print(soup.prettify())
ranks = soup.select('.pc_temp_num')
titles = soup.select('.pc_temp_songlist > ul > li > a') # 层层标签查找
times = soup.select('.pc_temp_time')
for rank, title, songTime in zip(ranks, titles, times):
data = {
# rank 全打印就是带HTML标签的
'rank': rank.get_text().strip(),
'title': title.get_text().split('-')[1].strip(),
'singer': title.get_text().split('-')[0].strip(),
'songTime': songTime.get_text().strip()
}
s = str(data)
print('rank:%2s\t' % data['rank'], 'title:%2s\t' % data['title'], 'singer:%2s\t' %data['singer'], 'songTime:%2s\t' % data['songTime'])
with open('hhh.txt', 'a', encoding='utf8') as f:
f.writelines(s + '\n') if __name__ == '__main__':
urls = [
'http://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(30)
] kugou = Kugou()
for url in urls:
kugou.getInfo(url)
time.sleep(1)
部分代码解析
--------------------------------------------------------------------
urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1, 5)]
for i in urls:
print(i) 结果打印:
http://www.kugou.com/yy/rank/home/1-8888.html
http://www.kugou.com/yy/rank/home/2-8888.html
http://www.kugou.com/yy/rank/home/3-8888.html
http://www.kugou.com/yy/rank/home/4-8888.html
--------------------------------------------------------------------
for rank, title, songTime in zip(ranks, titles, times):
data = {
# rank 全打印就是带HTML标签的
'rank': rank.get_text().strip(),
'title': title.get_text().split('-')[0].strip(),
'singer': title.get_text().split('-')[1].strip(),
'songTime': songTime.get_text()
}
print(data['rank'])
print(data['title'])
print(data['singer'])
print(data['songTime']) 结果打印:
1
飞驰于你
许嵩
4: 04
--------------------------------------------------------------------
for rank, title, songTime in zip(ranks, titles, times):
data = {
# rank 全打印就是带HTML标签的
'rank': rank,
'title': title,
'songTime': songTime
}
print(data['rank'])
print(data['title'])
print(data['songTime'])
结果打印:
<span class="pc_temp_num">
<strong>1</strong>
</span>
<a class="pc_temp_songname" data-active="playDwn" data-index="0" hidefocus="true" href="http://www.kugou.com/song/pjn5xaa.html" title="许嵩 - 飞驰于你">许嵩 - 飞驰于你</a>
<span class="pc_temp_time"> 4:04 </span>
项目二:搜索曲目获取URL
根据关键字搜索后的结果:
# encoding=utf-8
# Time : 2018/4/27
# Email : z2615@163.com
# Software: PyCharm
# Language: Python 3
import requests
import json class KgDownLoader(object):
def __init__(self):
self.search_url = 'http://songsearch.kugou.com/song_search_v2?callback=jQuery191034642999175022426_1489023388639&keyword={}&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1489023388641' # .format('园游会')
self.play_url = 'http://www.kugou.com/yy/index.php?r=play/getdata&hash={}'
self.song_info = {
'歌名': None,
'演唱者': None,
'专辑': None,
'filehash': None,
'mp3url': None
} def get_search_data(self, keys):
search_file = requests.get(self.search_url.format(keys))
search_html = search_file.content.decode().replace(')', '').replace(
'jQuery191034642999175022426_1489023388639(', '')
views = json.loads(search_html)
for view in views['data']['lists']:
song_name = view['SongName'].replace('<em>', '').replace('</em>', '')
album_name = view['AlbumName'].replace('<em>', '').replace('</em>', '')
sing_name = view['SingerName'].replace('<em>', '').replace('</em>', '')
file_hash = view['FileHash']
new_info = {
'歌名': song_name,
'演唱者': sing_name,
'专辑': album_name if album_name else None,
'filehash': file_hash,
'mp3url': None
}
self.song_info.update(new_info)
yield self.song_info def get_mp3_url(self, filehash):
mp3_file = requests.get(self.play_url.format(filehash)).content.decode()
mp3_json = json.loads(mp3_file)
real_url = mp3_json['data']['play_url']
self.song_info['mp3url'] = real_url
yield self.song_info def save_mp3(self, song_name, real_url):
with open(song_name + ".mp3", "wb")as fp:
fp.write(requests.get(real_url).content) if __name__ == '__main__':
kg = KgDownLoader()
mp3_info = kg.get_search_data(input('请输入歌名:'))
for x in mp3_info:
mp3info = kg.get_mp3_url(x['filehash'])
for i in mp3info:
print(i)
项目三:搜索下载歌曲
代码仅供学习参考
from selenium import webdriver from bs4 import BeautifulSoup import urllib.request from selenium.webdriver.common.action_chains import ActionChains input_string = input('>>>please input the search key:') #input_string="你就不要想起我" driver = webdriver.Chrome() driver.get('http://www.kugou.com/') a=driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[1]/div[1]/input') #输入搜索内容/html/body/div[1]/div[1]/div[1]/div[1]/input a.send_keys(input_string) driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[1]/div[1]/div/i').click() #点击搜索/html/body/div[1]/div[1]/div[1]/div[1]/div/i for handle in driver.window_handles:#方法二,始终获得当前最后的窗口,所以多要多次使用 driver.switch_to_window(handle) #result_url = driver.current_url #driver = webdriver.Firefox() #driver.maximize_window() #driver.get(result_url) #j=driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/ul[2]/li[2]/div[1]/a').get_attribute('title')测试 #print(j) soup = BeautifulSoup(driver.page_source,'lxml') PageAll = len(soup.select('ul.list_content.clearfix > li')) print(PageAll) for i in range(1,PageAll+1): j=driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/ul[2]/li[%d]/div[1]/a'%i).get_attribute('title') print('%d.'%i + j) choice=input("请输入你要下载的歌曲(输入序号):") #global mname #mname=driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/ul[2]/li[%d]/div[1]/a'%choice).get_attribute('title')#歌曲名 a=driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/ul[2]/li[%s]/div[1]/a'%choice)#定位 b=driver.find_element_by_xpath('/html/body/div[4]/div[1]/div[2]/ul[2]/li[%s]/div[1]/a'%choice).get_attribute('title') actions=ActionChains(driver)#selenium中定义的一个类 actions.move_to_element(a)#将鼠标移动到指定位置 actions.click(a)#点击 actions.perform() #wait(driver)? #driver = webdriver.Firefox() #driver.maximize_window() #driver.get(result_url) #windows = driver.window_handles #driver.switch_to.window(windows[-1]) #handles = driver.window_handles for handle in driver.window_handles:#方法二,始终获得当前最后的窗口,所以多要多次使用 driver.switch_to_window(handle) Local=driver.find_element_by_xpath('//*[@id="myAudio"]').get_attribute('src') print(driver.find_element_by_xpath('//*[@id="myAudio"]').get_attribute('src')) def cbk(a, b, c): per = 100.0 * a * b / c if per > 100: per = 100 print('%.2f%%' % per) soup=BeautifulSoup(b) name=soup.get_text() path='D:\%s.mp3'%name urllib.request.urlretrieve(Local, path, cbk) print('finish downloading %s.mp3' % name + '\n\n')
【更多参考】https://blog.csdn.net/abc_123456___/article/details/81101845
Python实例---爬去酷狗音乐的更多相关文章
- python爬取酷狗音乐排行榜
本文为大家分享了python爬取酷狗音乐排行榜的具体代码,供大家参考,具体内容如下
- Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)
在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...
- python使用beautifulsoup4爬取酷狗音乐
声明:本文仅为技术交流,请勿用于它处. 小编经常在网上听一些音乐但是有一些网站好多音乐都是付费下载的正好我会点爬虫技术,空闲时间写了一份,截止4月底没有问题的,会下载到当前目录,只要按照bs4库就好, ...
- Python 应用爬虫下载酷狗音乐
应用爬虫下载酷狗音乐 首先我们需要进入到这个界面 想要爬取这些歌曲链接,然而这个是一个假的网站,虽然单机右键进行检查能看到这些歌曲的链接,可进行爬取时,却爬取不到这些信息. 这个时候我们就应该换一种思 ...
- python爬取酷狗音乐
url:https://www.kugou.com/yy/html/rank.html 我们随便访问一个歌曲可以看到url有个hash https://www.kugou.com/song/#hash ...
- 【Python】【爬虫】爬取酷狗音乐网络红歌榜
原理:我的上篇博客 import requests import time from bs4 import BeautifulSoup def get_html(url): ''' 获得 HTML ' ...
- 使用scrapy 爬取酷狗音乐歌手及歌曲名并存入mongodb中
备注还没来得及写,共爬取八千多的歌手,每名歌手平均三十首歌曲算,大概二十多万首歌曲 run.py #!/usr/bin/env python # -*- coding: utf-8 -*- __aut ...
- 爬去酷狗top500的数据
import requests from bs4 import BeautifulSoup import time headers={ #'User-Agent':'Nokia6600/1.0 (3. ...
- 【Python】【爬虫】爬取酷狗TOP500
好啦好啦,那我们来拉开我们的爬虫之旅吧~~~ 这一只小爬虫是爬取酷狗TOP500的,使用的爬取手法简单粗暴,目的是帮大家初步窥探爬虫长啥样,后期会慢慢变得健壮起来的. 环境配置 在此之前需要下载一个谷 ...
随机推荐
- Linux内核升级导致无法启动,Kernel panic - not syncing Unable to mount root fs on unknown block(0,0)
问题原因:内核的某次升级,导致系统无法启动. 首先进入recovery模式:引导界面选择-->Ubuntu高级-->出现的选项中选择能够启动的recovery模式(几个内核版本分别试一下) ...
- Web开发者应知的URL编码知识
原文出处:http://blog.jobbole.com/42246/ 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们 ...
- (转) C# Async与Await的使用
(转) C# Async与Await的使用 class Program { static void Main(string[] args) { Console.WriteLine("主线程测 ...
- CSS学习笔记04 CSS文字排版常用属性
字体样式属性 font-size:字号大小 font-size属性用于设置字号,该属性的值可以使用相对长度单位,也可以使用绝对长度单位.其中,相对长度单位比较常用,推荐使用像素单位px,绝对长度单位使 ...
- BestCoder Round #29——A--GTY's math problem(快速幂(对数法))、B--GTY's birthday gift(矩阵快速幂)
GTY's math problem Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU1815(二分+2-SAT)
Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- JavaScript--事件入门(24)
// JavaScript事件是由访问Web页面的用户引起的一系列操作; // 例如:用户点击;当用户执行某些操作的时候,再去执行一系列代码; 一 事件介绍 // 事件一般是用于浏览器和用户操作进行交 ...
- drupal常用api
最短的函数 // 语言字串,除了可以获取对应语言外,还可以设置字串变量.可以是!var, @var或 %var,%var就添加元素外层.@var会过滤HTML,!var会原样输出HTML,%var会添 ...
- js多线程(worker)
浏览器端js是单线程执行,所以当js执行高负载运算时,UI渲染就会阻塞,页面就会出现卡顿,用户体验就不是很好 js为此也提供了异步操作,例如: 定时器(setTimeout 和 setInterval ...
- JavaSE——打印流
打印流: 类PrintStream: PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式.它还提供其他两项功能.与其他输出流不同,PrintStream 永远不会抛 ...