国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

從13萬(wàn)貓眼評(píng)論看看《流浪地球》到底怎么樣

lemanli / 3149人閱讀

摘要:今年的流浪地球這么火,通過(guò)爬取貓眼電影上網(wǎng)友對(duì)該片的評(píng)價(jià)如何。也許很多人在這天通過(guò)看流浪地球過(guò)節(jié)吧。

背景

最近幾年貓眼電影越來(lái)越熱門(mén)了,都差不多和豆瓣并駕齊驅(qū)了。今年的《流浪地球》這么火,通過(guò)爬取貓眼電影上網(wǎng)友對(duì)該片的評(píng)價(jià)如何。

爬取貓眼評(píng)論 找到評(píng)論網(wǎng)頁(yè)地址

先打開(kāi)貓眼官網(wǎng)找到《流浪地球》的介紹頁(yè)面:https://maoyan.com/films/248906

雖然顯示有112.4萬(wàn)人評(píng)分,但是頁(yè)面只有熱門(mén)短評(píng),其他評(píng)論都去哪里了,手機(jī)明明是有的。

那么我們用chrome切換到手機(jī)頁(yè)面:

打開(kāi)開(kāi)發(fā)者工具

開(kāi)啟手機(jī)瀏覽功能

訪問(wèn)手機(jī)版地址:http://m.maoyan.com/movie/248...$from=canary#

這時(shí)候我們就看到了所有的評(píng)論。

獲取評(píng)論請(qǐng)求地址

在點(diǎn)擊打開(kāi)“查看全部330613條討論”后,發(fā)現(xiàn)評(píng)論分為最熱和最新兩部分,最熱數(shù)量有限,而最新則是未經(jīng)過(guò)處理的,也正是我們需要的。通過(guò)search來(lái)查看下對(duì)應(yīng)的請(qǐng)求:

發(fā)現(xiàn),在chrome 的網(wǎng)絡(luò)展示中發(fā)現(xiàn)只有一個(gè)類(lèi)型為document的請(qǐng)求包含了所需的信息。那么這部分的評(píng)論獲取就需要解析網(wǎng)頁(yè)了,我們?cè)侔哑聊簧系脑u(píng)論往下拉,發(fā)現(xiàn)會(huì)自動(dòng)加載更多的評(píng)論,對(duì)應(yīng)的chrome網(wǎng)絡(luò)請(qǐng)求多出來(lái)了兩個(gè)comments.json的請(qǐng)求:

果然這才是我們需要的!把初始頁(yè)面的url和這兩個(gè)json請(qǐng)求的url復(fù)制到一起比較一下:

http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&offset=0&limit=15&ts=0&type=3
http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&offset=15&limit=15&ts=1549965527295&type=3
http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&offset=30&limit=15&ts=1549965527295&type=3

我們可以發(fā)現(xiàn)規(guī)律:

初始頁(yè)面的ts值為0,隨后會(huì)有ts值,且保持不變。這里的ts是當(dāng)前的時(shí)間戳,可以通過(guò)轉(zhuǎn)換工具查看:

offset是請(qǐng)求評(píng)論開(kāi)始的序號(hào),limit為請(qǐng)求的條數(shù)

再看返回的json結(jié)果:

data.comments中是評(píng)論的具體內(nèi)容

paging中通過(guò)hasMore來(lái)告訴我們是否還有更多(判斷是否繼續(xù)抓取)

我們?cè)賴(lài)L試下將offset設(shè)置為0,也加上ts參數(shù):

http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&offset=0&limit=15&ts=1549965527295&type=3

發(fā)現(xiàn)也是可以獲取數(shù)據(jù)的:

那么通過(guò)offsetlimit來(lái)控制每次請(qǐng)求獲取的數(shù)量。

我們還可以通過(guò)加大limit參數(shù)來(lái)嘗試,是否可以一次性獲取更多的評(píng)論:

http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&offset=0&limit=30&ts=1549965527295&type=3

效果如下:

