戰(zhàn)指南)
用 Python 打造 IMDB 電影信息爬蟲Movie Information Scraper 源碼解析與實(shí)戰(zhàn)指南【免費(fèi)下載鏈接】python-mini-projectsA collection of simple python mini projects to enhance your python skills項(xiàng)目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects本指南圍繞 python-mini-projects 倉(cāng)庫(kù)中的 Movie Information Scraper 項(xiàng)目完整講解如何僅用requests與beautifulsoup4兩個(gè)庫(kù)從 IMDB 抓取電影的片名、年份、評(píng)分、時(shí)長(zhǎng)、上映日期、類型、導(dǎo)演、編劇、主演與劇情簡(jiǎn)介等十余項(xiàng)元數(shù)據(jù)。讀完本文你將掌握「搜索頁(yè) → 詳情頁(yè) → 劇情摘要頁(yè)」的三段式抓取思路、BeautifulSoup 選擇器在真實(shí)頁(yè)面中的落地寫法以及一套可復(fù)用的容錯(cuò)處理范式。一、項(xiàng)目概述這個(gè)腳本能做什么Movie Information Scraper 是 python-mini-projects 倉(cāng)庫(kù)projects/目錄下的一個(gè)命令行電影信息抓取腳本核心文件為 movieInfoScraper.py。它解決的問題非常具體用戶只輸入一個(gè)電影名腳本自動(dòng)在 IMDB 上定位到該電影并返回一份結(jié)構(gòu)化信息清單典型輸出包括片名Name與年份YearIMDB 評(píng)分Rating與片長(zhǎng)Runtime上映日期Release Date與類型Genres導(dǎo)演Director、編劇Writer、主演Cast劇情簡(jiǎn)介Plot Summary腳本的入口邏輯簡(jiǎn)單直白movieInfoScraper.py交互式讀取電影名 → 調(diào)用核心函數(shù)getMovieDetails()→ 若未找到則提示No movie of this name found !!!!!并退出否則按字段逐行打印結(jié)果。整個(gè)流程無(wú)需瀏覽器、無(wú)需 API Key只依賴兩個(gè)外部庫(kù)。二、運(yùn)行環(huán)境與依賴安裝按項(xiàng)目 README 的說(shuō)明腳本只有兩個(gè)外部依賴均聲明在 requirements.txt 中beautifulsoup4 requests2.23.0安裝方式為標(biāo)準(zhǔn)的 pip 批量安裝pip install -r requirements.txt使用前提Python 3 環(huán)境README 中的運(yùn)行命令為python3可正常訪問 IMDB 的網(wǎng)絡(luò)環(huán)境requests2.23.0是倉(cāng)庫(kù)鎖定的版本beautifulsoup4未鎖版本按實(shí)際環(huán)境解析安裝即可。若本機(jī)已有較新的requests直接使用亦可但復(fù)現(xiàn)倉(cāng)庫(kù)原樣時(shí)建議遵循requirements.txt的版本約束。三、快速上手命令行用法在項(xiàng)目目錄下直接執(zhí)行python3 movieInfoScraper.py腳本會(huì)提示Enter the movie name whose details are to be fetched輸入電影名無(wú)需區(qū)分大小寫空格會(huì)被自動(dòng)處理例如avengers infinity war回車后即可看到完整的電影信息輸出。以下是 README 附帶的運(yùn)行效果截圖所展示的完整輸出示例Avengers: Infinity War (2018) Rating: 8.4 Runtime: 2h 29m Release Date: 27 April 2018 (India) Genres: Action, Adventure, Sci-Fi Director: Anthony Russo, Joe Russo Writer: Christopher Markus, Stephen McFeely Cast: Robert Downey Jr., Chris Hemsworth, Mark Ruffalo Plot Summary: The Avengers and their allies must be willing to sacrifice all in an attempt to defeat the powerful Thanos before his blitz of devastation and ruin puts an end to the universe.同一張截圖中還演示了異常輸入的處理當(dāng)輸入不存在的電影名如kfjgkfjk23423時(shí)腳本輸出No movie of this name found !!!!并退出不會(huì)拋出堆棧異?!@正是下文要講的容錯(cuò)設(shè)計(jì)在起作用。四、源碼級(jí)解析三段式抓取架構(gòu)雖然腳本看起來(lái)只有一個(gè)函數(shù)但getMovieDetails()movieInfoScraper.py內(nèi)部實(shí)際完成了三次 HTTP 請(qǐng)求、三個(gè)不同頁(yè)面的接力解析這是理解整個(gè)項(xiàng)目?jī)r(jià)值的關(guān)鍵。4.1 第一段構(gòu)造搜索請(qǐng)求定位電影url https://www.imdb.com query /search/title?title movienamequery query .join(movieName.strip().split( )) html requests.get(url movienamequery title_typefeature)這段代碼將用戶輸入按空格拆分成單詞、再用連接得到 IMDB 標(biāo)題搜索的查詢串。例如輸入avengers infinity war時(shí)實(shí)際請(qǐng)求的 URL 為https://www.imdb.com/search/title?titleavengersinfinitywartitle_typefeature其中title_typefeature參數(shù)把搜索范圍限定在電影長(zhǎng)片feature film從而避免混入劇集TV series、短片等類型這是搜索結(jié)果準(zhǔn)確性的一大保障。之后用 BeautifulSoup 解析頁(yè)面并只取搜索結(jié)果中的第一條result bs.find(h3, {class: lister-item-header}) if result is None: return None movielink url result.a.attrs[href] movieDetails[name] result.a.text如果搜索列表中沒有l(wèi)ister-item-header元素說(shuō)明查無(wú)此片函數(shù)直接返回None由主程序兜底提示并退出。一旦找到就提取該條目的相對(duì)鏈接href拼接出電影詳情頁(yè)的完整地址。4.2 第二段解析詳情頁(yè)抽取主體字段拿到詳情頁(yè)地址后再次請(qǐng)求并解析movieInfoScraper.py各字段的提取方式如下字段頁(yè)面選擇器提取方式異常兜底Yearspan#titleYear取其內(nèi)a標(biāo)簽文本Not availableGenresdiv.subtext取所有title屬性為空的a標(biāo)簽文本—Ratingdiv.ratingValue取其內(nèi)span文本Not yet ratedRuntimediv.subtext取time標(biāo)簽文本并strip()Not availableRelease Datediv.subtext取titleSee more release dates的a文本—Directorsdiv.credit_summary_item第一個(gè)取其中所有a標(biāo)簽文本—Writersdiv.credit_summary_item第二個(gè)取href含name的a文本見下方異常處理Castdiv.credit_summary_item第三個(gè)取href含name的a文本復(fù)用 Writers 兜底值得注意的兩個(gè)細(xì)節(jié)類型與人員的過(guò)濾技巧提取類型時(shí)用{title: None}排除掉「See more release dates」這類帶title屬性的鏈接提取編劇與主演時(shí)用name in i.attrs[href]只保留指向影人主頁(yè)/name/...的鏈接從而天然過(guò)濾掉「See full cast crew」等無(wú)關(guān)入口。這種「利用鏈接特征做語(yǔ)義過(guò)濾」的手法在真實(shí)爬蟲中非常實(shí)用。Credit 區(qū)域的結(jié)構(gòu)性假設(shè)腳本假定credit_summary_item依次為 Director、Writers、Cast 三塊直接按下標(biāo)[0]、[1]、[2]取值因此對(duì)頁(yè)面結(jié)構(gòu)有較強(qiáng)依賴這也是異常處理集中于此的原因。4.3 第三段補(bǔ)抓劇情簡(jiǎn)介獨(dú)立的 AJAX 請(qǐng)求劇情簡(jiǎn)介是該項(xiàng)目實(shí)現(xiàn)上最有代表性的一個(gè)點(diǎn)源碼注釋movieInfoScraper.py寫得很清楚IMDB 詳情頁(yè) HTML 中并不包含劇情文本它由頁(yè)面后續(xù)的 AJAX 調(diào)用加載。因此腳本直接對(duì)詳情頁(yè)地址追加plotsummary后綴發(fā)起第三次請(qǐng)求html requests.get(movielink plotsummary) bs BeautifulSoup(html.text, html.parser) movieDetails[plot] bs.find(li, {class: ipl-zebra-list__item}).p.text.strip()即在詳情頁(yè) URL 后拼上plotsummary得到獨(dú)立的劇情摘要頁(yè)面再定位到li.ipl-zebra-list__item中的段落文本作為劇情簡(jiǎn)介。這種「頁(yè)面數(shù)據(jù)不全就尋找它對(duì)應(yīng)的獨(dú)立接口頁(yè)」的思路是繞過(guò)動(dòng)態(tài)加載數(shù)據(jù)的通用做法之一。4.4 數(shù)據(jù)結(jié)構(gòu)一個(gè)字典裝下全部字段所有抓取結(jié)果被統(tǒng)一裝進(jìn)movieDetails字典其中g(shù)enres、directors、writers、cast為列表其余為字符串。主程序打印時(shí)對(duì)列表做, .join()拼接輸出movieInfoScraper.py。這種「函數(shù)返回統(tǒng)一結(jié)構(gòu)體、調(diào)用方只負(fù)責(zé)展示」的設(shè)計(jì)讓后續(xù)改造成 API 返回 JSON、或接入 GUI 都非常容易。五、異常處理與邊界情況源碼在三個(gè)典型邊界上做了防御體現(xiàn)了小型爬蟲腳本應(yīng)有的穩(wěn)健性查無(wú)此片搜索列表為空時(shí)返回None主程序打印No movie of this name found !!!!!并quit()不會(huì)繼續(xù)解引用空對(duì)象。字段缺失AttributeError年份、評(píng)分、時(shí)長(zhǎng)分別用try/except AttributeError包裹缺失時(shí)降級(jí)為Not available/Not yet rated保證整段流程不中斷。人員信息不完整IndexError部分電影的詳情頁(yè)沒有獨(dú)立的 Cast 區(qū)塊導(dǎo)致creditSummary[2]越界。源碼的處理是將原本屬于 Writers 的列表回填給cast再把writers置為Not foundmovieInfoScraper.py保證輸出結(jié)構(gòu)始終完整。六、注意事項(xiàng)與局限性使用本項(xiàng)目時(shí)需要了解以下幾點(diǎn)以避免誤用強(qiáng)依賴 IMDB 頁(yè)面結(jié)構(gòu)所有選擇器如lister-item-header、ratingValue、credit_summary_item都基于腳本編寫時(shí)的 IMDB HTML 結(jié)構(gòu)。IMDB 改版后選擇器可能失效屬于網(wǎng)頁(yè)爬蟲的固有風(fēng)險(xiǎn)腳本本身未內(nèi)置 User-Agent、代理或重試機(jī)制長(zhǎng)時(shí)間高頻請(qǐng)求易被目標(biāo)站點(diǎn)限制建議僅用于學(xué)習(xí)與低頻個(gè)人用途。無(wú)緩存與限流腳本對(duì)每個(gè)輸入電影都會(huì)發(fā)起 23 次實(shí)時(shí)請(qǐng)求批量抓取時(shí)應(yīng)自行加入延時(shí)與去重。適用范圍該腳本是命令行交互式工具README 給出的運(yùn)行方式即python3 movieInfoScraper.py若需批量處理可直接 import 其中的getMovieDetails函數(shù)并循環(huán)調(diào)用返回值即為可直接序列化的字典。七、小結(jié)Movie Information Scraper 用約 80 行代碼完整演示了「搜索定位 → 詳情解析 → 補(bǔ)抓 AJAX 數(shù)據(jù)」的經(jīng)典爬蟲鏈路requests負(fù)責(zé)三次請(qǐng)求BeautifulSoup負(fù)責(zé)選擇器解析字典統(tǒng)一承載結(jié)果try/except兜底三種真實(shí)邊界。對(duì)于想入門網(wǎng)頁(yè)抓取的開發(fā)者它是一個(gè)結(jié)構(gòu)清晰、可讀性極佳的最小范本在此基礎(chǔ)上你可以進(jìn)一步擴(kuò)展多結(jié)果選擇、翻頁(yè)抓取、結(jié)果導(dǎo)出 CSV/JSON 等能力。相關(guān)完整實(shí)現(xiàn)請(qǐng)查閱 movieInfoScraper.py 與 requirements.txt。【免費(fèi)下載鏈接】python-mini-projectsA collection of simple python mini projects to enhance your python skills項(xiàng)目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考