zoukankan      html  css  js  c++  java
  • 爬虫综合大作业

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

    作业来源: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 录入数据,得出饼图:

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

     

  • 相关阅读:
    HDU4474 Yet Another Multiple Problem BFS搜索
    HDU4473 Exam 数学分析
    2013ACM多校联合(4)
    POJ1273 网络流...
    HDU4472 Count 递推
    POJ1149 PIGS 网络流
    UVA10881 Piotr's Ants 想法题
    javascript js string.Format()收集
    修改 设置 vs.net 网站 调试 设为 起始页
    【转】HTML5杂谈 概念与现行游戏 割绳子 宝石迷阵
  • 原文地址:https://www.cnblogs.com/Anla/p/10838210.html
Copyright © 2011-2022 走看看