日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python怎么爬取电影海报_Python 爬取猫眼数据分析《无名之辈》为何能逆袭成黑马?...

發(fā)布時(shí)間:2023/12/14 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python怎么爬取电影海报_Python 爬取猫眼数据分析《无名之辈》为何能逆袭成黑马?... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:Python 爬取貓眼數(shù)據(jù)分析《無(wú)名之輩》為何能逆襲成黑馬?

作者 | 羅昭成

責(zé)編 | 唐小引

出品 | CSDN(ID:CSDNNews)

最近幾天,有部國(guó)產(chǎn)電影因好評(píng)及口碑傳播而開(kāi)始異軍突起以黑馬之勢(shì)逆襲,在朋友圈以及微博上都會(huì)不時(shí)看到相關(guān)內(nèi)容,那便是由陳建斌、任素汐等主演的《無(wú)名之輩》。這樣一部沒(méi)有什么特別大牌或流量明星,甚至名稱(chēng)與海報(bào)都沒(méi)有什么特色的國(guó)產(chǎn)電影卻引起了很多人的注意,更是在評(píng)分上直接將同期的如《毒液》、《神奇動(dòng)物:格林德沃之罪》給 PK 了下去。這部劇從 16 日上映到現(xiàn)在,豆瓣評(píng)分 8.3 分,其中 5 星好評(píng)占 34.8%,而在貓眼上好評(píng)則直接超過(guò)了 50%。看這個(gè)數(shù)據(jù),還是一部不錯(cuò)的國(guó)產(chǎn)劇。在一個(gè)貌似平常的日子,筆者用著一臺(tái)低配的 Mac 電腦跑了一下《無(wú)名之輩》貓眼的評(píng)論數(shù)據(jù),來(lái)看看這部小成本喜劇片究竟值不值得看。

需要特別說(shuō)明一下,為什么要用貓眼的數(shù)據(jù),而不用豆瓣的?主要還是因?yàn)槎拱晔侵苯愉秩镜?HTML,而貓眼的數(shù)據(jù)是 JSON,處理起來(lái)比較方便。

獲取貓眼接口數(shù)據(jù)

作為一個(gè)長(zhǎng)期宅在家的程序員,對(duì)各種抓包簡(jiǎn)直是信手拈來(lái)。在 Chrome 中查看原代碼的模式,可以很清晰地看到接口,接口地址即為:

http://m.maoyan.com/mmdb/comments/movie/1208282.json?_v_=yes&offset=15

在 Python 中,我們可以很方便地使用request來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求,進(jìn)而拿到返回結(jié)果:

defgetMoveinfo(url):

session = requests.Session()

headers = {

"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)"

}

response = session.get(url, headers=headers)

ifresponse.status_code == 200:

returnresponse.text

returnNone

根據(jù)上面的請(qǐng)求,我們能拿到此接口的返回?cái)?shù)據(jù),數(shù)據(jù)內(nèi)容有很多信息,但有很多信息是我們并不需要的,先來(lái)總體看看返回的數(shù)據(jù):

{

"cmts":[

{

"approve": 0,

"approved": false,

"assistAwardInfo":{

"avatar": "",

"celebrityId": 0,

"celebrityName": "",

"rank": 0,

"title": ""

},

"authInfo": "",

"cityName": "貴陽(yáng)",

"content": "必須十分,借錢(qián)都要看的一部電影。",

"filmView": false,

"id": 1045570589,

"isMajor": false,

"juryLevel": 0,

"majorType": 0,

"movieId": 1208282,

"nick": "nick",

"nickName": "nickName",

"oppose": 0,

"pro": false,

"reply": 0,

"score": 5,

"spoiler": 0,

"startTime": "2018-11-22 23:52:58",

"supportComment": true,

"supportLike": true,

"sureViewed": 1,

"tagList":{

"fixed":[

{

"id": 1,

"name": "好評(píng)"

},

{

"id": 4,

"name": "購(gòu)票"

}

]

},

"time": "2018-11-22 23:52",

"userId": 1871534544,

"userLevel": 2,

"videoDuration": 0,

"vipInfo": "",

"vipType": 0

}

]

}

如此多的數(shù)據(jù),我們感興趣的只有以下這幾個(gè)字段:

nickName,cityName,content,startTime,score

接下來(lái),進(jìn)行我們比較重要的數(shù)據(jù)處理,從拿到的JSON數(shù)據(jù)中解析出需要的字段:

defparseInfo(data):

data = json.loads(html)[ 'cmts']

foritem indata:

yield{

'date':item[ 'startTime'],

'nickname':item[ 'nickName'],

'city':item[ 'cityName'],

'rate':item[ 'score'],

'conment':item[ 'content']

}

拿到數(shù)據(jù)后,我們就可以開(kāi)始數(shù)據(jù)分析了。但是為了避免頻繁地去貓眼請(qǐng)求數(shù)據(jù),需要將數(shù)據(jù)存儲(chǔ)起來(lái),在這里,筆者使用的是SQLite3,放到數(shù)據(jù)庫(kù)中,更加方便后續(xù)的處理。存儲(chǔ)數(shù)據(jù)的代碼如下:

