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

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

     

  • 相关阅读:
    团队冲刺2---个人工作总结一(5.25)
    第十二周学习进度
    课堂作业——找水王
    个人冲刺07
    第十五周学习进度情况
    构建之法阅读笔记06
    构建之法阅读笔记05
    第十四周学习进度情况
    个人冲刺06
    个人冲刺05
  • 原文地址:https://www.cnblogs.com/Anla/p/10838210.html
Copyright © 2011-2022 走看看