Python爬取分析豆瓣電影Top250
本人最近剛學習python,入門了python爬蟲,第一個練手專案是自己爬取了豆瓣電影Top250榜單,分析一下電影排名、評分、國家、型別之間有什麼關係。剛剛入門,希望一起交流學習。
好,專案最開始需要找到豆瓣電影Top250榜單進行分析連結:
檢視各頁面的url:
第一頁:https://movie.douban.com/top250?start=0&filter=
第二頁:https://movie.douban.com/top250?start=25&filter=
第三頁:https://movie.douban.com/top250?start=50&filter=
可以看到每一頁為start=等號後的值加25,從此,知道了爬取頁面的url規律。
接下來可以選用BeautifulSoup進行頁面資訊的提取,主要提取電影名字、國家、年份和分數
這塊在網上簡單瞭解了一下BeautifulSoup的用法,熟悉一下就可以進行操作測試啦!
程式碼如下:
from bs4 import BeautifulSoup
from lxml import html
import xml
import requests
rank = 1
def write_one_page(soup):
global rank
for k in soup.find('div',class_='article').find_all('div',class_='info'):
name = k.find('div',class_='hd').find_all('span')#電影名字
score = k.find('div',class_='star').find_all('span')#分數
inq = k.find('p',class_='quote').find('span')#一句話簡介
#抓取年份、國家
actor_infos_html = k.find(class_='bd')
#strip() 方法用於移除字串頭尾指定的字元(預設為空格)
actor_infos = actor_infos_html.find('p').get_text().strip().split('\n')
actor_infos1 = actor_infos[0].split('\xa0\xa0\xa0')
director = actor_infos1[0][3:]
role = actor_infos[1]
year_area = actor_infos[1].lstrip().split('\xa0/\xa0')
year = year_area[0]
country = year_area[1]
type = year_area[2]
print(rank,name[0].string,score[1].string,inq.string,year,country,type)
#寫txt
write_to_file(rank,name[0].string,score[1].string,year,country,type,inq.string)
rank=rank+1
def write_to_file(rank,name,score,year,country,type,quote):
with open('Top_250_movie.txt', 'a', encoding='utf-8') as f:
f.write(str(rank)+';'+str(name)+';'+str(score)+';'+str(year)+';'+str(country)+';'+str(type)+';'+str(quote)+'\n')
f.close()
if __name__ == '__main__':
for i in range(10):
a = I*25
url = "https://movie.douban.com/top250?start="+str(a)+"&filter="
f = requests.get(url)
soup = BeautifulSoup(f.content, "lxml")
write_one_page(soup)
至此,將電影的資訊爬取了出來!看到資料一行行爬取出來的時候非常激動!
這裡資料是儲存在了txt檔案中,當時剛入手,對檔案儲存的操作還不是很熟悉,後邊將txt另存成了csv格式的,方便處理。這裡建議直接存成csv格式,更簡單。
所得到的資料:
一共是250條資料。接下來就是對資料進行視覺化整理。
第一個,先分析了得分與排名的情況,用matplotlib進行作圖:
最開始得到圖的座標中午一直無法顯示,後來查閱了網上的資料,新增了這樣一行程式碼得到了解決:
plt.rcParams['font.sans-serif']=['Arial Unicode MS']#防止圖片亂碼
import matplotlib.pyplot as plt
rank = list()
score = list()
with open('Top_250_movie.csv','r',encoding = "utf-8") as file:
reader = csv.DictReader(file)
rank_str = [row['rank'] for row in reader ]
with open('Top_250_movie.csv','r',encoding = "utf-8") as file:
reader = csv.DictReader(file)
score_str = [row['score'] for row in reader ]
for x in rank_str:
rank.append(int(x))
for y in score_str:
score.append(float(y))
plt.gca().invert_yaxis() #反轉y軸
plt.style.use('ggplot')
plt.scatter(score,rank)
plt.xlabel('score')
plt.ylabel('rank')
plt.title('得分和排名')
plt.show()
得到了下圖:
可以看到,電影基本還是呈現得分越高,排名越高。有少許的電影評分較高,但排名不高,這裡邊可能涉及到豆瓣具體的排名演算法,可能還跟評論數,年份有一定的關係?感興趣的可以繼續探討哈哈。
接下來看了一下得分與電影年份的關係,程式碼如下:
year = list()
score = list()
with open('Top_250_movie.csv','r',encoding = "utf-8") as file:
reader = csv.DictReader(file)
year_str = [row['year'] for row in reader ]
with open('Top_250_movie.csv','r',encoding = "utf-8") as file:
reader = csv.DictReader(file)
score_str = [row['score'] for row in reader ]
for x in year_str:
year.append(int(x))
for y in score_str:
score.append(float(y))
plt.style.use('ggplot')
plt.scatter(year,score)
plt.xlabel('year')
plt.ylabel('score')
plt.title('電影年份')
plt.show()
得到下圖:
可以看到,大部分還是集中在右側,說明觀眾對近30年較為新的電影更喜歡。這也很好理解,與電影基數有關,年代越近,投放到市場的電影也越多,越會產生高質量的電影。但近年來高分電影不多,幾乎沒有9.4分以上的電影。
然後接著又對Top250的電影國家進行了統計,主要是對爬取出電影的country的資料進行計數,有的電影包含多個合作國家,比如既是美國又是英國,這裡均統計了一次。
country = list()
with open('Top_250_movie.csv','r',encoding = "utf-8") as file:
reader = csv.DictReader(file)
country_str =' '.join([row['country'] for row in reader ])
country_list = country_str.split(' ')
#統計
country_set = set(country_list) #放入set中去除重複資料,得到所有出現的國家
for item in country_set:
country.append(country_list.count(item))#計數
country_set = list(country_set)
#排序和畫圖
plt.rcParams['savefig.dpi'] = 300 #圖片畫素
plt.rcParams['figure.dpi'] = 200 #解析度
plt.xlabel('country')
plt.ylabel('count')
plt.title('國家分析')
plt.tick_params(labelsize=7) #字型設定
mydict = dict(zip(country,country_set))
mydict_sort = sorted(mydict.items(), key=lambda e:e[0], reverse=True)
mydict_sort = dict(mydict_sort)
plt.bar(list(mydict_sort.values()), list(mydict_sort.keys()),color='lightblue')
plt.show()
得到了下圖:
可以看到,美國一家獨大,幾乎超越是其他所有國家的總和,中國大陸排名第七。國產電影還需努力呀!
後邊同理,可以分析電影型別的數量統計:
結果可以看到,排名前五的分別是劇情、愛情、喜劇、冒險、驚悚。說明最受歡迎的電影型別還是劇情,愛情類電影。這也符合電影市場,劇情和愛情類電影占多數。
至此,作為我的第一個Python爬蟲專案,就對豆瓣電影Top250的榜單進行了簡單的爬取和分析,作為入手專案個人感覺還是很好的。熟悉了頁面資訊爬取的簡單操作,資料檔案的讀寫,資料的排序和視覺化。很有收穫。當然,由於本人水平極為有限,程式碼還有很大的優化空間,小白期待大佬們的指出改進意見!
相關文章
- 使用python爬取豆瓣電影TOP250Python
- 爬取豆瓣電影Top250和資料分析
- scrapy入門:豆瓣電影top250爬取
- python——豆瓣top250爬取Python
- 【python爬蟲案例】利用python爬取豆瓣電影TOP250評分排行資料!Python爬蟲
- 正規表示式_爬取豆瓣電影排行Top250
- 豆瓣電影TOP250爬蟲及視覺化分析筆記爬蟲視覺化筆記
- 豆瓣top250資料爬取
- 手把手教你網路爬蟲(爬取豆瓣電影top250,附帶原始碼)爬蟲原始碼
- python更換代理爬取豆瓣電影資料Python
- 爬蟲教程——用Scrapy爬取豆瓣TOP250爬蟲
- scrapy爬取豆瓣電影資料
- Python爬蟲筆記(4):利用scrapy爬取豆瓣電影250Python爬蟲筆記
- Python爬蟲教程-17-ajax爬取例項(豆瓣電影)Python爬蟲
- python爬蟲 爬取豆瓣電影 1-10 ajax 資料Python爬蟲
- 資料視覺化豆瓣電影 TOP250視覺化
- Python爬取豆瓣電影的短評資料並進行詞雲分析處理Python
- 爬蟲01:爬取豆瓣電影TOP 250基本資訊爬蟲
- 【python爬蟲案例】利用python爬取豆瓣讀書評分TOP250排行資料Python爬蟲
- Python爬取電影天堂Python
- 教你用python登陸豆瓣並爬取影評Python
- 專案之爬蟲入門(豆瓣TOP250)爬蟲
- 【Python】從0開始寫爬蟲——轉身扒豆瓣電影Python爬蟲
- 豆瓣top250(go版以及python版)GoPython
- python爬取貓眼正在熱映電影Python
- python 爬取飄花電影 下載地址Python
- Python 從底層結構聊 Beautiful Soup 4(內建豆瓣最新電影排行榜爬取案例)Python
- Python3爬取貓眼電影資訊Python
- Python爬蟲例項:爬取貓眼電影——破解字型反爬Python爬蟲
- 擼個爬蟲,爬取電影種子爬蟲
- python爬取貓眼電影top100儲存到CSVPython
- Python網路爬蟲實踐案例:爬取貓眼電影Top100Python爬蟲
- java爬取豆瓣書籍資訊Java
- 批量抓取豆瓣電影圖片
- Python網路爬蟲(正則, 內涵段子,貓眼電影, 鏈家爬取)Python爬蟲
- python-爬蟲-css提取-寫入csv-爬取貓眼電影榜單Python爬蟲CSS
- 一篇文章教會你利用Python網路爬蟲實現豆瓣電影採集Python爬蟲
- 【Python爬蟲&資料分析】2018年電影,你看了幾部?Python爬蟲