【python爬虫】一键保存微博评论信息


一、准备工作

打开微博网址

进入之后,正常登陆微博账号,然后就可以对评论内容进行抓包处理了。

进行抓包的时候,可能还有一个小插曲。

首先,随便选一则内容,点击评论,然后下拉点击查看全部评论

紧接着进行抓包,在这个过程,你可能需要进行手机号验证。出现手机号验证的画面,进行验证就可以了。

二、思路分析

通过抓包分析,可以发现列表中,以 buildComments开头的包,里面包含的就是我们需要的评论信息。

哎呀,这不就是之前经常爬取的json数据嘛。

这就需要构造请求链接了。

目标链接由以下链接加上一些参数构成:

https://weibo.com/ajax/statuses/buildComments

参数可以通过点击这里查看。

比如参数如下:

flow: 0
is_reload: 1
id: id
is_show_bulletin: 2
is_mix: 0
max_id: max_id
count: 20
uid: uid

其中:iduid需要根据微博内容进行更换的,max_id是通过上一个包获取的,第一个包为0.

则构成的目标链接为:

https://weibo.com/ajax/statuses/buildComments?flow=0&is_reload=1&id=id&is_show_bulletin=2&is_mix=0&max_id=max_id&count=20&uid=uid

三、数据获取

主要部分包括以下几个,具体可见源码:

  • 根据微博链接得到id和uid
  • 发起请求,返回json数据
  • 返回评论信息
  • 保存评论信息
  • 设置一个循环,循环爬取
import requests
import json
from fake_useragent import UserAgent
from pyquery import PyQuery as pq
import os
import pandas as pd

ua = UserAgent(verify_ssl=False, path='D:/Pycharm/fake_useragent.json')


# 随机生成请求头
def ua_random():
    headers = {
        'use_agent': ua.random
    }
    return headers


# 根据微博链接得到id和uid
def get_id_uid(url):
    id = url.split('/')[-1]
    uid = url.split('/')[-2]
    return id, uid


# 发起请求,返回json数据
def scrap_json(id, uid, max_id):
    url = 'https://weibo.com/ajax/statuses/buildComments'
    params = {
        'flow': 0,
        'is_reload': 1,
        'id': id,
        'is_show_bulletin': 2,
        'is_mix': 0,
        'max_id': max_id,
        'count': 20,
        'uid': uid
    }
    response = requests.get(url=url, headers=ua_random(), params=params).text
    datas = json.loads(response)
    return datas


# 返回评论信息和下一页的相关参数max_id
def scrap_index(datas):
    data = datas['data']
    max_id = datas['max_id']
    # 新建一个列表,用于放每一个完整的评论信息
    comment = []

    for item in data:
        # 评论者昵称
        user_name = item['user']['name']
        # 评论者设置的地点
        user_city = item['user']['location']
        # 进行判断,该微博是否能够查看ip信息
        if 'source' in data:
            # 评论时所在地点
            user_location = pq(item['source']).text()
        else:
            user_location = '无法显示'
        # 评论时间
        user_time = item['created_at']
        # 评论内容
        user_content = item['text_raw']
        # 点赞数
        user_love = item['like_counts']
        # 将信息组成一个列表,形成一个完整的评论信息
        user_data = [user_name, user_city, user_location, user_time, user_content, user_love]
        print(f'正在保存{user_name}的评论信息')
        # 将每一个完整的评论信息添加到总列表
        comment.append(user_data)

    return comment, max_id


# 保存评论信息
def save_data(path, filename, data):
    dataframe = pd.DataFrame(data)
    dataframe.to_csv(path+filename+'.csv', encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)


def main():
    # 创建保存文件的路径
    path = 'D:/微博评论/'
    if not os.path.exists(path):
        os.makedirs(path)
    # 文件名
    filename = input("请输入文件名:")
    # 写入文件列名
    csv_header = [['评论者昵称', '评论者所在城市', '评论时的ip城市', '评论时间', '评论内容', '评论的点赞数']]
    save_data(path, filename, csv_header)

    # 获取微博id和微博用户id
    url = input('请将需要爬取的微博链接粘贴至此:')
    id, uid = get_id_uid(url)

    max_id = 0
    # 开始循环,不断获取评论信息
    while True:
        data_json = scrap_json(id, uid, max_id)
        comment, max_id = scrap_index(data_json)
        # 保存评论信息
        save_data(path, filename, comment)
        # 终止循环的条件,最后一个包得到的max_id是0
        if max_id == 0:
            break


if __name__ == '__main__':
    main()
  • 对于fake_useragent不理解的小伙伴,可以参考
    Python爬虫有用的库:fake_useragent,自动生成请求头

    四、结果展示


    五、说明

  • 本文仅用于交流学习
  • 不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。
  • 本文利用 Python 爬虫一键保存微博评论,实现过程中也会遇到一些问题,多思考和调试,最终解决问题,也能理解得更深刻。
  • 代码可直接复制运行,如果觉得还不错,记得给个赞哦,也是对作者最大的鼓励,不足之处可以在评论区多多指正。
  • 本文并没有爬取对评论的回复内容,即“楼中楼”信息没有爬取

Author: Polaris119
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Polaris119 !
评论
  TOC