python爬取《囧媽》豆瓣影評并畫出詞云圖

最近在學(xué)習(xí)python爬蟲的內(nèi)容,就拿豆瓣影評來做一個(gè)練習(xí)。

爬蟲目的:爬取《囧媽》這部電影點(diǎn)贊前20的影評,生成每篇影評的詞云圖
影評鏈接:https://movie.douban.com/subject/30306570/reviews
主要python庫:requests, BeautifulSoup, jieba, wordcloud

囧媽影評

一、爬取影評

1.導(dǎo)入需要的python庫

import requests, csv, jieba
from bs4 import BeautifulSoup
from wordcloud import WordCloud, STOPWORDS
from imageio import imread
from sklearn.feature_extraction.text import CountVectorizer

2.分析頁面的html代碼

谷歌瀏覽器打開開發(fā)者模式查看網(wǎng)頁代碼(右鍵-檢查可以進(jìn)入開發(fā)者模式),如下圖所示,我們發(fā)現(xiàn)每篇影評是沒有完全展開的,所以我們需要獲得每篇影評的鏈接地址,然后根據(jù)鏈接地址得到影評的全部內(nèi)容。

開發(fā)者模式

3.獲得每篇影評標(biāo)題、鏈接、點(diǎn)贊數(shù)并保存

如下代碼中我們定義了四個(gè)函數(shù),第一個(gè)函數(shù)根據(jù)網(wǎng)址返回網(wǎng)頁內(nèi)容,第二個(gè)函數(shù)獲得每篇影評的點(diǎn)贊數(shù),用列表來存儲,第三個(gè)函數(shù)獲得每篇影評的標(biāo)題和鏈接,用字典來存儲,第四個(gè)函數(shù)我們將影評內(nèi)容存儲到txt文件中,至此,我們就完成了爬取影評內(nèi)容的函數(shù)。

# 下載后的影評保存路徑
SAVE_PATH = ".\movies\{}.txt"
# 返回網(wǎng)頁內(nèi)容
def get_soup(url):
    headers={
      'user-agent':'Mozilla/5.0'
    }
    r = requests.get(url,headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    return soup
# 獲得影評的支持?jǐn)?shù)
def get_useful_numbers(soup):
    useful_numbers = soup.find_all(title="有用")
    useful_numbers_list = []
    for s in useful_numbers:
        useful_numbers_list.append(s.span.text.replace("\n","").replace(" ",""))
    return useful_numbers_list
# 獲得影評的標(biāo)題和鏈接
def get_url_dict(soup):
    reviews = soup.find_all(class_="main-bd")
    url_dict = {}
    for review in reviews:
        title = review.find("a").text
        url = review.find("a",href=True)['href']
        url_dict[title] = url
    return url_dict
# 將影評輸出到文本文件保存
def write_to_file(title, url):
    soup = get_soup(url)
    pp = soup.find(id="link-report")
    contents = pp.find_all("p")
    with open(SAVE_PATH.format(title),'w',encoding="utf-8") as f:
        for content in contents:
            f.write("{}\n".format(content.text))

二、生成每篇影評的詞云圖

現(xiàn)在我們有了每篇影評的txt文件,接下來我們定義一個(gè)函數(shù)將文件中的內(nèi)容生成詞云圖。

# 傳入文件名生成詞云圖
def generate_wordcloud(filename):
    # 獲取文章內(nèi)容
    with open(".\movies\{}.txt".format(filename),encoding="utf-8") as f:
        contents = f.read()

    # 使用jieba分詞,獲取詞的列表
    contents_cut = jieba.cut(contents)
    contents_list = " ".join(contents_cut)

    # 制作詞云圖,collocations避免詞云圖中詞的重復(fù),mask定義詞云圖的形狀,圖片要有背景色
    wc = WordCloud(stopwords=("電影","徐崢", "一個(gè)"), collocations=False, 
                   background_color="white", 
                   font_path=r"C:\Windows\Fonts\simhei.ttf",
                   width=400, height=300, random_state=42)
    wc.generate(contents_list)
    wc.to_file(".\movies\images\{}.png".format(filename))

    # 使用CountVectorizer統(tǒng)計(jì)詞頻
    cv = CountVectorizer()
    contents_count = cv.fit_transform([contents_list])
    # 詞有哪些
    list1 = cv.get_feature_names()   
    # 詞的頻率
    list2 = contents_count.toarray().tolist()[0] 
    # 將詞與頻率一一對應(yīng)
    contents_dict = dict(zip(list1, list2))
    # 輸出csv文件,newline="",解決輸出的csv隔行問題
    with open(".\movies\csvfiles\{}.csv".format(filename), 'w', newline="") as f:
        writer = csv.writer(f)
        for key, value in contents_dict.items():
            writer.writerow([key, value])

三、主程序與結(jié)果

我們已經(jīng)定義了需要的所有函數(shù),現(xiàn)在編寫主程序來生成需要的詞云圖。

url = r"https://movie.douban.com/subject/30306570/reviews"  
soup = get_soup(url)
url_dict = get_url_dict(soup)
useful_numbers_list = get_useful_numbers(soup)
i = 0
for key,value in url_dict.items():
    write_to_file(useful_numbers_list[i]+"_"+key,value)
    filename = useful_numbers_list[i]+"_"+key
    generate_wordcloud(filename)
    i+=1

運(yùn)行結(jié)果如下:

囧媽影評詞云圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容