zoukankan      html  css  js  c++  java
  • 爬取李子柒微博评论并分析

    爬取李子柒微博评论并分析

    微博主要分为网页端、手机端和移动端。微博网页版反爬太厉害,因此选择爬取手机端。

    微博手机端地址:https://m.weibo.cn

    1 需求

    爬取李子柒微博中视频的评论信息,并做词频分析。

    词频分析:http://cloud.niucodata.com/

    2 方法

    2.1 运行环境

    • 运行平台: Windows
    • Python版本: Python3.7
    • IDE: PyCharm

    2.2 爬取数据

    首先要先找到自己的cookie,认识手机微博端的数据是如何进行加载的。手机微博是使用Ajax动态加载数据。这里以李子柒置顶视频为例,地址为:https://m.weibo.cn/detail/4206005635846050

    在开发者工具下,network-xdr下找到以下信息:

    此外,还需要对比request url的组成,找出翻页规律:

    Request URL: https://m.weibo.cn/comments/hotflow?id=4206005635846050&mid=4206005635846050&max_id_type=0``Request URL: https://m.weibo.cn/comments/hotflow?id=4206005635846050&mid=4206005635846050&max_id=849522136223909&max_id_type=0 https://m.weibo.cn/comments/hotflow?id=4206005635846050&mid=4206005635846050&max_id=168099804860905&max_id_type=0

    经过对比发现,翻页时的两个关键信息为max_id和max_id_type,只要找到这两个信息,就可以对url进行拼接,从而实现多次爬取。这两个信息可以在之前返回的json文件中的preview找到。

    接下来是爬虫程序的设计:

    ``

    # -*- coding: utf-8 -*-
    
    import requests
    import time
    import os
    import csv
    import sys
    import json
    from bs4 import BeautifulSoup
    import importlib
    importlib.reload(sys)
    
    # 要爬取热评的起始url
    url = 'https://m.weibo.cn/comments/hotflow?id=4206005635846050&mid=4206005635846050&max_id='
    # cookie UA要换成自己的
    headers = {
        'Cookie': '',
        'Referer': 'https://m.weibo.cn/detail/4206005635846050',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }
    
    def get_page(max_id, id_type):
        params = {
            'max_id': max_id,
            'max_id_type': id_type
        }
        try:
            r = requests.get(url, params=params, headers=headers)
            if r.status_code == 200:
                return r.json()
        except requests.ConnectionError as e:
            print('error', e.args)
    
    
    def parse_page(jsondata):
        if jsondata:
            items = jsondata.get('data')
            item_max_id = {}
            item_max_id['max_id'] = items['max_id']
            item_max_id['max_id_type'] = items['max_id_type']
            return item_max_id
    
    def write_csv(jsondata):
        datas = jsondata.get('data').get('data')
        for data in datas:
            created_at = data.get("created_at")
            like_count = data.get("like_count")
            source = data.get("source")
            floor_number = data.get("floor_number")
            username = data.get("user").get("screen_name")
            comment = data.get("text")
            comment = BeautifulSoup(comment, 'lxml').get_text()
            writer.writerow([username, created_at, like_count, floor_number, source,
                             json.dumps(comment,  ensure_ascii=False)])
    
    # 存为csv
    path = os.getcwd() + "/weiboComments.csv"
    csvfile = open(path, 'w',encoding = 'utf-8')
    writer = csv.writer(csvfile)
    writer.writerow(['Usename', 'Time', 'Like_count', 'Floor_number', 'Sourse', 'Comments'])
    
    maxpage = 50 #爬取的数量
    m_id = 0
    id_type = 0
    for page in range(0, maxpage):
        print(page)
        jsondata = get_page(m_id, id_type)
        write_csv(jsondata)
        results = parse_page(jsondata)
        time.sleep(1)
        m_id = results['max_id']
        id_type = results['max_id_type']
    

    2.3 数据清洗与处理

    按照上述代码分别得到五个数据集,但是得到的数据集充满噪声,要对该数据进行清洗,由于本文得到的评论数据已经较为干净,因此主要处理stop word、标点符号和表情符即可。为了简化工作,先用文本整理器软件对空值进行删除。

    停词表采用的是哈工大停词表

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/zjkstudy/p/12596274.html
Copyright © 2011-2022 走看看