再增加limit的值,會(huì)發(fā)現(xiàn)評(píng)論數(shù)回到了15條,可見(jiàn)貓眼系統(tǒng)僅支持每次最多獲取30條。

構(gòu)造請(qǐng)求url 方法一

根據(jù)上面的分析,我們構(gòu)造請(qǐng)求的url就很明確了:

offset=0&limit=30開(kāi)始

通過(guò)返回的paging.hasMore來(lái)判斷是否繼續(xù)抓取

下一個(gè)抓取的urloffset+=limit

只能抓取1000條?!

根據(jù)上述分析,在返回的json數(shù)據(jù)中是可以看到總評(píng)論數(shù)的,但是實(shí)際抓取的時(shí)候,在offset超過(guò)1000之后,返回的數(shù)據(jù)中hasMore就變成了false

于是嘗試通過(guò)瀏覽器一直下拉刷新,到達(dá)offset超過(guò)1000的情況,發(fā)現(xiàn)頁(yè)面會(huì)不停的發(fā)送請(qǐng)求,但也無(wú)法獲取數(shù)據(jù)。

那應(yīng)該就是網(wǎng)站做了控制,不允許offset超過(guò)1000。

構(gòu)造請(qǐng)求URL 方法二

那么就要考慮其他構(gòu)造url的方法來(lái)抓取了。先觀察下每個(gè)請(qǐng)求返回的信息:

發(fā)現(xiàn)每個(gè)comment里都包含有一個(gè)time信息,把time做一下處理:

2019-02-13 13:38:00##感覺(jué)韓朵朵這個(gè)人設(shè)是多余的
2019-02-13 13:38:00##真的感動(dòng) 非常棒
2019-02-13 13:38:00##這電影大陸的起航
2019-02-13 13:38:00##不怎么樣,劇情挺感人,但是有點(diǎn)尷尬
2019-02-13 13:37:00##好看。。。。。。。。。。
2019-02-13 13:37:00##超級(jí)超級(jí)超級(jí)超級(jí)超級(jí)超級(jí)超級(jí)好看
2019-02-13 13:37:00##太牛逼了,中國(guó)科幻片可有一部能看的了。支持吳京
2019-02-13 13:36:00##不錯(cuò)!中國(guó)科幻的希望
2019-02-13 13:36:00##中國(guó)里程碑式的科幻電影。
2019-02-13 13:36:00##什么垃圾座位沒(méi)人管的么亂坐的

可以發(fā)現(xiàn)后臺(tái)是按照時(shí)間順序的,每分鐘一個(gè)間隔,那么就可以考慮根據(jù)每次返回comment中的時(shí)間來(lái)更新url中的ts即可。

由于不確定每次請(qǐng)求返回的數(shù)據(jù)中包含了多長(zhǎng)的時(shí)間段,且返回的第一個(gè)評(píng)論時(shí)間戳與第二個(gè)評(píng)論是不同的,所以抓取思路如下:

獲取請(qǐng)求數(shù)據(jù)

記錄第一個(gè)時(shí)間戳

記錄第二個(gè)時(shí)間戳

當(dāng)遇到第三個(gè)時(shí)間戳?xí)r,將ts設(shè)置為第二個(gè)時(shí)間戳,重新構(gòu)造url

如果單次抓取中每遇到第三個(gè)時(shí)間戳,則通過(guò)修改offset來(lái)繼續(xù)抓取,直到遇到第三個(gè)時(shí)間戳

抓取實(shí)現(xiàn)

根據(jù)上面思路,實(shí)現(xiàn)相對(duì)就比較簡(jiǎn)單了:

生成url

def get_url():
    global offset
    url = "http://m.maoyan.com/review/v2/comments.json?movieId=" + movieId + "&userId=-1&offset=" + str(
        offset) + "&limit=" + str(limit) + "&ts=" + str(ts) + "&type=3"
    return url

訪問(wèn)url

def open_url(url):
    global ua
    try:
        headers = {"User-Agent": ua.random}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        else:
            return None
    except Exception as e:
        print(e)
        return None

