最近,在工作之余自学python,越发膨胀,觉得自己厉害了一丢丢,前段时间看过秒先生,画面还挺好,立意嘛就图一乐呵,于是想用影评分析一下,看看大家都怎么看待妙先生这部电影。

分析网站

如图所示,我们要读取的是该页面的短评部分,文章是有分页,从浏览器地址栏我们看到有start参数,在第二页时参数值为20,因此我们可以知道,豆瓣影评的分页大小为20 初始值为0,可以看每段短评都有展开字样,这里我们就不再展开,只分析短评部分(省事)。

开始编码

1.进入主页面,使用beautifulsoap 解析获取到的html标签以及数据

url = "https://movie.douban.com/subject/34888476/reviews"

headers = getHeader()

request = urllib3.PoolManager()

response = request.request("GET", url, headers=headers)

htmlText = response.data

2.获取评论总数,然后根据评论总数和分页参数构建请求

# 获取每页具体影评

def getRemarks(url):

headers=getHeader()

global all_remark

html = getXHRHtml(url)

bs = BeautifulSoup(html, "html.parser")

remarks = bs.find(attrs={'class': 'review-list'}).find_all(attrs={'class':'short-content'})

for item in remarks:

text= item.text

text='|'.join(text.split())

strArr= text.split(sep="|")

all_remark=all_remark+strArr[1]

# 获取评论总条数

remarks_title = bs.find(attrs={'id':'content'}).find('h1').text

remarks_count = remarks_title[remarks_title.index('(')+1:remarks_title.index(')')]

remarks_count = int(remarks_count,base=10)

# 已知每页显示20条 ,翻页

for start in range(0,remarks_count,20):

url_temp=f"https://movie.douban.com/subject/34888476/reviews?start={start}"

# 使用多线程加载分页的异步数据,挨个加载效率太低

t = Thread(target=getRemarks, args=[url_temp])

t.start()

threads.append(t)

# 等待所有线程结束

for thread in threads:

thread.join()

print(all_remark)

这里我们通过多线程请求,避免在网页响应的处理等待。在具体获取分页的影评时我们要通过selenium.webdriver库通过浏览器去获取异步加载的数据。

最后通过解析过来的数据,我们将其生成一个词云图,分析一下大家都在讨论什么。

词云我是借鉴的这位大佬的

文章

最终结果,如图

最后得出结论我太菜了,只知道大家一致认为 妙先生里没有好人。

全部代码

import urllib3

from bs4 import BeautifulSoup

import numpy as np

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

import time

from threading import Thread

import re

import jieba

import collections

from PIL import Image

import wordcloud

import matplotlib.pyplot as plt

# 全局变量

# 创建进程列表

threads = []

all_remark=""

# 获取模拟头

def getHeader():

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}

return headers

# 异步获取页面数据

def getXHRHtml(url):

# 使用Google浏览器

googledriver=r"C:\Users\weiyongjian\AppData\Local\Google\Chrome\Application\chromedriver.exe"

# 不弹窗口

options = Options()

options.headless = True

google=webdriver.Chrome(options=options,executable_path=googledriver)

try:

google.get(url)

google.refresh()

time.sleep(4)

except Exception as e:

pass

html=google.page_source

google.close()

return html

# 获取具体影评

def getRemarks(url):

headers=getHeader()

global all_remark

html = getXHRHtml(url)

bs = BeautifulSoup(html, "html.parser")

remarks = bs.find(attrs={'class': 'review-list'}).find_all(attrs={'class':'short-content'})

for item in remarks:

text= item.text

text='|'.join(text.split())

strArr= text.split(sep="|")

all_remark=all_remark+strArr[1]

# 进入影评页拿取影评信息

def getRemark(url):

headers = getHeader()

request = urllib3.PoolManager()

response = request.request("GET", url, headers=headers)

htmlText = response.data

bs = BeautifulSoup(htmlText, "html.parser")

# 获取评论总条数

remarks_title = bs.find(attrs={'id':'content'}).find('h1').text

remarks_count = remarks_title[remarks_title.index('(')+1:remarks_title.index(')')]

remarks_count = int(remarks_count,base=10)

# 已知每页显示20条 ,翻页

for start in range(0,remarks_count,20):

url_temp=f"https://movie.douban.com/subject/34888476/reviews?start={start}"

# 使用多线程加载分页的异步数据,挨个加载效率太低

t = Thread(target=getRemarks, args=[url_temp])

t.start()

threads.append(t)

# 等待所有线程结束

for thread in threads:

thread.join()

print(all_remark)

# 处理结果生成词云

# 文本预处理

pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"|》|《|”') # 定义正则表达式匹配模式

string_data = re.sub(pattern, '', all_remark) # 将符合模式的字符去除

# 文本分词

seg_list_exact = jieba.cut(string_data, cut_all=False) # 精确模式分词

object_list = []

remove_words = [u'的', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。', u' ', u'、', u'中', u'在', u'了',

u'通常', u'如果', u'我们', u'需要', u'我', u'有', u'展开'] # 自定义去除词库

for word in seg_list_exact: # 循环读出每个分词

if word not in remove_words: # 如果不在去除词库中

object_list.append(word) # 分词追加到列表

# 词频统计

word_counts = collections.Counter(object_list) # 对分词做词频统计

word_counts_top10 = word_counts.most_common(10) # 获取前10最高频的词

