本文对使用到的技术仅做简单的介绍,若想了解更多,请前往相应的官网网站进行学习。
本文适合对爬虫相关知识接触不多的新手,主要是普及Selenium如何做爬虫,大佬请跳过。
pip install Selenium
from selenium import webdriver
driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
如果看到开启了一个浏览器窗口就是成功了,否则下面会有相应的报错信息,需要检查前面的步骤。
1.元素定位方式:
分享快速定位元素的小妙招:看所需信息所在的标签的id,class,name的名称是否与标签下信息的语义有关,一般有关的都代表是唯一的。(从开发者的角度去思考)若无法通过当前标签唯一定位,则考虑父级标签,一次类推,总是能找到定位的方法的。
2.鼠标事件(模拟鼠标操作)
3.键盘事件(模拟键盘操作)
4.其他操作
使用csv库,将爬取到的数据写入到csv文件中进行持久化。
from selenium import webdriver
import csv
from time import sleep
import time
#
# Author : ATFWUS
# Date : 2021-03-21 20:00
# Version : 1.0
# 爬取周杰伦最热门五首歌曲的基本信息,歌词,前五百条热门评论
# 此代码仅供交流学习使用
#
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
#2.打开QQ音乐 -周杰伦页面
driver.get("https://y.qq.com/n/yqq/singer/0025NhlN2yWrP4.html")
#3.配置
csv_file=open('songs.csv','w',newline='',encoding='utf-8')
writer=csv.writer(csv_file)
start=time.time()
# 取前5首歌曲
song_numer=5
song_url_list=[]
song_resourses=[]
songlist__item=driver.find_elements_by_class_name("songlist__item")
# 获取所有歌曲url
for song in songlist__item:
song__url=song.find_element_by_class_name("js_song").get_attribute("href")
song_url_list.append(song__url)
song_numer-=1
if(song_numer==0):
break
# print(song_url_list)
print("已获取周杰伦热门歌曲列表前五首的url")
print()
# 获取一首歌曲所需要的信息
def getSongResourse(url):
song_resourse={}
driver.get(url)
# 这个0.5秒用于等待异步请求的完成
sleep(0.8)
# 获取歌曲名
song_name=driver.find_element_by_class_name("data__name_txt").text
print("开始获取歌曲《"+song_name+"》的基本信息")
# 获取流派,发行时间,评论数
song_liupai=driver.find_element_by_css_selector(".js_genre").text[3:]
song_time=driver.find_element_by_css_selector(".js_public_time").text[5:]
song_comment_num=driver.find_element_by_css_selector(".js_into_comment").text[3:-1]
print("歌曲《" + song_name + "》基本信息获取完毕")
print("开始获取歌曲《" + song_name + "》的歌词")
# 点击展开歌词
driver.find_element_by_partial_link_text("[展开]").click()
sleep(0.3)
lyic=""
# 获取拼接歌词
lyic_box=driver.find_element_by_id("lrc_content").find_elements_by_tag_name("p")
for l in lyic_box:
if l.text!="":
lyic+=l.text+"\n"
print("歌曲《" + song_name + "》的歌词获取完毕")
print("开始获取歌曲《" + song_name + "》的第1-15条热门评论")
# 获取500条评论
comments=[]
# 点击加载更多29次,每次多出15条评论
for i in range(33):
driver.find_element_by_partial_link_text("点击加载更多").click()
print("开始获取歌曲《" + song_name + "》的第"+str((i+1)*15+1)+"-"+str((i+2)*15)+"条热门评论")
sleep(0.5)
comments_list=driver.find_element_by_css_selector(".js_hot_list").find_elements_by_tag_name("li")
for com in comments_list:
content=com.find_element_by_css_selector(".js_hot_text").text
content_time=com.find_element_by_css_selector(".comment__date").text
zan_num=com.find_element_by_class_name("js_praise_num").text
comment={}
comment.update({"评论内容":content})
comment.update({"评论时间":content_time})
comment.update({"评论点赞次数":zan_num})
comments.append(comment)
print("歌曲《" + song_name + "》的前五百条热门评论获取完毕")
print("歌曲《"+song_name+"》所有信息获取完毕")
print()
song_resourse.update({"歌曲名":song_name})
song_resourse.update({"流派":song_liupai})
song_resourse.update({"发行时间":song_time})
song_resourse.update({"评论数":song_comment_num})
song_resourse.update({"歌词":lyic})
song_resourse.update({"500条精彩评论":comments})
return song_resourse
for song_page in song_url_list:
song_resourses.append(getSongResourse(song_page))
# break
print("正在写入CSV文件...")
for i in song_resourses:
writer.writerow([i["歌曲名"],i["流派"],i["发行时间"],i["评论数"],i["歌词"]])
for j in i["500条精彩评论"]:
writer.writerow([j["评论内容"],j["评论时间"],j["评论点赞次数"]])
writer.writerow([])
csv_file.close()
end=time.time()
print("爬取完成,总耗时"+str(end-start)+"秒")
pip install padas
import pandas as pd
import csv
# 这五个列表用于创建Series
se=[]
names=[]
# 先读取CSV文件的内容至内存中
with open("songs.csv",'r',encoding="utf8") as f:
# 创建阅读器对象
reader=csv.reader(f)
rows=[row for row in reader]
index=0
print("开始解析CSV数据...")
for i in range(5):
s1=[]
# 读取第一行信息
names.append(rows[index].__str__().split(',')[0][2:-1])
index+=1
# 读取五百条评论的点赞消息
for j in range(510):
s1.append(int(rows[index].__str__().split(',')[2][2:-2]))
index+=1
se.append(s1)
# 读取掉空行
index+=1
print("CSV数据解析成功\n")
# 创建的5个series
for i in range(5):
series=pd.Series(se[i])
print("歌曲《"+names[i]+"》的平均点赞次数是:" + str(series.mean()))
print("歌曲《" + names[i] + "》的标准差是:" + str(series.std()))
print()
感叹:爬下几千条评论,看了之后,发现,有伤感那味了,哈哈哈
作者:ATFWUS
原文链接:https://blog.csdn.net/ATFWUS/article/details/115053245
频、视频的格式
开始学习之前,我们要下载些素材用来测试使用,地址如下:https://pan.baidu.com/s/1reRWno0ibYRcYXjw4MClqw
提取码:td80
其中包括两个视频一个音频和一个安装程序。
学习如何在页面中添加音频、视频之前应该了解一点基础知识。
我们应该都有在互联网上下载电影、视频、音乐的经历,大家会注意到,有的视频文件名的后缀是.avi,有的视频是.mp4,还有.mov的,据不完全统计,常见的各种视频格式有十几种之多。
常见的音频的格式比起视频来会显得少一些,一般是.wav和.mp3格式。
为什么存储相同的内容可以有这么多不同的格式呢?
格式产生的核心在于对音频、视频等多媒体文件进行的不同编码方式。
那什么是编码呢?
简单来说我们可以把"编码"这个词分成两个部分,第一个是"编",也就是"整理、组织"的意思,第二个是"码",也就是我们平时所说的"数码"。
首先说"码",我们的计算机中的数据最终都是通过二进制的数字(0和1)来存储或计算的,这些0或1就是数码。无论代码、程序、图片、音乐、视频、文字等的存储与计算都不例外。不管多么复杂或简单的文件,在计算机看来,都是一大堆0和1。
一个0或1被称为1比特,图片或视频中的一个黑白像素通常是8比特(八位),如果一张1080乘720个像素的图片所占内存的大小就是1080*720*8=6220800字节,约等于0,74mb。如果一个视频每秒中有25帧,也就是一秒钟在我们眼前闪过25张图片(视频播放实际上就是在我们眼前快速的更替图片,这些图片在大脑中会被自动连成动作,这也是小的时候在课本的角上画好一套走路的小人的不同动作后,快速翻动书页,画面中的小人会走路的原因,大家可以自行百度"视觉暂留原理")。
一秒钟25张1080乘720的图片的视频,一秒钟就会占0.74*25=18.5mb的内存。如果是一分钟呢,18.5*60=1110mb约等于1.08gb。这样的数据量是不是很吓人。
但事实上我们下载的1080*720的一小时三十分钟左右的视频的体积往往也没有超过1gb,这又是为什么呢?
这就是"编"的功劳!对数码进行整理和组织的主要目的是压缩体积,压缩数据体积既能节省磁盘又能方便传播与携带,是信息技术的关键技术之一,压缩的方法一般有两类,一类叫做无损压缩,也就是通过对这一大堆数码进行一个特殊的组合使其占有更小的空间,一类叫做有损压缩,是在无损压缩的基础上剔除掉人眼睛识别不到的冗余信息。具体的压缩过程涉及到很多数学知识,这里大家简单了解一下即可。
压缩后的视频或音频文件最终通过播放器对该文件的压缩算法进行逆向运算后,还原成计算机可以解读的画面和声音再呈现给观众,这个过程叫做"解码"。
通过"编"的方式压缩文件体积,通过"解"的方式再还原出文件内容成了处理大规模数据的通用手法。
不同的编码和解码方式催生出不同的文件格式,这种情况下,浏览器在播放视频的时候就要有应对不同格式的不同解码方式,在15年以前,浏览器为了能够播放不同格式的视频,就要调用电脑中不同的播放器,这个过程的写法非常麻烦。随着技术不断地整合,时至今日,在页面中播放视频不需要这么复杂的写法了,但是因为每个浏览器都不是包打一切,因此,虽然不用指定播放器,但是也要预设不同格式的视频来应对不同的浏览器。
因此,我们在这一部分的学习中除了讲解如何向页面添加不同格式的音视频外还会告诉大家如何为音视频转换格式。
为页面添加音频、视频
添加音频使用<audio></audio>标签,这个标签被所有浏览器支持,是html5推荐的音频导入标签,但是遗憾的是在html4标准中是不被支持的或者说是非法的。
这里给大家简要介绍一下html5和html4的区别。
简单来说呢,一个html文件的第一条语句是<!DOCTYPE HTML>,它就是HTML5标准的文件。如果是html4,它的第一条声明语句有三种写法,像这样
一:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
二:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
三:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
版权声明:本文为CSDN博主「痦子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yh1061632045/article/details/81518141
这让我想到了孔乙己的"茴"字的多种写法
是不是很麻烦,其实html5比html4更简单,功能更强大,而且我们一直以html5的标准进行学习,所以大家不必纠结。
下面我们导入一个音频试试吧。示例代码如下:
<!DOCTYPE HTML>
<html>
<head>
<title>音视频导入</title>
</head>
<body>
<audio controls="controls">
<source src="audio/千年的祈祷.mp3" type="audio/mp3" />
</audio>
</body>
</html>
页面效果如下:
其中controls属性就是用来显示播放控制界面的,就是这个:(偷懒的话可以写成"controls"就ok,不必加"="以及后面的内容了。)
如果以后您使用自己编写的控制界面,就可以不添加这个属性。
删掉这个属性后就是这样:这样为自定义的播放控制界面留出了位置。
<audio></audio>标签夹着<source>标签,一个<audio></audio>标签中可以添加多个<source>用以支持不同的格式要求。示例代码如下:(这段代码来自w3school)
<audio controls="controls">
<source src="song.ogg" type="audio/ogg" />
<source src="song.mp3" type="audio/mpeg" />
Your browser does not support the audio element.<!--你的浏览器不支持这个音频元素-->
</audio>
type属性是告诉浏览器音乐文件的类型。
不同格式的文件的生成需要我们自己去做,这就涉及到如何给一个音频文件进行格式转化的问题。这个问题我们明天再说,今天先学习为页面添加音频和视频。
下面我们来看一下视频的导入方法,示例代码如下:
<video controls>
<source src="video/阿塔丽.mp4" type="video/mp4" />
</video>
页面效果如下:
我们可以通过设置height和width属性来控制视频的面积。实例代码如下:
<video controls width="850" height="500" >
<source src="video/阿塔丽.mp4" type="video/mp4" />
</video>
页面效果如下:
视频画面变小了,和视频并排的是我们之前添加的音频文件,由此可知,这两个元素都是内联元素。
今天的内容结束了,明天我们继续学习格式转换和为不同浏览器预设不同音视频格式的方法。
如果您有任何疑问请给我留言,如有问题或错误请予以斧正!
HTML序章(学习目的、对象、基本概念)——零基础自学网页制作
HTML是什么?——零基础自学网页制作
第一个HTML页面如何写?——零基础自学网页制作
HTML页面中head标签有啥用?——零基础自学网页制作
初识meta标签与SEO——零基础自学网页制作
HTML中的元素使用方法1——零基础自学网页制作
HTML中的元素使用方法2——零基础自学网页制作
HTML元素中的属性1——零基础自学网页制作
HTML元素中的属性2(路径详解)——零基础自学网页制作
使用HTML添加表格1(基本元素)——零基础自学网页制作
使用HTML添加表格2(表格头部与脚部)——零基础自学网页制作
使用HTML添加表格3(间距与颜色)——零基础自学网页制作
使用HTML添加表格4(行颜色与表格嵌套)——零基础自学网页制作
16进制颜色表示与RGB色彩模型——零基础自学网页制作
HTML中的块级元素与内联元素——零基础自学网页制作
初识HTML中的<div>块元素——零基础自学网页制作
在HTML页面中嵌入其他页面的方法——零基础自学网页制作
封闭在家学网页制作!为页面嵌入PDF文件——零基础自学网页制作
HTML表单元素初识1——零基础自学网页制作
HTML表单元素初识2——零基础自学网页制作
HTML表单3(下拉列表、多行文字输入)——零基础自学网页制作
HTML表单4(form的action、method属性)——零基础自学网页制作
HTML列表制作讲解——零基础自学网页制作
为HTML页面添加视频、音频的方法——零基础自学网页制作
音视频格式转换神器与html视频元素加字幕——零基础自学网页制作
HTML中使用<a>标签实现文本内链接——零基础自学网页制作
狗音乐是一款非常不错的软件,包含着音乐软件所有该有的功能。
初中开始接触上网,下载歌曲便一直用酷狗音乐。想当初自己年少无知啊,好不容易凑够5块钱上了2个小时的网,结果愣是一首歌没下载下来,下载的全是歌词文件!我兴高采烈地往自己的mp4里传输,结果发现不能播放!网吧时间到了,口袋钱空了,歌没下下来,当时气死老子了。这也可以说是一段难忘的经历啊。
上了大学以后,为了配合我稍微有一点那么文绉绉的气质,开始跟随网易大军,使用网易云音乐,开启我的高逼格历程!大学毕业,气质全无,我觉得我配不上网易云了,又投入了酷狗音乐的怀抱[笑哭]。
这不,这两天重看《双世宠妃2》,再一次深深地迷上了里面的曲檀儿(梁洁饰演)【花痴】,配合叶炫清的《归去来兮》,简直了!【好像屌丝本质一览无余?才不是,是欣赏!哈哈】
开始分析:
MV链接:https://www.kugou.com/mvweb/html/mv_866733.html
想直接看的,可跳转过去哦!
第一步:打开酷狗WEB,搜索《归去来兮》,点击
第二步:点击音乐播放界面的mv,进行跳转到播放页面。
简直了,美美美
哈哈,别忘了正事!
第三步:右键(Chrome)检查,Ctrl+F搜索"归去来兮",结果如下:
可以看出,这里面有我们需要的MV的标题和MV的哈希值。至于哈希值是啥,待会再解释。
获取到它们,方法如下:
access_url="链接地址" # 移除SSL验证时的警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) response=requests.get(access_url, headers=headers, verify=False) html=response.text web_data=etree.HTML(html) datas=web_data.xpath('//script[@type="text/javascript"]') x=datas[1].xpath('./text()')[0].strip().split('.')[0].split(',') mv_hash=x[1].split('"')[1] mv_title=x[2].split('"')[1] print('MV哈希值:%s,MV标题:%s'%(mv_hash,mv_title)) # 划重点:获取key key=kugou_hash(mv_hash)
第四步?
在开始第四步之前,先用网上的解释来说明什么是哈希加密!
转载链接:https://www.liaoxuefeng.com/wiki/897692888725344/923057313018752
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。
可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
好,接下来,第四步:用hash得到key!
m=hashlib.md5() # 哈希 md5加密 kugou_slat='kugoumvcloud' # 盐 m.update((mv_hash + kugou_slat).encode("utf8")) # 哈希值+盐 key=m.hexdigest() return key # 返回key值
第五步:刷新页面,右键检查,Network,搜索key,得到如下结果:
可以看到,这里面就有我们想要的超清画质的下载链接!
第六步:既然找到了最后的下载链接,那下载自然就不在话在!开搞!
download_url="http://trackermv.kugou.com/interface/index/cmd=100&hash={}&key={}&pid=6&ext=mp4&ismp3=0".format(mv_hash,key) hash_res=requests.get(download_url, headers=headers) hash_js=hash_res.json() # json格式 try: play_url=hash_js['mvdata']['rq']['downurl'] file_suffix=play_url.split('/')[-1].split('.')[-1] if play_url !="": print('1080P MV下载地址已找到,请稍候...') with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp: fp.write(requests.get(play_url).content) print('>>>1080P下载完成!!!')
至此,我们想要的超清MV便可收入囊中!演示:
最后,附上源码:
import requests import hashlib from lxml import etree import urllib3 import winreg import os # mv保存地址 def get_desktop(): key=winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders') return winreg.QueryValueEx(key, "Desktop")[0] save_path_real=get_desktop()+'\\' + "酷狗音乐MTV" + "\\" headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"} print('>>>>>>>>>>>>酷狗MV下载程序开始<<<<<<<<<<<<<\n') print('>>>>>>>>>>>>示例URL:http://www.kugou.com/mvweb/html/mv_1138506.html<<<<<<<<<<<<<\n') # 获取mv的hash和title def get_mv_name_hash(html, save_path_real): web_data=etree.HTML(html) datas=web_data.xpath('//script[@type="text/javascript"]') x=datas[1].xpath('./text()')[0].strip().split('.')[0].split(',') mv_hash=x[1].split('"')[1] mv_title=x[2].split('"')[1] print('MV哈希值:%s,MV标题:%s'%(mv_hash,mv_title)) # 获取key key=kugou_hash(mv_hash) # 下载MV download_mv(mv_title,mv_hash,key,save_path_real) # 哈希加密的教程链接,转1:https://www.jianshu.com/p/cc2468b82e90 # 哈希加密的教程链接,转2:https://www.jianshu.com/p/cb77838c69db # 得到key # 传入MV哈希值 返回KEY值 def kugou_hash(mv_hash): m=hashlib.md5() # 哈希 md5加密 # #song_hash_upper=mv_hash.upper()#大写 kugou_slat='kugoumvcloud' # 盐 m.update((mv_hash + kugou_slat).encode("utf8")) # 哈希值+盐 key=m.hexdigest() return key # 返回key值 # 下载 def download_mv(mv_title,mv_hash,key,save_path_real): if not os.path.exists(save_path_real): os.mkdir(save_path_real) print("%s正在下载,请稍候..."%mv_title) download_url="http://trackermv.kugou.com/interface/index/cmd=100&hash={}&key={}&pid=6&ext=mp4&ismp3=0".format(mv_hash,key) hash_res=requests.get(download_url, headers=headers) hash_js=hash_res.json() # json格式 try: play_url=hash_js['mvdata']['rq']['downurl'] file_suffix=play_url.split('/')[-1].split('.')[-1] if play_url !="": print('1080P MV下载地址已找到,请稍候...') with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp: fp.write(requests.get(play_url).content) print('>>>1080P下载完成!!!') except: try: play_url=hash_js['mvdata']['sq']['downurl'] file_suffix=play_url.split('/')[-1].split('.')[-1] if play_url !="": print('720P MV下载地址已找到,请稍候...') with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp: fp.write(requests.get(play_url).content) print('>>>720P下载完成!!!') except: try: play_url=hash_js['mvdata']['hd']['downurl'] file_suffix=play_url.split('/')[-1].split('.')[-1] if play_url !="": print('540P MV下载地址已找到,请稍候...') with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp: fp.write(requests.get(play_url).content) print('>>>540P下载完成!!!') except: print('>>>无MV!') # 获取html def get_html(url): access_url=url # 移除SSL验证时的警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) response=requests.get(access_url, headers=headers, verify=False) html=response.text # 获取mv的hash和标题 get_mv_name_hash(html, save_path_real) def main(): # MV页面链接 url=input('>>>请输入酷狗音乐MV播放页URL地址:') get_html(url) continue_download=input('>>>是否继续下载?输入Y or N,其余字符不可用!\n\n') if continue_download=='Y' or continue_download=='y': main() # 启动程序 if __name__=='__main__': main()
好了,今天的分享到此就结束了,有想交流的,请记得私信我哦!
代码也可以打包成exe文件,电脑安装python也能下载,我已经打包好了,如果小伙伴有需要的,也记得私信我哦。
*请认真填写需求信息,我们会在24小时内与您取得联系。