Python+Selenium爬取新浪微博评论数据

微博分析

微博端类型

首先找到一个待爬取的微博,需要注意的是,微博分为:微博网页端(http://weibo.com)如图1,微博手机端(http://m.weibo.cn)如图2以及微博移动端(http://weibo.cn)如图3。
难度程度排序如下:网页端>手机端>移动端
图一:(网页端)
在这里插入图片描述
图二:(手机端)
在这里插入图片描述
图三:(移动端)
在这里插入图片描述

选择爬取对象

选择手机端进行爬取李易峰最新的一条微博评论

Ajax动态加载数据分析

F12打开开发者工具,Network—》XHR,筛选出所有的xhr文件,如下图2:在⚙config(绿色箭头)的xhr文件中可以找到自己的cookie、user-agent,包括传输方式等信息。在⚙hotflow?..(红色箭头)所指的文件中,来查看Request URL。
在这里插入图片描述
接着,滑动页面的滚动条,发现加载了更多的⚙hotflow?..的xhr文件,如图3。将它们一一打开找到Request URL,进行对比。
在这里插入图片描述
发现只是max_id的值不同(实际上还有max_id_tpye也不同)。也就是说只要可以不断获取这个max_id的值,并不断的更新URL(url是由https://m.weibo.cn/comments/hotflow?用户id&midid&max_id&max_id_type组成),就可以知道将数据爬出来,选择preview—》data里面可以看到这些信息,如果看不到就使用json解析器如下四图。
图四:
在这里插入图片描述
要想获得下一次的url,该从哪个地方得到这个max_id和max_id_type。实际上,在之前的返回的json文件的最后面有下一个的max_id和max_id_type。打开之前的⚙hotflow的preview,如下图5所示:
在这里插入图片描述
这下子就找到了,可以拼接下一个url了,所以只要不断更新这个max_id和max_id_type就可以实现热评的多次爬取了。

Python实现代码

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import time
import os
import csv
import sys
import json
from bs4 import BeautifulSoup
import importlib
import xlsxwriter
import xlwt,xlrd
import xlutils.copy

importlib.reload(sys)

# 要爬取指定微博的url
url='https://m.weibo.cn/comments/hotflow?id=4595729735881918&mid=4595729735881918&max_id_type=0'
#Cookie、Referer值根据自身而定
headers = {
    'Cookie':'你的Cookie',
    'Referer': 'https://m.weibo.cn/detail/4585935297323316',
    'User-Agent': '你的User-Agent',
    'X-Requested-With': 'XMLHttpRequest'
}
like_counts = []
usernames = []
comments = []
#json形式获取爬取网页的动态加载数据
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)
        
#获取max_id和max_id_type
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

#解析json数据并获得评论相关数据
def GetComment(jsondata):
    datas = jsondata.get('data').get('data')
    print(datas)
    for d in datas:
        like_count = d.get("like_count")#点赞数
        like_counts.append((like_count))
        username = d.get("user").get("screen_name")  # 评论者用户名
        usernames.append(username)
        comment = d.get("text")  # 评论内容
        comment = BeautifulSoup(comment, 'lxml').get_text()
        comment = json.dumps(comment, ensure_ascii=False)
        comments.append(comment)
    print (usernames,like_counts,comments)


if __name__ == '__main__':

    filename='weiboComments.xlsx'   #要保存的文件名
    maxpage =200 #爬取的页码数量(根据该微博的评论数决定,一页20条评论)
    max_id = 0
    id_type = 0
    for page in range(1, maxpage):
        print(page)
        jsondata = get_page(max_id, id_type)
        print(jsondata)
        GetComment(jsondata)
        results = parse_page(jsondata)
        time.sleep(1)
        max_id = results['max_id']
        id_type = results['max_id_type']
        print(max_id,id_type)

    fileW = xlsxwriter.Workbook(filename)  # 写入filename
    tableWrite = fileW.add_worksheet('Sheet1')  # 向这个文件增加表单sheet1
    # 把第一行的三个列名插入进去
    tableWrite.write(0, 0, '用户名')
    tableWrite.write(0, 1, '点赞数')
    tableWrite.write(0, 2, '评论内容')

    for i in range(len(comments)):#遍历要合并的评论集-从第二行开始依次插入数据
            tableWrite.write(i+1,0,usernames[i])
            tableWrite.write(i+1,1,like_counts[i])
            tableWrite.write(i+1,2,comments[i])
    fileW.close()

参考原博客的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值