Python进阶实战 1.0 :爬取豆瓣TOP250电影排行榜
爬取豆瓣TOP250電影排行榜
學習指南
本系列課程沒有必然的前后關系(除非特別強調)
因此,你可以選擇任意一個喜歡的案例開始學習!
項目需求
很多朋友在看一部電影前都喜歡先找一下網友們對該片的評價。
說到電影評分的網站,除了國外的 IMDB 和爛番茄,國內要數豆瓣最為出名。
主要原因是豆瓣有一套完整的評分和防水軍機制
在這套機制下,豆瓣評分高的電影不一定是所有人都喜歡的,但是豆瓣評分低的電影,一定是實打實的爛片!
雖然每個人的喜好偏愛不同,但通常豆瓣評分 8 分以上的電影,都是值得一看的。
豆瓣還專門提供了一個 TOP250 的電影鏈接 ->?https://movie.douban.com/top250
溫馨提示:別看這些片兒都“挺老”的,很多都是現在很難再超越的經典,建議豆瓣的 TOP250 都看一遍,相信你將會受益匪淺!
要求:編寫一個小爬蟲,將豆瓣 TOP250 的電影名、評分以及相關的資料保存到一個文件中。
開發思路
思路一:
在《零基礎入門學習Python》系列課程中,給大家講過使用 Python 開發爬蟲,那時候是利用 urllib 模塊實現網絡抓取功能。但現在請忘掉它,因為在 Python 中,有一個更好地替代者 —— Requests。
Requests 簡化了 urllib 的諸多冗雜且無意義的操作,并提供了更強大的功能。不是我吹,Requests 是 Python 所有模塊中最受歡迎的一個,全世界最優秀的程序員都在使用它!
有關 Requests 模塊的安裝及使用,請參考 ->?Requests 模塊中文文檔
使用 Requests 模塊的?get()?方法從服務器上下載一個頁面之后,就需要解析它。
思路二:
解析網頁內容小甲魚推薦使用 BeautifulSoup 模塊,它可以化腐朽為神奇,將一個復雜的網頁結構轉化為書籍目錄的形式供你瀏覽。
>>> import requests >>> import bs4 >>> res = requests.get("https://movie.douban.com/top250") >>> soup = bs4.BeautifulSoup(res.text, "html.parser") >>> targets = soup.find_all("div", class_="hd") >>> for each in targets:print(each.a.span.text)肖申克的救贖 霸王別姬 這個殺手不太冷 阿甘正傳 美麗人生 千與千尋 辛德勒的名單 泰坦尼克號 盜夢空間 機器人總動員 海上鋼琴師 三傻大鬧寶萊塢 忠犬八公的故事 放牛班的春天 大話西游之大圣娶親 教父 龍貓 楚門的世界 亂世佳人 天堂電影院 觸不可及 當幸福來敲門 熔爐 無間道 搏擊俱樂部這些嘩啦啦的數據是怎么得來的呢?
我們先來看下 HTML 源代碼:
發現每個電影的標題都是位于?<div class="hd">...</div>?標簽中的,它的從屬關系是:div?->?a?->?span。
所以我們先調用 find_all() 方法,找到所有?class="hd"?的?div?標簽,然后按照從屬關系即可直接取出電影名。
怎么樣?是不是和翻書查字典一樣簡單!
有關 BeautifulSoup 模塊的安裝及使用,請參考 -> BeautifulSoup4 模塊中文文檔
模塊檔案
- Requests 模塊中文文檔(一)
- Requests 模塊中文文檔(二)
- Requests 模塊中文文檔(三)
- Requests 模塊中文文檔(四)
- Requests 模塊中文文檔(五)
- Requests 模塊中文文檔(六)
- BeautifulSoup4 模塊中文文檔
代碼清單
import requests import bs4 import redef open_url(url):# 使用代理# proxies = {"http": "127.0.0.1:1080", "https": "127.0.0.1:1080"}headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}# res = requests.get(url, headers=headers, proxies=proxies)res = requests.get(url, headers=headers)return resdef find_movies(res):soup = bs4.BeautifulSoup(res.text, 'html.parser')# 電影名movies = []targets = soup.find_all("div", class_="hd")for each in targets:movies.append(each.a.span.text)# 評分ranks = []targets = soup.find_all("span", class_="rating_num")for each in targets:ranks.append(' 評分:%s ' % each.text)# 資料messages = []targets = soup.find_all("div", class_="bd")for each in targets:try:messages.append(each.p.text.split('\n')[1].strip() + each.p.text.split('\n')[2].strip())except:continueresult = []length = len(movies)for i in range(length):result.append(movies[i] + ranks[i] + messages[i] + '\n')return result# 找出一共有多少個頁面 def find_depth(res):soup = bs4.BeautifulSoup(res.text, 'html.parser')depth = soup.find('span', class_='next').previous_sibling.previous_sibling.textreturn int(depth)def main():host = "https://movie.douban.com/top250"res = open_url(host)depth = find_depth(res)result = []for i in range(depth):url = host + '/?start=' + str(25 * i)res = open_url(url)result.extend(find_movies(res))with open("豆瓣TOP250電影.txt", "w", encoding="utf-8") as f:for each in result:f.write(each)if __name__ == "__main__":main()補充
盡管豆瓣設計了一套防止水軍刷分的機制,但仍然是有漏網之魚的。
于是有網友給出了一套非常直觀有效地判斷電影好壞的方法
通常只應天上有的神作,評分是呈現“F”形狀的,也就是 5 分和 4 分居多,1、2、3 分幾乎沒有。
比如觸及靈魂深處的越獄神作《肖申克的救贖》
又如勵志神作《阿甘正傳》
一般的好片(值得到電影院去支持的)評分是呈現“P”形狀的,也就是 3、4、5 分占主導,1 和 2 分較少。
比如《殺破狼2》,講真,張晉在里面主演的反派確實帥到掉渣
還有前期紅遍全國的《戰狼2》
普通爛片通常是呈現“b”的形狀,也就是 4、5 分比較少,1、2、3 分占據多數。
比如《小時代》(個人觀點,不喜勿噴)
有些雖然是爛片,但是剛上映時水軍(刷分)特別多的
或者是只有粉絲喜歡,一般人根本看不下去的
這類片的評分是呈現一個“C”的形狀……(個人觀點,不喜勿噴)
但隨著看的人越來越多,其終將呈現出爛片的特征(個人觀點,不喜勿噴)
最后還有一種終極爛片,就是本身就是爛片,然后沒有粉絲也沒錢請水軍的那種……
評分是呈現出“L”形的,比如前陣子為了評分的事兒還聲稱要豆瓣道歉賠償的《純潔心靈·逐夢演藝圈》(個人觀點,不喜勿噴)
光聽名字就是一陣酥麻?
?
總結
以上是生活随笔為你收集整理的Python进阶实战 1.0 :爬取豆瓣TOP250电影排行榜的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker Jar项目启动慢
- 下一篇: python实现飞机大战源代码+素材+项