爬虫综合大作业

文章主要内容:  爬取新上映的电影《调音师》评价、评分、以及观众分布。

作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159

一.把爬取的内容保存取MySQL数据库

  • import pandas as pd
  • import pymysql
  • from sqlalchemy import create_engine
  • conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"
  • engine = create_engine(conInfo,encoding='utf-8')
  • df = pd.DataFrame(allnews)
  • df.to_sql(name = ‘news', con = engine, if_exists = 'append', index = False)

二.爬虫综合大作业

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

三.爬虫注意事项

1.设置合理的爬取间隔,不会给对方运维人员造成压力,也可以防止程序*中止。

  • import time
  • import random
  • time.sleep(random.random()*3)

2.设置合理的user-agent,模拟成真实的浏览器去提取内容。

  1. 首先打开你的浏览器输入:about:version。
  2. 用户代理:
  3. 收集一些比较常用的浏览器的user-agent放到列表里面。
  4. 然后import random,使用随机获取一个user-agent
  5. 定义请求头字典headers={’User-Agen‘:}
  6. 发送request.get时,带上自定义了User-Agen的headers

3.需要登录

发送request.get时,带上自定义了Cookie的headers

headers={’User-Agen‘:  

'Cookie':    }

4.使用代理IP

通过更换IP来达到不断高 效爬取数据的目的。

headers = {

    "User-Agent": "",

}

proxies = {

    "http": " ",

    "https": " ",

}

response = requests.get(url, headers=headers, proxies=proxies)

一. 爬取到猫眼电影中《调音师》的观众评价的数据:

一共40000+条评论

__author__ = 'likx'

from urllib import request

import json

import time

from datetime import datetime

from datetime import timedelta


# 获取数据,根据url获取

def get_data(url):
    headers = {
        'User-Agent': '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

    comments = []

    for item in data:
        comment = {

            'id': item['id'],

            'nickName': item['nickName'],

            'cityName': item['cityName'] if 'cityName' in item else '',  # 处理cityName不存在的情况

            'content': item['content'].replace('
', ' ', 10),  # 处理评论内容换行的情况

            'score': item['score'],

            'startTime': item['startTime']

        }

        comments.append(comment)

    return comments


# 存储数据,存储到文本文件

def save_to_txt():
    start_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 获取当前时间,从当前时间向前获取

    end_time = '2018-08-10 00:00:00'

    while start_time > end_time:

        url = 'http://m.maoyan.com/mmdb/comments/movie/1239544.json?_v_=yes&offset=0&startTime=' + start_time.replace(
            ' ', '%20')

        html = None

        '''

            问题:当请求过于频繁时,服务器会拒绝连接,实际上是服务器的反爬虫策略

            解决:1.在每个请求间增加延时0.1秒,尽量减少请求被拒绝

                 2.如果被拒绝,则0.5秒后重试

        '''

        try:

            html = get_data(url)

        except Exception as e:

            time.sleep(0.5)

            html = get_data(url)

        else:

            time.sleep(0.1)

        comments = parse_data(html)

        print(comments)

        start_time = comments[14]['startTime']  # 获得末尾评论的时间

        start_time = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') + timedelta(
            seconds=-1)  # 转换为datetime类型,减1秒,避免获取到重复数据

        start_time = datetime.strftime(start_time, '%Y-%m-%d %H:%M:%S')  # 转换为str

        for item in comments:
            with open('D:huang01.csv', 'a', encoding='utf_8_sig') as f:
                f.write(str(item['id']) + ',' + item['nickName'] + ',' + item['cityName'] + ',' + item[
                    'content'] + ',' + str(item['score']) + ',' + item['startTime'] + '
')


if __name__ == '__main__':
    # html = get_data('http://m.maoyan.com/mmdb/comments/movie/1203084.json?_v_=yes&offset=0&startTime=2018-07-28%2022%3A25%3A03')

    # comments = parse_data(html)

    # print(comments)

    save_to_txt()

 得到的数据:

爬虫综合大作业

 二.通过可视化数据,得出观影人次top25的城市分布:

 通过 echart 录入数据,得出柱状图:

爬虫综合大作业

.通过可视化数据,得出电影评分比例分布:

 通过 echart 录入数据,得出饼图:

爬虫综合大作业

 四、最后,得到评价的词云:

爬虫综合大作业

 爬虫综合大作业