print(word_counts_top10) # 输出检查

# 词频展示

mask = np.array(Image.open('wordcloud.png')) # 定义词频背景

wc = wordcloud.WordCloud(

font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式

mask=mask, # 设置背景图

max_words=200, # 最多显示词数

max_font_size=100 # 字体最大值

)

wc.generate_from_frequencies(word_counts) # 从字典生成词云

image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案

wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案

plt.imshow(wc) # 显示词云

plt.axis('off') # 关闭坐标轴

plt.show() # 显示图像

if __name__ == '__main__':

url = "https://movie.douban.com/subject/34888476/reviews"

getRemark(url)

python主要讲什么意思_python:苗先生从影评上说了什么?,中,看妙,讲,啥相关推荐

  1. python能不能爬数据库_python爬取数据后不能写入到数据库中

    目标:去爬当当网某页内容中的书籍的名称,链接和评论数,然后写入数据库中 pipelins内容如下: import pymysql class DangdangPipeline(object):def ...

  2. python截图保存到内存卡_Python画月饼,云上过中秋,天池Python入门案例系列赛开启...

    阿里云天池推出了一个Python入门案例系列教程,在此之前他们还推出了一个Python基础训练营. 在天池龙珠计划Python训练营中,天池给学习者详细的介绍了Python的基础和进阶知识,根据学习者 ...

  3. python异步io多文件_Python 异步 IO 性能又上一层楼

    最近看源码的过程中,发现了一个比较有意思的库,aiomultiprocess,我认为他确实是 Python 升级到 3.8 之后一个特性的总结库,包括静态检查和性能提升. 这个是作者提供的一个 IO ...

  4. 学python不会英语怎么办_Python学习 英语不好怎么办?这里有官方中文文档你看不看...

    Python 作为世界上最好用的语言,官方支持的文档一直没有中文.小伙伴们已经习惯了原汁原味的英文文档,但如果有官方中文文档,那么查阅或理解速度都会大大提升.本文将介绍隐藏在 Python 官网的中文 ...

  5. python类定义学生信息_Python学生信息管理系统(注释最详细,小白都看的懂)

    1 importos2 3 #学生系统基本功能 4 #增删查改 5 6 #如何实现该系统 7 #1.显示系统功能界面 8 #2.让用户选择功能 9 #3.判断用户选择的指定功能,然后完成相应的操作(增 ...

  6. python爬虫豆瓣电影评价_Python 爬虫实战(1):分析豆瓣中最新电影的影评

    目标总览 主要做了三件事: 抓取网页数据 清理数据 用词云进行展示 使用的python版本是3.6 一.抓取网页数据 第一步要对网页进行访问,python中使用的是urllib库.代码如下: from ...

  7. python 批量下载网页图片_Python 实现简单的爬虫功能 -----批量下载网页中的图片...

    我使用的是macPro , mac 自带了python2.7 , 我自己下载了pytho3.6根据操作进行安装后,终端默认的还是 python 2.7, 需要修改为 Python3.6 进入 ~/.b ...

  8. python 爬取搞笑视频_Python爬取知乎上搞笑视频,一顿爆笑送给大家

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Huangwei AI 来源:Python与机器学习之路 PS:如有需 ...

  9. python怎么统计单词总数_Python【习题】:统计纯英文文本中总字数

    人生苦短,我用Python 环境:Windows 10 64-bit, python == 3.6.4 , PyCharm CE == 2018.1 声明:学习资源来自于网络,这里是自己学习笔记总结与 ...

最新文章

  1. qcustomplot 游标吸附_qcustomplot游标测量功能--Apple的学习笔记
  2. [nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI
  3. Jquery复习(一)之animate()易忘点
  4. Redhat 5.4 安装Vbox 增强工具失败解决方法。
  5. 单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张...
  6. 如何在Python中获取周数?
  7. sql语言快速入门_C语言快速入门——名称可见性
  8. 告诉你一个 AtomicInteger 的惊天大秘密!
  9. Linux运维 第三阶段 (五) DNS(主从,rndc远程控制,子域授权,视图,压力测试)
  10. Python办公自动化--Word、Excel、PDF
  11. ubuntu12.04升级svn到 1.7
  12. yii2 错误处理
  13. 计算机显示的网络,如何设置在电脑右下角显示网络连接图标
  14. 基于AD5933 生物复阻抗
  15. 10秒钟搞定圆柱齿轮设计所有课题
  16. 微信小程序之数据交互
  17. SpringBoot框架分层(View层、Controller层、Service层、Mapper层、pojo层)
  18. sqlplus -prelim/ as sysdba用法
  19. 合并与拆分数据模型(MSDM:Merging Spliting Data Modeling)
  20. 读mdb数据库中的表,返回datatable;链接postgresql数据库,读取数据库中表

热门文章

  1. php7.2 如何安装imagick扩展
  2. 模糊粗糙集的实际应用
  3. html 里怎么插入鼠标手,教你几个动作缓解鼠标手
  4. 2021年在知乎上写的一些文章
  5. 2015-8-16,来到魔都上海,开始我全新的DBA生涯
  6. Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。
  7. Private key 和 Secret key 的区别
  8. 物联网无线技术频段划分
  9. 集体合同一经双方当事人签字就可以生效吗?
  10. ZK和EureKa的区别(CAP理论)