本文對使用到的技術僅做簡單的介紹,若想了解更多,請前往相應的官網網站進行學習。
本文適合對爬蟲相關知識接觸不多的新手,主要是普及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小時內與您取得聯系。