限制網(wǎng)站訪問ip臺(tái)州網(wǎng)站建設(shè)方案推廣
在當(dāng)今數(shù)字化時(shí)代,YouTube作為全球最大的視頻分享平臺(tái)之一,擁有海量的視頻資源。無(wú)論是進(jìn)行市場(chǎng)調(diào)研、內(nèi)容創(chuàng)作還是學(xué)術(shù)研究,能夠高效地獲取YouTube上的相關(guān)視頻信息都顯得尤為重要。今天,我將為大家介紹一個(gè)基于Python實(shí)現(xiàn)的YouTube視頻搜索爬蟲,幫助大家快速獲取特定關(guān)鍵詞相關(guān)的視頻基本信息。
廢話不多說(shuō),先上結(jié)果:
一、項(xiàng)目背景與需求
隨著信息的爆炸式增長(zhǎng),如何從海量的YouTube視頻中快速找到符合特定需求的內(nèi)容成為了一個(gè)挑戰(zhàn)。例如,對(duì)于內(nèi)容創(chuàng)作者來(lái)說(shuō),了解某一熱門話題下的視頻趨勢(shì)和優(yōu)秀作品能夠?yàn)樽约旱膭?chuàng)作提供靈感;對(duì)于市場(chǎng)研究人員而言,分析特定品牌或產(chǎn)品的相關(guān)視頻數(shù)據(jù)有助于洞察市場(chǎng)動(dòng)態(tài)和用戶反饋。因此,開發(fā)一個(gè)能夠自動(dòng)搜索并提取YouTube視頻信息的爬蟲工具具有重要的應(yīng)用價(jià)值。
二、技術(shù)選型與實(shí)現(xiàn)思路
1.技術(shù)選型
-
Python語(yǔ)言:Python以其簡(jiǎn)潔易讀的語(yǔ)法和強(qiáng)大的庫(kù)支持,成為了爬蟲開發(fā)的首選語(yǔ)言。它提供了豐富的網(wǎng)絡(luò)請(qǐng)求庫(kù)(如
requests
)、數(shù)據(jù)處理庫(kù)(如pandas
)以及JSON解析等功能,能夠高效地實(shí)現(xiàn)爬蟲的各項(xiàng)功能。 -
requests
庫(kù):用于發(fā)送HTTP請(qǐng)求,獲取YouTube網(wǎng)頁(yè)的響應(yīng)數(shù)據(jù)。它支持自定義請(qǐng)求頭、參數(shù)和數(shù)據(jù),能夠靈活地模擬瀏覽器行為,從而獲取到我們需要的視頻搜索結(jié)果數(shù)據(jù)。 -
pandas
庫(kù):主要用于數(shù)據(jù)的存儲(chǔ)和處理。在爬取到視頻信息后,我們可以將其存儲(chǔ)為DataFrame
對(duì)象,方便后續(xù)的數(shù)據(jù)分析、篩選和導(dǎo)出為CSV文件等操作。
2.實(shí)現(xiàn)思路
-
模擬搜索請(qǐng)求:通過(guò)分析YouTube的搜索功能,我們發(fā)現(xiàn)其搜索結(jié)果是通過(guò)向特定的API接口發(fā)送請(qǐng)求并攜帶相應(yīng)的參數(shù)和數(shù)據(jù)來(lái)獲取的。因此,我們需要構(gòu)造類似的請(qǐng)求,包括設(shè)置合適的請(qǐng)求頭(如
User-Agent
、Referer
等)、參數(shù)(如搜索關(guān)鍵詞、分頁(yè)令牌等)以及請(qǐng)求體(包含搜索的上下文信息等),以模擬用戶在瀏覽器中進(jìn)行搜索的行為。 -
解析響應(yīng)數(shù)據(jù):YouTube返回的搜索結(jié)果數(shù)據(jù)是JSON格式的,其中包含了視頻的基本信息,如視頻鏈接、標(biāo)題、播放量、發(fā)布時(shí)間、作者昵稱和主頁(yè)鏈接等。我們需要編寫解析邏輯,從JSON數(shù)據(jù)中提取出這些有用的信息,并將其整理成結(jié)構(gòu)化的數(shù)據(jù)格式,以便后續(xù)的存儲(chǔ)和分析。
-
分頁(yè)爬取與數(shù)據(jù)存儲(chǔ):由于YouTube的搜索結(jié)果通常會(huì)有很多頁(yè),為了完整地獲取所有相關(guān)視頻信息,我們需要實(shí)現(xiàn)分頁(yè)爬取的功能。在每次請(qǐng)求中,我們可以通過(guò)解析返回?cái)?shù)據(jù)中的分頁(yè)令牌來(lái)判斷是否存在下一頁(yè),并循環(huán)發(fā)送請(qǐng)求直到獲取到所有頁(yè)面的數(shù)據(jù)。同時(shí),我們將爬取到的視頻數(shù)據(jù)存儲(chǔ)到CSV文件中,方便用戶后續(xù)查看和使用。
三、代碼實(shí)現(xiàn)
1.發(fā)送搜索請(qǐng)求
我們實(shí)現(xiàn)了get
方法,用于發(fā)送搜索請(qǐng)求并獲取YouTube的響應(yīng)數(shù)據(jù)。在這個(gè)方法中,我們根據(jù)是否是首次請(qǐng)求(通過(guò)token
參數(shù)判斷),構(gòu)造不同的請(qǐng)求體數(shù)據(jù)。首次請(qǐng)求時(shí),我們直接傳遞搜索關(guān)鍵詞;后續(xù)分頁(yè)請(qǐng)求時(shí),則使用分頁(yè)令牌來(lái)獲取下一頁(yè)的數(shù)據(jù)。
def get(self, keyword, token):url = "https://www.youtube.com/youtubei/v1/search"params = {"prettyPrint": "false"}if token != "-1":data = {"context": {"client": {"hl": "zh-CN","gl": "HK","remoteHost": "103.17.98.17","deviceMake": "","deviceModel": "","visitorData": "CgthSS1jZ09JTTY3ayj44Iy9BjIKCgJISxIEGgAgWg%3D%3D","userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36,gzip(gfe)","clientName": "WEB","clientVersion": "2.20250203.06.01","osName": "Windows","osVersion": "10.0","originalUrl": f"https://www.youtube.com/results?search_query={quote(keyword)}&themeRefresh=1","platform": "DESKTOP","clientFormFactor": "UNKNOWN_FORM_FACTOR",
…………}else:data = {"context": {"client": {"hl": "zh-CN","gl": "HK","remoteHost": "103.17.98.17","deviceMake": "","deviceModel": "","visitorData": "CgthSS1jZ09JTTY3ayj44Iy9BjIKCgJISxIEGgAgWg%3D%3D","userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36,gzip(gfe)","clientName": "WEB","clientVersion": "2.20250203.06.01","osName": "Windows","osVersion": "10.0","originalUrl": f"https://www.youtube.com/results?search_query={quote(keyword)}","platform": "DESKTOP","clientFormFactor": "UNKNOWN_FORM_FACTOR",
…………}data = json.dumps(data, separators=(',', ':'))response = requests.post(url, headers=headers, cookies=cookies, params=params, data=data, timeout=(3, 10))return response.json()
2.解析響應(yīng)數(shù)據(jù)
在獲取到Y(jié)ouTube的響應(yīng)數(shù)據(jù)后,我們需要從中提取出有用的視頻信息。這部分邏輯由parse_data
方法實(shí)現(xiàn)。我們首先解析出視頻的基本信息,如視頻鏈接、標(biāo)題、播放量、發(fā)布時(shí)間、作者昵稱和主頁(yè)鏈接等,并將這些信息存儲(chǔ)到一個(gè)列表中。同時(shí),我們還會(huì)嘗試從響應(yīng)數(shù)據(jù)中獲取分頁(yè)令牌,以便后續(xù)進(jìn)行分頁(yè)爬取。
def parse_data(self, keyword, contents):token = Nonecontents_1 = contents[0]['itemSectionRenderer']['contents']result_list = []for c in contents_1:videoRenderer = c.get('videoRenderer')if videoRenderer:videoId = videoRenderer.get('videoId')video_url = f"https://www.youtube.com/watch?v={videoId}"title = "".join([tt['text'] for tt in videoRenderer['title'].get('runs', [])])viewCountText = videoRenderer.get('viewCountText', {}).get('simpleText', '')publishedTimeText = videoRenderer.get('publishedTimeText', {}).get('simpleText', '')username = videoRenderer['ownerText']['runs'][0]['text']uid_ = videoRenderer['ownerText']['runs'][0]['navigationEndpoint']['browseEndpoint']['canonicalBaseUrl']p_url = f"https://www.youtube.com{uid_}"item = {"關(guān)鍵詞": keyword,"視頻鏈接": video_url,"標(biāo)題": title,"發(fā)布時(shí)間": publishedTimeText,"播放量": viewCountText,"昵稱": username,"主頁(yè)鏈接": p_url,}self.log(f"找到視頻:{title}")result_list.append(item)try:token = contents[1]['continuationItemRenderer']['continuationEndpoint']['continuationCommand']['token']except:passif result_list:self.save_data(self.saveFileName, result_list)return token
3.主邏輯與分頁(yè)爬取
最后,我們實(shí)現(xiàn)了run
方法和main
方法。run
方法用于控制爬蟲的運(yùn)行邏輯,包括發(fā)送搜索請(qǐng)求、解析響應(yīng)數(shù)據(jù)、存儲(chǔ)數(shù)據(jù)以及分頁(yè)爬取等功能。main
方法則用于讀取關(guān)鍵詞文件,并依次對(duì)每個(gè)關(guān)鍵詞啟動(dòng)爬蟲。
?
def run(self, keyword, token="-1"):self.current_token = tokenself.saveFileName = keywordwhile self.is_running and self.current_token:try:# 檢查頁(yè)數(shù)限制if self.max_pages and self.current_page >= self.max_pages:self.log(f"已達(dá)到設(shè)定的{self.max_pages}頁(yè)限制,停止爬取")breakself.log(f"正在爬取第 {self.current_page + 1} 頁(yè)")dataJson = self.get(keyword, self.current_token)if self.current_token == "-1":contents = dataJson["contents"]["twoColumnSearchResultsRenderer"]["primaryContents"]["sectionListRenderer"]["contents"]else:contents = dataJson["onResponseReceivedCommands"][0]["appendContinuationItemsAction"]["continuationItems"]self.current_token = self.parse_data(keyword, contents)self.current_page += 1except Exception as e:self.log(f"發(fā)生錯(cuò)誤:{str(e)}")breakdef main(self):keyword_list = [k.strip() for k in open('關(guān)鍵詞.txt', encoding='utf-8').readlines() if k.strip() != ""]xuhao = 0for index, keyword in enumerate(keyword_list[xuhao:], xuhao):print((index, keyword))self.run(keyword)
?
四、總結(jié)
通過(guò)以上代碼的實(shí)現(xiàn),我們成功地開發(fā)了一個(gè)能夠自動(dòng)搜索并提取YouTube視頻信息的爬蟲工具。它可以幫助我們快速獲取特定關(guān)鍵詞相關(guān)的視頻數(shù)據(jù),并將其存儲(chǔ)到CSV文件中,方便后續(xù)的分析和使用。在實(shí)際應(yīng)用中,我們還可以根據(jù)需求對(duì)爬蟲進(jìn)行進(jìn)一步的優(yōu)化和擴(kuò)展,例如增加代理支持、設(shè)置爬取頻率等,以提高爬蟲的穩(wěn)定性和效率。
希望這篇文章能夠幫助你更好地理解和實(shí)現(xiàn)YouTube視頻搜索爬蟲。如果有任何問題或建議,歡迎在評(píng)論區(qū)留言交流!
?