數(shù)據(jù)處理:將評(píng)論保存并判斷是否要繼續(xù)抓取

def parse_json(data):
    global count
    global offset
    global limit
    global ts
    ts_duration = ts
    res = json.loads(data)
    comments = res["data"]["comments"]
    for comment in comments:
        comment_time = comment["time"]
        if ts == 0:
            ts = comment_time
            ts_duration = comment_time
        if comment_time != ts and ts == ts_duration:
            ts_duration = comment_time
        if comment_time !=ts_duration:
            ts = ts_duration
            offset = 0
            return get_url()
        else:
            content = comment["content"].strip().replace("
", "。")
            print("get comment " + str(count))
            count += 1
            write_txt(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(comment_time/1000)) + "##" + content + "
")
    if res["paging"]["hasMore"]:
        offset += limit
        return get_url()
    else:
        return None

最后一共抓取評(píng)論131106條,足夠做各種分析了

2019-02-13 18:13:11,625 - get_comments.py[line:78] - INFO: get comment 131104
2019-02-13 18:13:11,729 - get_comments.py[line:78] - INFO: get comment 131105
2019-02-13 18:13:11,827 - get_comments.py[line:78] - INFO: get comment 131106
2019-02-13 18:13:15,416 - get_comments.py[line:98] - INFO: end
數(shù)據(jù)分析 按日期匯總分析熱度

前面我們?cè)僮トr(shí),將評(píng)論的時(shí)間和內(nèi)容通過(guò)csv的格式保存下來(lái),并使用;分割。讀取csv文件并統(tǒng)計(jì)處理就要用到大名鼎鼎的pandas了。

讀取數(shù)據(jù)

pandas提供read_csv方法來(lái)直接獨(dú)處數(shù)據(jù)保存為DateFrame格式。

df = pd.read_csv("comment.csv", sep=";", header=None)

設(shè)置數(shù)據(jù)列名

由于我們知道數(shù)據(jù)有兩列,先通過(guò)這只列名可以方便后續(xù)引用。

df.columns = ["date", "comment"]

時(shí)間日期處理

date列,我們保存的數(shù)據(jù)格式是string,需要把轉(zhuǎn)換為日期格式才能進(jìn)一步處理。

df["date"] = pd.to_datetime(df["date"])

我們需要按時(shí)間來(lái)統(tǒng)計(jì),所以把date列設(shè)置為index:

df = df.set_index("date")

日期篩選

由于我們知道《流浪地球》是2月5日上映的,我們可以對(duì)日期進(jìn)行限定,以免出現(xiàn)有些在上映前的評(píng)論,會(huì)占用大段的空白情況。

設(shè)置index之后,可以參考list類(lèi)型操作,由于時(shí)間是倒序的,所以可以直接使用[:"2019-02-04"]來(lái)選取2月4日之后到今天的所有數(shù)據(jù)。pandas在數(shù)據(jù)篩選方面相當(dāng)智能,按照datetime的格式直接篩選即可。

cacu_df = df[:"2019-02-04"]

按日期進(jìn)行數(shù)量統(tǒng)計(jì)

pandas中,通過(guò)resample方法進(jìn)行重新采樣,通過(guò)傳入rule參數(shù)就可以按需要的頻率獲取數(shù)據(jù),獲得一個(gè)resampler對(duì)象。

DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention="start", kind=None, loffset=None, limit=None, base=0, on=None, level=None)

resampler對(duì)象提供了很多的統(tǒng)計(jì)方法,比如匯總求和可使用Resampler.count()

# 按日統(tǒng)計(jì)數(shù)量
cacu = cacu_df.resample("D").count()

這樣就完成了按日期求和統(tǒng)計(jì)操作。

繪圖

畫(huà)圖需要使用matplotlib庫(kù),通過(guò)導(dǎo)入該庫(kù),可直接對(duì)DateFrame對(duì)象進(jìn)行畫(huà)圖處理。畫(huà)圖及圖表格式化如下:

