爬虫综合大作业

本次作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159

可以用pandas读出之前保存的数据:newsdf = pd.read_csv(r'F:\duym\gzccnews.csv')

一、把爬取的内容保存到数据库

  • 保存到sqlite3数据库
import sqlite3
with sqlite3.connect('newsdb.sqlite') as db:
    newsdf.to_sql('gzccnewsdb',con=db, if_exists='replace')

with sqlite3.connect('newsdb.sqlite') as db:
    df = pandas.read_sql_query('SELECT * FROM gzccnewsdb',con=db)#查询

截图:

 

  • 保存到MySQL数据库
import pymysql
from sqlalchemy import create_engine
conn = create_engine('mysql+pymysql://root:@localhost:3306/gzccnews?charset=utf8',encoding='utf-8')
newsdf.to_sql(name ='gzccnews', con = conn, if_exists = 'append', index = False)

截图:

    • 在MySQL中新建数据库

    • 导入数据库成功

 

 

二、爬虫综合大作业

  1. 选择一个热点或者你感兴趣的主题。
  2. 选择爬取的对象与范围。
  3. 了解爬取对象的限制与约束。
  4. 爬取相应内容。
  5. 做数据分析与文本分析。
  6. 形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。
  7. 文章公开发布。
  • 爬虫主题:分析电影《何以为家》好不好看

主要内容:法庭上,十二岁的男孩赞恩向法官状告他的亲生父母,原因是,他们给了他生命。故事中,赞恩的父母在无力抚养和教育的状况下依然不停生育,作为家中的长子赞恩,弱小的肩膀承担了无数生活的重压。当妹妹被强行卖给商贩为妻时,赞恩愤怒离家,之后遇到一对没有合法身份的母子,相互扶持勉强生活。然而生活并没有眷顾赞恩,重重磨难迫使他做出了令人震惊的举动……

 

  • 爬取对象:猫眼电影(https://maoyan.com/)

 

 

  • 爬取对象的限制与约束:猫眼电影的web版关于电影的评论是有限的,不允许获取所有用户的评论,最终发现要在手机终端的页面才可以获得

 

图1  web版不能获得所有评论

图2  手机版可以获得所有评论

 

  • 爬取内容

本次爬取了评论部分的用户ID、所在城市、用户名、评论、评分、时间六项,共爬取了13778条评论。

找到爬取的json数据切入口:http://m.maoyan.com/mmdb/comments/movie/1218727.json?_v_=yes&offset=0&startTime=2019-05-03%2022%3A25%3A03

 

 爬取代码如下:

from urllib import request
import json


# 获取数据,根据url获取
def get_data(url):
    headers = {
        '1': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36',
        '2': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
        '3': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    req = request.Request(url, headers=headers)
    response = request.urlopen(req)
    if response.getcode() == 200:
        return response.read()
    return None


def parse_data(html):
    data = json.loads(html)['cmts']  # 将str转换为json

    for item in data:
        comment = {
            'id': item['id'],
            'nickName': item['nickName'] if 'nickName' in item else '',
            'cityName': item['cityName'] if 'cityName' in item else '',  # 处理cityName不存在的情况
            'content': item['content'].replace('\n', ' ', 10),  # 处理评论内容换行的情况
            'score': item['score'],
            'startTime': item['startTime']if 'startTime' in item else ''
        }
        comments.append(comment)
    return comments

if __name__ == '__main__':
    for d in range(14):

        for i in range(30):
            comments = []
            html = get_data('http://m.maoyan.com/mmdb/comments/movie/1218727.json?_v_=yes&offset={}&startTime=2019-06-{}%2022%3A25%3A03'.format(i*15,d))
            comments = parse_data(html)
            # df = pd.DataFrame(comments)
            for item in comments:
                with open('pinglun.csv', 'a', encoding='utf-8') as f:
                    f.write(str(item['id']) + ';' + item['cityName'] + ';' + item['nickName'] + ';' + item['content'] + ';' + str(item['score']) + ';' +
                            item['startTime'] + '\n')
            print('爬取中。。。')
            print(comments)

 

爬取结果:

 

  • 进行数据分析如下

 1、获取用户评论中热词Top20,并且制作词云

代码如下:

import jieba
import pandas as pd

comments = []
with open('p.txt', mode='r', encoding='utf-8') as f:
    rows = f.readlines()
    for row in rows:
        comment = row.split(';')[3]
        if comment != '':
            comments.append(comment)

pl=' '.join(comments)
print(' '.join(comments))

ci=['',' ','我们','知道','看到','自己','起来','什么','他们','一个','看着','没有','看看','就是','怎么','还是','这么','觉得','电影']

for c in ci:
        mytext = pl.replace(c, "")

'''分割出词汇'''
words = list(jieba.cut(mytext))
wordDict={}

'''统计频率次数'''
wordSet=set(words)
for w in wordSet:
    if len(w)>1:
        wordDict[w] = words.count(w)

'''排序'''
wordList = list(wordDict.items())
wordList.sort(key=lambda x:x[1],reverse=True)

'''输出top20'''
for i in range(20):
    print(wordList[i])

'''保存为csv文件'''
pd.DataFrame(data=wordList).to_csv('ciyun.csv',encoding='utf-8')

 运行截图如下:

 

词云显示如下:

 

2、分析电影评分情况

代码如下:

pf = []
with open('p.txt', mode='r', encoding='utf-8') as f:
    rows = f.readlines()
    for row in rows:
        fenCol = row.split(';')[4]
        if fenCol != '':
            pf.append(fenCol)

pfDict={}
'''统计频率次数'''
Set=set(pf)
for w in Set:
        pfDict[w] = pf.count(w)

'''排序'''
List = list(pfDict.items())
List.sort(key=lambda x:x[1],reverse=True)

'''输出'''
for key in List:
    print(key)


from pyecharts import Pie
pie=Pie("《何以为家》评分占比",width=1000)
pie.add('评分情况',['0分','0.5分','1分','1.5分','2分','2.5分','3分','3.5分','4分','4.5分','5分'], [1,12,3,4,4,7,6,18,57,153,629], center=[75, 50], is_random=True,is_legend_show=False, is_label_show=True)
pie.render('.\粉丝评分图.html')

运行截图如下:

 

评分情况可视化如下:

 

 

  • 总结

经过对猫眼电影上《何以为家》这部电影的部分评论的爬取、分析、数据可视化之后,从中我们可以知晓:

1、电影的主题是围绕家庭中父母和孩子的关系展开的;

2、通过对观众评论的分析得知,电影主要给人以生活化、真实的感觉;

3、通过对评分的分析,可以看出总体评分还是非常非常高的,给5分的观众占了大多数,对得起猫眼9.4的评分(2019.5.6);

4、值得一看。

 

posted @ 2019-05-06 21:05  阿叔  阅读(415)  评论(0编辑  收藏  举报