网络爬虫(二)——《金刚:骷髅岛》电影分析

网络爬虫(二)

昨天写了一个网络爬虫的基本的小应用,获取了某种类型电影及其主页。晚上心血来潮,和小伙伴们计划明天去看一场电影,《金刚:骷髅岛》说起这部电影,还真是一无所知。之前看电影也是这样,向来是看完再看演员和导演背景什么的,看之前很少关注这些,但是想到昨天写的关于豆瓣的爬虫,忽然想做一点有趣的事,来看看我们明天要看的电影如何。

1. 数据提取

我想做的有趣的事就是,看看这部电影在网上的评论到底如何,也能最基本的预测一下这部电影的受欢迎程度吧。由于之前就在做关于豆瓣的爬虫,那就拿豆瓣的影评作为数据来源吧,(想过去国外网站提取数据的问题,这个以后可能要做一个,并且和国内影评进行对比)数据提取其实很简单,我们主要是分析豆瓣的网页数据就好。

1.1 构建网页地址

豆瓣的影评中使用的分页,是使用改变URL中的偏移量来实现的,因此,如果想要获得全部的影评的话,我们就直接改变URL中的偏移量即可,而且,这个偏移量还是有规律的,毕竟要保证网页的美观,使每页显示的评论数一样才好。

搜索页面的URL为:

URL_GET = 'https://movie.douban.com/subject_search'

构造URL,得到我们想要获取数据的url:

def url_api():
    """
    Build the url for requests, we can change the rang then get more page.

    :return: a generator of url.
    """
    for number in range(0, 50):
        page = number * 15
        param = {'start': page, 'search_text': '科幻'}
        url = '?'.join([URL_GET, '%s']) % parse.urlencode(param)
        yield url

1.2 获取影评数据并存入文件中

这里我们将分析获得的网页,然后提取出我们感兴趣的评论数据,存入一个文件中。

def get_response(url):
    response = requests.get(url)
    if response.status_code == 200:
        time.sleep(1)
        return response
    else:
        raise Exception('RequestError')


def local_comment(response):
    comm = []
    bso = bs(response.text, 'lxml')
    comments = bso.find_all('div', {'class', 'comment'})
    for com in comments:
        abc = com.find('p').get_text().strip('\n').replace(' ', '')
        comm.append(abc)
    return comm

说明:

  1. 在这段代码中,我们获取了每个网页中的评论信息,并且存入一个列表中,方便后续调用。
  2. 技巧:.strip(‘\n’).replace(’ ‘, ”)可以去除网页中多余的空格和换行,使获得的数据看起来更清晰。

注意: 这段代码有待优化,因为可能在获取评论的时候出错,要增加异常处理。

将提取的数据存入文件:

if __name__ == '__main__':
    for url in url_api():
        res = get_response(url)
        with open('comment.txt', 'a+', encoding='utf-8') as f:
            for comment in local_comment(res):
                try:
                    f.write(comment)
                except Exception as e:
                    pass

至此,我们获得了我们想要的数据。

2. 数据分析

之前在想这部分内容的时候想做成图表的形式,但是说到图表我们可能还需要一些数字信息,但是到目前为止我所获得的数据只有文字,而且还是中文的文字,看到网上有关于英文分词的文章,使用nltk库进行分析,但是nltk好像只支持英文分析,而且英文分析还是很简单的,直接将所有文章中的所有的标点去除,然后把所有的单词变为大(小)写,通过空格来分割单词,即可。但是中文分词还是挺难的,这里在网上找到了一个专门针对汉语分词的库jieba分析系统,而且这个项目还有很多的语言支持。

这里我们使用:

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
* sentence 为待提取的文本
* topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
* withWeight 为是否一并返回关键词权重值,默认值为 False
* allowPOS 仅包括指定词性的词,默认值为空,即不筛选

content = open('comment.txt', 'rb').read()
# tags is list type is iterable
tags = jieba.analyse.extract_tags(content, topK=100, withWeight=True)
input_data = {}
for i in tags:
    weight = int(10000 * i[1]//1)
    input_data[i[0]] = weight
print(input_data)

这样,我们就获取了在整个评论中,权重最大的前100个分词。至此,我原来想通过matplotlib画一个柱状图来表示的,但是仔细一想,如果是柱状图的话,那么横轴最少也要有100项,这并不利于观察,如果这里做一个关于字典键值对中的值的排序,因为值所对应的是数值,但是又不够直白。

网上有一个词云的数据表现形式,很直观,我们可以在线生成词云图片,而且在Python中也有国外大神写了这样的一个库wordcloud词云,我们可以参考相关连接。

d = path.dirname(__file__)
alice_coloring = imread("abc.jpg")
wc = WordCloud(font_path='abc.ttf',# 设置显示字体(指明字体路径)
                background_color="white",# 背景颜色max_words=2000,# 词云显示的最大词数
               mask=alice_coloring,  # 设置背景图片
               stopwords=STOPWORDS.add("said"),
               max_font_size=120,  # 字体最大值
               random_state=42,
               min_font_size=8)
wc.generate_from_frequencies(input_data)
image_colors = ImageColorGenerator(alice_coloring)

# 以下代码显示图片
plt.imshow(wc)
plt.axis("off")
# 绘制词云
plt.figure()
# recolor wordcloud and show
# we could also give color_func=image_colors directly in the constructor
plt.imshow(wc.recolor(color_func=image_colors))
plt.axis("off")
# 绘制背景图片为颜色的图片
plt.figure()
plt.imshow(alice_coloring, cmap=plt.cm.gray)
plt.axis("off")
plt.show()
# 保存图片
wc.to_file(path.join(d, "jingang.png"))

这样,我们就生成了一张关于电影《金刚:骷髅岛》词云,让我们看看最后的成果吧。

3.23抓取数据词云:
3.23抓取数据词云

3.24抓取数据词云:

3.24抓取数据词云
这样一眼看上去,就能对这个电影有一个基本的了解了,仔细分析一下,还会看到很多意想不到的东西:

  1. 国内网友们对景甜的关注度显然是很高呀,但是并不知道国外怎样,这就是我想看国外网友评论的原因了。后期有时间去烂番茄抓取一些数据再做对比。
  2. 开始还不知道抖森呢,但是看完这个忽然发现,原来还有这样一个演员,哈哈,又张了见识了。
  3. 网友对金刚的特效效果评价还是很高的,看看词云就知道了,而且,国内网友的评价还是不低的,最起码,这不是一部烂片。
  4. 而且词云也告诉我们这里边是有彩蛋的呦,哈哈,收获还是不少的,至少不会提前离场了。
  5. 另外这部片子还真的和哥斯拉比起来了,看来很多人还是回忆起了当年的哥斯拉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值