# 設(shè)置中文字體
font = FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
plt.plot(cacu)
plt.title("流浪地球評(píng)論分析", fontproperties=font)
plt.xlabel("日期", fontproperties=font)
plt.ylabel("評(píng)論數(shù)", fontproperties=font)
plt.axis("tight")
# 顯示網(wǎng)格
plt.grid(True)
# 自動(dòng)旋轉(zhuǎn)橫軸日期
plt.gcf().autofmt_xdate()
# 顯示數(shù)值
for a, b in zip(cacu.index, cacu.values):
plt.text(a, b, str(b[0]))
# 保存圖片
plt.savefig("comment_analysis.png")
# 查看圖片
plt.show()

分析結(jié)果

結(jié)果如下:

可見(jiàn)從上映之后,關(guān)注度直線飆升,到2月10日之后(上映5天),大家關(guān)注度逐漸下降。其中2月14日為情人節(jié),大家的關(guān)注又有了小幅的上升。也許很多人在這天通過(guò)看《流浪地球》過(guò)節(jié)吧。

制作評(píng)論熱點(diǎn)圖云

數(shù)據(jù)清洗

首先由于評(píng)論是用戶(hù)發(fā)表的,可能什么字符都會(huì)有,要先把一些特殊符號(hào)去掉,這里就用到了正則替換:

msg = re.sub("[s+.!/_,$%^*()+""?]+|[+——!,。?、~@#¥%……&*()【】;:]+|[.+]|[.+]", "", line)

分詞與標(biāo)簽

清洗后的數(shù)據(jù),可以使用jieba分詞包來(lái)進(jìn)行分詞,并把所有的分詞保存在一個(gè)list中,然后計(jì)算出每個(gè)分詞出現(xiàn)的次數(shù)。

# 分詞
tags = jieba.analyse.extract_tags(msg)
for t in tags:
    word_list.append(t)
# 計(jì)算詞頻
for word in word_list:
    if word not in word_dict:
        word_dict[word] = 1
    else:
        word_dict[word] += 1

生成詞云

使用wordcloud包,就可以很方便的生成詞云圖片了。

先新建一個(gè)WordCloud對(duì)象,進(jìn)行配置,然后利用前面的分詞詞頻就可以生成對(duì)應(yīng)的圖片了。

# 計(jì)算圖片顏色
alice_coloring = np.array(img)
my_wordcloud = WordCloud(background_color="white",
                             max_words=500, mask=alice_coloring,
                             max_font_size=200, random_state=42,
                             font_path=(os.path.join(d, "font/msyh.ttf")))
                             
my_wordcloud = my_wordcloud.generate_from_frequencies(wordList)

這里需要注意的是:

mask=alice_coloring:這里通過(guò)numpy將圖片矩陣化,來(lái)獲取圖片的顏色作為WordCloudmask,是為了最后生成的圖云不僅外形與我們輸入的圖片保持一致,而且整體顏色也保持一致。

輸入的原圖,背景色需要設(shè)置為白色而不是透明色,否則會(huì)全屏幕都是字。。。

對(duì)于中文的詞云,需要制定中文的字體,這里用的是微軟雅黑

保存圖片

最后使用matplotlib.pyplot來(lái)保存圖片,保存前要進(jìn)行圖片屬性的一些設(shè)置。

width = img.width/80
height = img.height/80
plt.figure(figsize=(width, height))
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
# 通過(guò)設(shè)置subplots_adjust來(lái)控制畫(huà)面外邊框
plt.subplots_adjust(bottom=.01, top=.99, left=.01, right=.99)
plt.savefig("jupiter_wordcloud_1.png")
plt.show()

這里需要注意的是: 建議根據(jù)原圖片的長(zhǎng)寬比例進(jìn)行一定的縮小,以免生成的圖片像素過(guò)大而產(chǎn)生報(bào)錯(cuò)。

ValueError: Image size of 98400x46500 pixels is too large. It must be less than 2^16 in each direction.

