查看原文
其他

上的什么班?我爱你的不一般!python最新微博爬取教程,看看十万网友怎么说?

酷头酷头 印象Python 2022-08-01
  • 声明:本文只是简单的爬虫示范,并不涉及任何商业用途。

  • 近日有空,我又开始了新一轮的爬虫实战,
  • 这次将魔掌伸向了新浪微博。

  • 在今日的热搜榜上有着关于“王老板聊天记录”话题的一条热搜热度破亿,
  • 于是我便准备以其为目标,爬取该话题下的微博中评论数据。

  • 在爬虫的开始前,我发现微博在网上分为几个版本:

  • 微博网页端(http://weibo.com)、
  • 微博手机端(http://m.weibo.cn)
  • 和微博移动端(http://weibo.cn)。

  • 在最开始,我分别对其进行了抓包分析,发现微博手机的评论数据比较规整,爬取难度也比较适中,这里用其进行练手。


  • 确立目标


  • 传送门:https://m.weibo.cn/detail/4648381753067388

需求分析


我们要获取的数据如上下:

用户id、作者名称、作者座右铭、发帖时间、发帖内容

首先我们F12打开浏览器开发者模式:



找到我们的目标url:
https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id_type=0


还有headers防反爬参数和参数params



我们用浏览器打开链接,发现这是一个标准的json格式的数据集,
我们所要的数据都在这个json数据里面

所以第一步,先获取这个json格式的数据集。



发送请求



目标很清楚了,接下来上代码:
# 模拟浏览器防止反爬虫
headers = {
    'Referer''https://m.weibo.cn/detail/4648381753067388',
    'User-Agent': str(UserAgent().random),
    'cookie''_T_WM=90974455109; WEIBOCN_FROM=1110006030; SUB=_2A25NyTOqDeRhGeVG7lAZ9S_PwjiIHXVvMl3irDV6PUJbktB-LVDmkW1NT7e8qozwK1pqWVKX_PsKk5dhdCyPXwW1; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFGibRIp_iSfMUfmcr5kb295NHD95Q01h-E1h-pe0.XWs4DqcjLi--fi-2Xi-2Ni--fi-z7iKysi--Ri-8si-zXi--fi-88i-zce7tt; SSOLoginState=1624065018; MLOGIN=1; XSRF-TOKEN=35119d; M_WEIBOCN_PARAMS=oid%3D4648381753067388%26luicode%3D20000061%26lfid%3D4648381753067388%26uicode%3D20000061%26fid%3D4648381753067388'
    }


def spider_wb(https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id_type=0):

    params = {
        'id'4648381753067388,
        'mid'4648381753067388,
        'max_id_type'0
    }

    resp = requests.get(url, headers = headers, params = params)

    try:
        if resp.status_code == 200:
            return resp.json()
        else:
            print('something wrong!')
    except:
        return None





解析页面


上一步已经成功模拟浏览器获取到了数据。
接下来就是如何在其中提取出我们的目标数据
用户id、作者名称、作者座右铭、发帖时间、发帖内容
看代码:
  wb_info = data['data']['data']
  for item in wb_info:

    user_id = item.get("user")["id"]                  # 用户id

    author = item['user']['screen_name']              # 作者名称

    auth_sign = item['user']['description']           # 作者座右铭

    time = str(item['created_at']).split(' ')[1:4]
    rls_time = '-'.join(time)                          # 发帖时间

    text = ''.join(re.findall('[\u4e00-\u9fa5]', item['text']))   # 发帖内容

    print(user_id, author, auth_sign, rls_time, text)
    
    '''
    5655949340 1dontknow 假装爱会拥抱我 Jun-15-16:01:14 不回我很酷吗笑死我了
    6046942091 Yukhei-0125  Jun-15-16:01:12 斤还要人心疼衰
    1828233284 一口一根冰激凌 YOLO Jun-15-16:02:00 吃东西我看你一样都没少哈哈哈哈哈哈哈哈哈哈哈哈
    6567329234 踹出去 废话狠多 宠物博主(糊笔版 Jun-15-16:02:33 聪聪只不过是一个斤的有钱舔狗罢了耶
    7075267884 快乐没故事 存在不等于上网 Jun-15-16:03:21 哈哈哈哈草我今天去输液了想你的夜
    7377196612 0梨花白0 博主是小学生,没有思想品德课,素质很低,蒽 Jun-15-16:01:45 王思聪好舔允悲
    5609753822 -HappyTime 垂死挣扎的咸鱼 Jun-15-16:08:02 真的不是捡手机文学嘛笑得想死哈哈哈哈哈哈哈哈哈哈哈哈好
    6318037045 世界小姐得主 I BORN LIKE THIS WAY. Jun-15-16:02:02 舔狗竟是王思聪哆啦梦害怕
    5972747363 ImAndromeda_ 厕所常驻嘉宾👿👋 Jun-15-16:19:10 怎么要找人杀了我
    7348013345 kiveiru鸭 三缄其口 却又四海生风 Jun-15-16:02:07 又是什么好东西自己有对象和别人在网上装情侣骗姬圈钱现在又一服不畏强权的样子骗子和狗咬狗罢了吐
    7592414086 日落時· 当然是记录碎碎念啦 Jun-15-16:00:59 我养你啊笨
    6072736160 又又一小口 我所做的一切,都是为了抵抗孤独 Jun-15-16:22:43 王的嘴脸和我认识一男的真是一模一样
    5257270018 困困桃乐丝 你也喜欢看星星吗 Jun-15-16:01:45 这是什么弱智发言很难相信不是伪造的哼
    5067719289 子雅小雅MM 我的宝贝都要好好的,红红火火!!!星途坦荡!!!Jun-15-16:05:26 不懂就问左边真的是还是改的网名
    1948404284 ·王一招财进宝· 健康平安最重要!!!Jun-15-16:01:58 校长宁可跟网红撕也不愿意看一眼的悲伤悲伤悲伤我極药丸
    3626916467 不知道叫什么呀略略略 略略略 Jun-15-16:14:02 你别找茬哈哈哈哈哈哈哈笑死
    6441562826 四川话推广大使 爱说啥说啥  别来看你爹 Jun-15-16:02:03 这是和谁的聊天记录啊
    6553059545 一盆小蠢猫 ヾ(*Ő౪Ő*)少女心的避难所&好好生活🐯 Jun-15-16:04:03 笑死看得出来舔而不得恼羞成怒了
    5663066697 熱衷於農 🈚 粉籍 别来犯贱 Jun-15-16:01:08 真的很好笑哈哈哈哈哈
    5157145544 星下家的猫 下辈子一定要谈次恋爱 Jun-15-17:15:18 没想到真的是王思聪原来这么有钱也只配当舔狗啊
    '''


数据成功获取,但是还没有结束!!

我们的目标是全部评论,这特么才20条数据呀
问题是还没有控制翻页的page参数,这就......

没事咱们来接着分析。先从每一页的url开始。因为刚才咱们获取第一页数据的时候使用了params,所以在接下来的页数分析时也带上这个参数。

https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id_type=0
id: 4648381753067388
mid: 4648381753067388
max_id_type: 0

https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id=142700600108756&max_id_type=0
id: 4648381753067388
mid: 4648381753067388
max_id: 142700600108756
max_id_type: 0

https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id=139402070360589&max_id_type=0
id: 4648381753067388
mid: 4648381753067388
max_id: 139402070360589
max_id_type: 0

https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id=139264625576517&max_id_type=0
id: 4648381753067388
mid: 4648381753067388
max_id: 139264625576517
max_id_type: 0

https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id=139264625135744&max_id_type=0
id: 4648381753067388
mid: 4648381753067388
max_id: 139264625135744
max_id_type: 0


https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id=138577438675032&max_id_type=0
id: 4648381753067388
mid: 4648381753067388
max_id: 138577438675032
max_id_type: 0


相信大家一眼就看出来了,从第二页开始,params参数就多了一个max_id的参数。
而且这个参数在url中也是需要的。

id和mid都和首页链接是一样的。都是默认数据
只有这个max_id是跟随页数随机变化的。


那现在问题就变成了如何获取max_id

这是首页的params


这是接下来页面的params


也就是通过第一页的链接获取到了第二页的max_id,
然后通过第二页的链接获取到第三页max_id
以此类推,获取到全部数据......


  max_id = data['data']['max_id']
  print('max_id:', max_id)
  next_url = f'https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id={max_id}&max_id_type=0'
  print(next_url)
  '''
  max_id 1: 142700600108756
  https://m.weibo.cn/comments/hotflow?id=4648381753067388&mid=4648381753067388&max_id=142700600108756&max_id_type=0
  '''


这样就获取到了第二页的max_id和对应的下一页的链接。

链接在手,天下我有。数据就会远远不断地来了....







总结



1. 本文详细介绍了如何用Python爬取微博评论,
有兴趣的读者可以尝试自己动手练习一下。

2. 本文仅供读者学习使用,不做其他用途!

3. 右下角点亮[在看]
即可找我领取本文的全部代码呦!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存