Python爬取微博评论数据,竟被反爬封号了!

现在是一个专业的时代,要早一点成为一个专家

空空荡荡而又满满当当<---------------------------------> 昏昏沉沉却又明明白白

在这里插入图片描述
哈喽,各位小伙伴大家好呐,这些天一直忙其它事情,回头发现已经好几天没更新爬虫专辑了,今天给大家整一首Python爬取微博评论,哈哈但是最后有点小丑(微博被封号了一段时间),下面大家一起来看操作!

一: 核心过程步骤

  1. 找api接口,获取json文本数据

  2. 分析主评论与子评论url链接参数从而进行拼接

  3. 分别爬取主评论与子评论数据并导入到execl表格中

二: Search评论接口

首先微博搜索一个博主,点击进入博主发一条微博信息界面!
在这里插入图片描述
然后得从PC端观看模式切换为手机端观看模式,PC端参数过于复杂(小夜斗在PC端挣扎了三天结果最后拼接出来的url啥也没有,但是手机端一天就就弄好了)!
在这里插入图片描述
然后呢从一大堆文件中找到存放评论信息api接口(小夜斗这边建议选择xhr格式查找,一般都是ajax格式加载出的信息)
在这里插入图片描述
将这个url链接复制到网址链接上面,在将网址显示出的内容复制粘贴到json.cn这个json格式加载网站,如图所示:
在这里插入图片描述
让小夜斗先对这个json文件数据进行爬取一下吧,小试牛刀先爬取一个url链接,需要爬取的数据如下所示:
在这里插入图片描述

核心数据抓取代码,访问接口,获取json数据格式即可!

import requests
import json
from tqdm import tqdm
import datetime
import time
import random
import csv
​
# 一条主微博链接部分评论, 需要构造参数max_id获取全部ajax
up_main_url = 'https://m.weibo.cn/comments/hotflow?id=4596226979532970&mid=4596226979532970&max_id_type=0'
headers = {
    
    
        # ua代理
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75',
        # 登录信息
        'cookie': 'SINAGLOBAL=5702871423690.898.1595515471453; SCF=Ah2tNvhR8eWX01S-DmF8uwYWORUbgfA0U3GnciJplYvqE1sn2zJtPdkJ9ork9dAVV8G7m-9kbF-PwIHsf3jHsUw.; SUB=_2A25NDifYDeRhGeBK7lYS9ifFwjSIHXVu8UmQrDV8PUJbkNANLRmlkW1NR7rne18NXZNqVxsfD3DngazoVlT-Fvpf; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhhI1TcfcjnxZJInnV-kd405NHD95QcSh-Xe0q41K.RWs4DqcjQi--ciK.RiKLsi--Ni-24i-iWi--Xi-z4iKyFi--fi-2XiKLhSKeEeBtt; wvr=6; _s_tentry=www.sogou.com; UOR=,,www.sogou.com; Apache=9073188868783.379.1611369496580; ULV=1611369496594:3:3:3:9073188868783.379.1611369496580:1611281802597; webim_unReadCount=%7B%22time%22%3A1611369649613%2C%22dm_pub_total%22%3A0%2C%22chat_group_client%22%3A0%2C%22chat_group_notice%22%3A0%2C%22allcountNum%22%3A63%2C%22msgbox%22%3A0%7D'
    }