詞云展示

放一張?jiān)瓐D,你能看的出來(lái)嘛,摳圖技術(shù)有限O(∩_∩)O哈哈~

以上就是使用抓取的評(píng)論生成詞云的大致思路,完成的實(shí)現(xiàn)代碼請(qǐng)見(jiàn):https://github.com/keejo125/w...

如果有更好的方法,歡迎一起探討。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43242.html

相關(guān)文章

  • 2018電影票房分析-誰(shuí)才是票房之王

    摘要:另外由于豆瓣上一些電影評(píng)分?jǐn)?shù)量太少而不顯示,所以這里的電影數(shù)量會(huì)和票房數(shù)量有所差異。月度票房將類(lèi)型片的票房按月劃分,得到了這張圖。 去年末的時(shí)候,我招收了新的 實(shí)訓(xùn)生 。本文是其中一位 @齊大圣 同學(xué)在實(shí)訓(xùn)兩個(gè)月時(shí)完成的項(xiàng)目案例。(碼上行動(dòng)群里同學(xué)應(yīng)該都看過(guò)這個(gè)名字,現(xiàn)在也是助教之一。)項(xiàng)目最初的想法是, 從互聯(lián)網(wǎng)上的公開(kāi)信息中采集2018年在國(guó)內(nèi)上映電影的票房、評(píng)分、類(lèi)型、演員等信息...

    stormjun 評(píng)論0 收藏0
  • 實(shí)戰(zhàn)!《長(zhǎng)津湖》為什么這么火爆?我用 Python 來(lái)分析貓眼影評(píng)

    摘要:作者周蘿卜鏈接長(zhǎng)津湖貓眼影評(píng)歡迎關(guān)注,專(zhuān)注數(shù)據(jù)分析數(shù)據(jù)挖掘好玩工具對(duì)于這個(gè)十一黃金周的電影市場(chǎng),絕對(duì)是長(zhǎng)津湖的天下,短短幾天,票房就已經(jīng)突破億,大有奮起直追戰(zhàn)狼的盡頭。 ...

    lijy91 評(píng)論0 收藏0
  • 用python模擬《流浪地球》的木星引力彈弓效應(yīng)

    摘要:來(lái)源重力助推而在影片中,也就是為了獲取更大的速度以脫離太陽(yáng)系,人類(lèi)才選擇借助木星的引力彈弓效應(yīng)。引力彈弓的概念在幾年前的星際穿越和火星救援中都有提及,我一直想寫(xiě)個(gè)模擬,直到這次趁流浪地球熱映的機(jī)會(huì)才動(dòng)手實(shí)現(xiàn)。 本文涉及影片內(nèi)容,但算不上劇透。想看還未看的同學(xué)請(qǐng)謹(jǐn)慎閱讀。 春節(jié)檔的幾部電影里,《 流浪地球 》成為一匹黑馬,刷爆微博和朋友圈,從最初不高的排片率,一躍上升到票房榜首。 看過(guò)影...

    fsmStudy 評(píng)論0 收藏0
  • [數(shù)讀]開(kāi)戶(hù)數(shù)看這一波牛市

    摘要:最近的股市有點(diǎn)熱鬧上證指數(shù)從開(kāi)年的點(diǎn),幾乎一路漲到前幾天的點(diǎn),短短兩個(gè)月,最高漲幅超過(guò)。橫軸是日期,縱軸紅線是上證指數(shù),綠線和藍(lán)柱是什么數(shù)據(jù)大家可以先自己猜一下。 注:本文首發(fā)于2019年3月11日。本想等3月的官方報(bào)告出來(lái)后修正文中數(shù)據(jù)。但很神奇的是,本文發(fā)布之后,中登公司的每周數(shù)據(jù)就再無(wú)更新。直到近日,公布了3月的月度數(shù)據(jù),確實(shí)在意料之中,環(huán)比增加了一倍。 最近的股市有點(diǎn)熱鬧:上證...

    txgcwm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<