爬取豆瓣电影短评并使用词云简单分析top50

先使用进程池爬取豆瓣电影短评

import requests 
import re
import random
import time
import pandas as pd
from pymongo import MongoClient
from multiprocessing import Pool
from fake_useragent import *

#简单反反爬措施,使用多个UA
ua = UserAgent()


#连接mongo数据库
conn = MongoClient('localhost')
db =conn.spyder
myset = db.douban


def get_db(page):
    #随机获取UA抓取数据并判断状态码
    headers = {"User-Agent":random.choice(ua)}
    url ="https://movie.douban.com/subject/26752088/comments?start={}&limit=20&sort=new_score&status=P".format(page*20)
    req = requests.get(url,headers=headers)
    req.encoding ="utf-8"
    
    if req.status_code ==200:
        print("第%s页爬取成功"%str(page+1))
    else:
        print("第%s页爬取失败"%str(page+1))
    result = req.text
    # 将目标HTML使用正则表达式筛选信息并使用yield返回
    pattern =re.compile('<a href="https://www.douban.com/people/[\s\S]*?" class="">([\s\S]*?)</a>[\s\S]*?<span class="short">([\s\S]*?)</span>')
    rf = re.findall(pattern,result)
    for i in rf:
        yield {'name':i[0].strip(),
               'content':i[1].strip()}
        
def save_to_mongo(file):
    """
    插入数据库

    """
    if myset.insert(file):
        print('插入成功')
    else:
        print('失败')

def main(page):
    """
    主函数

    """
    for file in get_db(page):
        save_to_mongo(file)


if __name__ =="__main__":
    #使用进程池提速抓取,可以考虑sleep
    pool = Pool()
    pool.map(main,[i for i in range(50)])
    pool.close()
    pool.join()
    

将数据从数据库取出并生成词云

import jieba
from wordcloud import WordCloud
import pymongo
import matplotlib.pyplot as mp
from jieba import  analyse

text = None
with pymongo.MongoClient('localhost') as client:
    #获取集合
    db = client.spyder
    myset = db.douban
    #打印数据库总评论数
    print('count:',myset.estimated_document_count())
    cursor = myset.find()

    #遍历数据,这里只遍历短评数
    text = ''.join(map(lambda doc:doc.get('content'),cursor))


#对短语数据文本分词
#添加自定义分词
[jieba.add_word(k) for k in []]

#取Top50的词生成词云
tags = analyse.extract_tags(text,topK=50,withWeight=False)

new_text = ' '.join(tags)
print(new_text)

#对分词文本生成词云
#生成词云,需要指定中文字体,否则无法生成中文词云
image=mp.imread('./wc.jpg')

wc = WordCloud(
    #设置背景色,默认黑色
    # background_color = 'white',
    #设置词云最大单词数
    max_words=200,
    #设置词云中字号最大值
    #max_font_size = 80,
    #设置词云图片宽,高,
    # mask=image,
    width=768,
    height=1024,
    #设置词云文件字体(美化和解决中文乱码问题)
    font_path='STZHONGS.TTF'
).generate(new_text)

#绘图(标准长方形图)
mp.imshow(wc,cmap='rainbow',interpolation='bilinear')
mp.figure('db.wordcloud')
mp.axis('off')
#将图片输出到文件
# wc.to_file(r'./images/wc.png')

mp.show()

生成图片可以明显知道哪些高频词语

wc

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很有趣的问题,我可以为您提供一些 Python 爬取豆瓣电影短评数据并进行词云分析处理的方法,以下是具体步骤: 1. 安装必要的库 需要安装 requests, BeautifulSoup, wordcloud, jieba 等库,可以使用 pip 安装。 2. 获取豆瓣电影短评数据 使用 requests 库获取电影的页面源代码,然后使用 BeautifulSoup 库解析 HTML 页面,找到短评的标签和类名,获取短评的文本信息。 3. 对短评数据进行分词和处理 使用 jieba 库对短评进行分词,去除停用词和无用符号,并统计词频。 4. 生成词云使用 wordcloud 库生成词云图,将分词处理后的结果输入 wordcloud.WordCloud() 函数,设置好字体、背景颜色、词云形状等参数,调用 generate_from_frequencies() 函数生成词云图。 以上是简单的流程,具体的代码实现可以参考以下示例代码: ```python import requests from bs4 import BeautifulSoup import jieba import wordcloud # 请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 短评数据的URL url = 'https://movie.douban.com/subject/1292052/comments?start=0&limit=20&sort=new_score&status=P' # 获取电影的页面源代码 html = requests.get(url, headers=headers).text # 使用BeautifulSoup解析HTML页面 soup = BeautifulSoup(html, 'html.parser') # 获取所有短评 comments = soup.find_all('span', 'short') # 将短评文本拼接成一个字符串 text = '' for comment in comments: text += comment.get_text() # 对文本进行分词 words = jieba.cut(text) # 去除停用词和无用符号 stopwords = ['的', '了', '是', '我', '你', '他', '她', '我们', '你们', '他们', '这', '那', '还', '就', '和', '也', '不', '在', '有', '到', '个', '了', '啊', '呢', '吧', '哦', '嗯', '哈', '呀', '嘛', '了', '吗'] filtered_words = [] for word in words: if word not in stopwords and word.strip() != '': filtered_words.append(word) # 统计词频 word_count = {} for word in filtered_words: if word not in word_count: word_count[word] = 1 else: word_count[word] += 1 # 生成词云图 wc = wordcloud.WordCloud( font_path='simhei.ttf', background_color='white', width=800, height=600, max_words=200, max_font_size=100, random_state=30, ) wc.generate_from_frequencies(word_count) # 展示词云图 import matplotlib.pyplot as plt plt.imshow(wc, interpolation='bilinear') plt.axis('off') plt.show() ``` 这样就可以爬取豆瓣电影短评数据并进行词云分析处理了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值