defsaveCommentInfo(moveId, nikename, comment, rate, city, start_time)

conn= sqlite3.connect('unknow_name.db')

conn.text_factory=str

cursor= conn.cursor()

ins="insertintocommentsvalues(?,?,?,?,?,?)"

v= (moveId, nikename, comment, rate, city, start_time)

cursor.execute(ins,v)

cursor.close()

conn.commit()

conn.close()

數(shù)據(jù)處理

因?yàn)榍拔奈覀兪鞘褂脭?shù)據(jù)庫(kù)來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)的,因此可以直接使用 SQL 來(lái)查詢自己想要的結(jié)果,比如評(píng)論前五的城市都有哪些:

SELECT city, count(*) rate_count FROM comments GROUP BY city ORDER BY rate_count DESC LIMIT 5

結(jié)果如下:

從上面的數(shù)據(jù), 我們可以看出來(lái),來(lái)自北京的評(píng)論數(shù)最多。

不僅如此,還可以使用更多的 SQL 語(yǔ)句來(lái)查詢想要的結(jié)果。比如每個(gè)評(píng)分的人數(shù)、所占的比例等。如筆者有興趣,可以嘗試著去查詢一下數(shù)據(jù),就是如此地簡(jiǎn)單。

而為了更好地展示數(shù)據(jù),我們使用 Pyecharts 這個(gè)庫(kù)來(lái)進(jìn)行數(shù)據(jù)可視化展示。

根據(jù)從貓眼拿到的數(shù)據(jù),按照地理位置,直接使用 Pyecharts 來(lái)在中國(guó)地圖上展示數(shù)據(jù):

data = pd.read_csv(f,sep= '{',header= None,encoding= 'utf-8',names=[ 'date', 'nickname', 'city', 'rate', 'comment'])

city = data.groupby([ 'city'])

city_com = city[ 'rate'].agg([ 'mean', 'count'])

city_com.reset_index(inplace= True)

data_map = [(city_com[ 'city'][i],city_com[ 'count'][i]) fori inrange( 0,city_com.shape[ 0])]

geo = Geo( "GEO 地理位置分析",title_pos = "center",width = 1200,height = 800)

whileTrue:

try:

attr,val = geo.cast(data_map)

geo.add( "",attr,val,visual_range=[ 0, 300],visual_text_color= "#fff",

symbol_size= 10, is_visualmap= True,maptype= 'china')

exceptValueError ase:

e = e.message.split( "No coordinate is specified for ")[ 1]

data_map = filter( lambdaitem: item[ 0] != e, data_map)

else:

break

geo.render( 'geo_city_location.html')

注:使用 Pyecharts 提供的數(shù)據(jù)地圖中,有一些貓眼數(shù)據(jù)中的城市找不到對(duì)應(yīng)的從標(biāo),所以在代碼中,GEO 添加出錯(cuò)的城市,我們將其直接刪除,過(guò)濾掉了不少的數(shù)據(jù)。

使用 Python,就是如此簡(jiǎn)單地生成了如下地圖:

從可視化數(shù)據(jù)中可以看出,既看電影又評(píng)論的人群主要分布在中國(guó)東部,又以北京、上海、成都、深圳最多。雖然能從圖上看出來(lái)很多數(shù)據(jù),但還是不夠直觀,如果想看到每個(gè)省/市的分布情況,我們還需要進(jìn)一步處理數(shù)據(jù)。

而在從貓眼中拿到的數(shù)據(jù)中,城市包含數(shù)據(jù)中具備縣城的數(shù)據(jù),所以需要將拿到的數(shù)據(jù)做一次轉(zhuǎn)換,將所有的縣城轉(zhuǎn)換到對(duì)應(yīng)省市里去,然后再將同一個(gè)省市的評(píng)論數(shù)量相加,得到最后的結(jié)果。

data = pd.read_csv(f,sep= '{',header= None,encoding= 'utf-8',names=[ 'date', 'nickname', 'city', 'rate', 'comment'])

city = data.groupby([ 'city'])

city_com = city[ 'rate'].agg([ 'mean', 'count'])

city_com.reset_index(inplace= True)

fo = open( "citys.json", 'r')

citys_info = fo.readlines()

citysJson = json.loads(str(citys_info[ 0]))

data_map_all = [(getRealName(city_com[ 'city'][i], citysJson),city_com[ 'count'][i]) fori inrange( 0,city_com.shape[ 0])]

data_map_list = {}

foritem indata_map_all:

ifdata_map_list.has_key(item[ 0]):

value = data_map_list[item[ 0]]

value += item[ 1]

data_map_list[item[ 0]] = value

else:

data_map_list[item[ 0]] = item[ 1]

data_map = [(realKeys(key), data_map_list[key] ) forkey indata_map_list.keys()]

defgetRealName(name, jsonObj):

foritem injsonObj:

ifitem.startswith(name) :

returnjsonObj[item]

returnname

defrealKeys(name):

returnname.replace( u"省", "").replace( u"市", "")