response = requests.get(url=up_main_url, headers=headers)
if response.status_code == 200:
        text = response.text.encode("gbk", "ignore").decode("gbk", "ignore")  # 解决报错双重严格限制
        content = json.loads(text)  # 将文本转为json格式
        try:
            data = content['data']['data']  # 获取评论列表
            for comment in tqdm(data, desc='花花评论爬取加载进度--->!'):
                time.sleep(random.random())
                text = str(comment['text'])  # 获取文本信息
                # 卧槽,我房子又塌了<span class="url-icon">
                # 处理文本信息,find函数找到<span开始的索引
                if text.find('<span') != -1:
                    text = text[:text.find('<span')]
                create_time = comment['created_at']  # 发布时间
                # 格林威治时间格式字符串 Wed Jul 10 20:00:09 +0800 2019 转换为好理解的标准时间格式 2019-07-10 20:00:09
                # Fri Jan 22 17:56:48 +0800 2021 转换为标准时间格式 2021/1/22 17:56:48
                std_transfer = '%a %b %d %H:%M:%S %z %Y'  # 转换的一个格式
                std_create_time = datetime.datetime.strptime(create_time, std_transfer)
                user_name = comment['user']["screen_name"]  # 用户姓名
                user_id = comment['user']['id']  # 用户id
                user_followers_count = comment['user']['followers_count']  # 该用户粉丝数
                user_follow_count = comment['user']['follow_count']  # 该用户关注数
                user_gender = comment['user']['gender']  # 用户性别
                total_number = comment["total_number"]  # 总回复数
                like_count = comment["like_count"]  # 点赞数
                flag_id = comment["id"]  # 二级评论url构造所需id
                print('')
                # print(f'内容: {text}')
                # print(f'用户名: {user_name}')
                # print(f'评论时间: {std_create_time}')
                # print(f'id:{user_id}')
                # print(f'关注人数: {user_follow_count}')
                # print(f'粉丝: {user_followers_count}')
                # print(f'性别: {user_gender}')
                # print(f'回复数量: {total_number}')
                # print(f'点赞数: {like_count}')
                # print(f'cid: {flag_id}')
                #print('成功保存信息!')
        except:
            print("啊这,今晚是上分局!被反爬了")
            pass

上述代码简单的访问api接口,获取评论内容、评论用户名、点赞数量、回复数、点赞时间等必要信息,将其保存为csv文件导入execl表格中,表中部分信息如图所示:
在这里插入图片描述
上述代码是一条微博下面部分主评论的数据爬取,还有一部分主评论是ajax加载出来的,需要参数构造url链接!主评论下面子评论回复信息爬取与上述代码类似,因篇幅问题就不过多展示,文末自取即可

参数构造的url规律

爬取主评论api接口参数需要:max_id (可直接从第一个主评论api接口中的json数据中获取得到)

爬取子评论api接口参数需要: cid(可直接从第一个主评论api接口中的json数据中获取得到)、max_id(需要从子评论接口中json数据中获取得到)

ps:两个max_id参数来源不一样:一个是从主评论api接口获得,一个是从子评论api接口获得

# 构造主评论url链接
# 获取构造ajax主评论url全部max_id参数
def main_max_id():
    # 以没有内容报错作为终止条件break跳出
    while len(max_id_url_list) < 200:
        print("正在休眠中")
        time.sleep(random.randint(1, 3))  # 休眠
        print("休眠完毕啦")
        if (len(max_id_list) == 0):
            main_url = 'https://m.weibo.cn/comments/hotflow?id=4596226979532970&mid=4596226979532970&max_id_type=0'
            max_id_url_list.append(main_url)
        else:
            main_url = f'https://m.weibo.cn/comments/hotflow?id=4596226979532970&mid=4596226979532970&max_id={max_id_list[-1]}&max_id_type=0'
            max_id_url_list.append(main_url)
        try:
            content = requests_json(main_url)
            max_id = content['data']["max_id"]  # 获得主评论需要得参数max_id来构造url链接
            max_id_list.append(max_id)
            # TODO: 写一个终止条件, 什么时候不在获取max_id
            data = content['data']['data']  # 获取评论列表
            for comment in data:  # 循环遍历
                cid = comment["id"]  # 二级评论url构造所需id
                cid_list.append(cid)  # 添加
        except:
            print("最后一条max_id打底啦!该跳出走人咯!")
            break

代码运行如图所示,采取双线程方式进行爬取,成功获取微博数据

在这里插入图片描述
以上就是本期分享地微博评论爬取啦,篇幅过长,想获取全部源码的小伙伴们请持续关注小夜斗的微信公众号:夜斗小神社

后台回复"005微博数据"即可获得全部源码!

在这里插入图片描述
请持续关注夜斗小神社,爬虫路上不迷路!

大众点评封ip,还字体加密?我直呼,就这啊!

《小夜斗滴爬虫入门实战案例》

  • 在这个星球上,你很重要,请珍惜你的珍贵! ~~~夜斗小神社
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xtreallydance/article/details/113419022