.replace( u"回族自治區(qū)", "").replace( u"維吾爾自治區(qū)", "")

.replace( u"壯族自治區(qū)", "").replace( u"自治區(qū)", "")

經(jīng)過(guò)上面的數(shù)據(jù)處理,使用 Pyecharts 提供的 map 來(lái)生成一個(gè)按省/市來(lái)展示的地圖:

defgenerateMap(data_map):

map = Map( "城市評(píng)論數(shù)", width= 1200, height = 800, title_pos= "center")

whileTrue:

try:

attr,val = geo.cast(data_map)

map.add( "",attr,val,visual_range=[ 0, 800],

visual_text_color= "#fff",symbol_size= 5,

is_visualmap= True,maptype= 'china',

is_map_symbol_show= False,is_label_show= True,is_roam= False,

)

exceptValueError ase:

e = e.message.split( "No coordinate is specified for ")[ 1]

data_map = filter( lambdaitem: item[ 0] != e, data_map)

else:

break

map.render( 'city_rate_count.html')

當(dāng)然,我們還可以來(lái)可視化一下每一個(gè)評(píng)分的人數(shù),這個(gè)地方采用柱狀圖來(lái)顯示:

data = pd.read_csv(f,sep= '{',header= None,encoding= 'utf-8',names=[ 'date', 'nickname', 'city', 'rate', 'comment'])

# 按評(píng)分分類(lèi)

rateData = data.groupby([ 'rate'])

rateDataCount = rateData[ "date"].agg([ "count"])

rateDataCount.reset_index(inplace= True)

count = rateDataCount.shape[ 0] - 1

attr = [rateDataCount[ "rate"][count - i] fori inrange( 0, rateDataCount.shape[ 0])]

v1 = [rateDataCount[ "count"][count - i] fori inrange( 0, rateDataCount.shape[ 0])]

bar = Bar( "評(píng)分?jǐn)?shù)量")

bar.add( "數(shù)量",attr,v1,is_stack= True,xaxis_rotate= 30,yaxix_min= 4.2,

xaxis_interval= 0,is_splitline_show= True)

bar.render( "html/rate_count.html")

畫(huà)出來(lái)的圖,如下所示,在貓眼的數(shù)據(jù)中,五星好評(píng)的占比超過(guò)了 50%,比豆瓣上 34.8% 的五星數(shù)據(jù)好很多。

從以上觀眾分布和評(píng)分的數(shù)據(jù)可以看到,這一部劇,觀眾朋友還是非常地喜歡。前面,從貓眼拿到了觀眾的評(píng)論數(shù)據(jù)。現(xiàn)在,筆者將通過(guò) jieba 把評(píng)論進(jìn)行分詞,然后通過(guò) Wordcloud 制作詞云,來(lái)看看,觀眾朋友們對(duì)《無(wú)名之輩》的整體評(píng)價(jià):

data = pd.read_csv(f,sep= '{',header= None,encoding= 'utf-8',names=[ 'date', 'nickname', 'city', 'rate', 'comment'])

comment = jieba.cut(str(data[ 'comment']),cut_all= False)

wl_space_split = " ".join(comment)

backgroudImage = np.array(Image.open( r"./unknow_3.png"))

stopword = STOPWORDS.copy()

wc = WordCloud(width= 1920,height= 1080,background_color= 'white',

mask=backgroudImage,

font_path= "./Deng.ttf",

stopwords=stopword,max_font_size= 400,

random_state= 50)

wc.generate_from_text(wl_space_split)

plt.imshow(wc)

plt.axis( "off")

wc.to_file( 'unknow_word_cloud.png')

導(dǎo)出:

再說(shuō)從這張?jiān)~云圖我們可以明顯地看到“小人物”、“好看”、“喜劇”、“演技”這四個(gè)字非常地突出,歷來(lái)能夠稱(chēng)得上黑馬的都是小成本并且反映小人物的荒誕喜劇為多,從這四個(gè)關(guān)鍵詞中我們似乎看出了這部電影究竟為什么會(huì)收獲眾多好評(píng)。一如豆瓣上的一條短評(píng)所言:“不是愛(ài)情,勝似愛(ài)情。喪的剛剛好,黑的剛剛好,暖的剛剛好。有人說(shuō),中國(guó)沒(méi)有‘治愈系’的電影。從此片起,就有了。看這片,我們笑著流淚。刻畫(huà)底層人物的現(xiàn)實(shí)主義題材的電影不在少數(shù),但此片是我近年來(lái)看過(guò)的,最具誠(chéng)意、三觀最正,也最‘哀而不傷’的一部。你將充分感受到什么叫‘真正的演技’,你將看到陳建斌任素汐章宇王硯輝等‘頂級(jí)演技天團(tuán)’如何飆戲。真心期盼,從此片起,國(guó)產(chǎn)片將真正迎來(lái)‘好演員+好電影的春天’。”返回搜狐,查看更多

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的python怎么爬取电影海报_Python 爬取猫眼数据分析《无名之辈》为何能逆袭成黑马?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。