上次我们已经学会了如何爬取单页的微博评论,但是如果评论过多,只爬取单页的评论是不够的,所以我们需要爬取多页的评论

没看过之前的文章可以看一下

用python语言爬虫爬取微博评论(超详细版,大学生不骗大学生)_微博爬取-CSDN博客

爬虫爬取微博评论--中---结构化接收数据(超详细教程,大学生不骗大学生)-CSDN博客

目录

六、了解分页

6.1 查看分页

6.2 寻找分页的规律

七、多页实现 

八、完整代码


六、了解分页

6.1 查看分页

这里为了方便演示多页的评论,我寻找了一个评论在两千条左右的帖子

找到页面 -> 单机右键 -> 检查元素(审查元素) -> 点击网络(network) -> 点击小的放大镜(搜索)-> 复制一条评论 -> 进行搜索 -> 点击标头(headers) 

PS:之前的文章里有详细的一步一步的操作演示,如果有遇到问题的可以去看一下

 我们能看到这个界面,这是你复制的那条评论所对应的分页的一个URL

在这里我们可以看到这个“buildComments”,这是对应的整篇帖子的评论的包,我们复制这一小部分

注意不要复制多了真正需要复制的其实只有buildComments,也可以自己打,但是为了避免手打出现错误我是比较推荐复制

将这一小部分粘贴至过滤(filter) -> 回车

此时我们会看到,立即出现一个分页的搜索结果

然后不关闭检查元素的界面 -> 我们将鼠标移到帖子的部分,向下划动贴子中的评论,此时我们会发现,随着我们不断向下划动,会逐渐出现更多的搜索结果

6.2 寻找分页的规律

首先我们观察一下第一个分页的URL

点击第一个搜索的结果(就是名称下面的那四行,我们先点击第一行)

在这里我们可以看到第一个页面的URL是这样的

然后我们查看第二个页面的URL

我们观察一下这两个URL的区别

我们发现绿色框住的是第一个分页的,它是“count=10”没有max_id,二粉色框住的URL是有max_id的,不知道大家之前有没有印象,在我们预览(preview)界面中,我们是见到过max_id的,所以我们观察一下第一个分页的max_id

打开第一个分页的预览(preview)界面

我们发现第一个分页的max_id和第二个分页URL中的max_id是完全一样的,我们可以多观察几组(例如第二个分页的max_id和第三个分页URL中的max_id)

然后我们就发现了不同分页之间的规律

七、多页实现 

在前面的代码中我们已经实现了单页的评论爬取,在这里我们是需要对URL进行修改就可

(下面演示的代码是不完全,只写出来新加的代码)

headers = {
    # 之前的headers的值
}
# 定义一个get_next宏函数,在函数立里面定一个next变量,它的初值是 count=10
def get_next(next='count=10’):
# 然后我们把URL这里的 count=10 替换成 next 变量的值
    url = f'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5003170104741808&is_show_bulletin=2&is_mix=0&{next}&uid=7190522839&fetch_level=0&locale=zh-CN’

    response = requests.get(url=url,headers=headers)
    json_data = response.json()

    data_list = json_data['data']
    max_id = json_data['max_id’]  # 这里是单独获取这个分页的max_id
    
    #这里是正常的格式化获取数据代码,为了方便观察新代码的结构我没写上

    # 这里把单纯的 max_id 的数字加上 max_id=
    max_str = 'max_id='+str(max_id)
    # 调用get_next,且更行next的值
    get_next(max_str)
# 调用方法
get_next()

八、完整代码

我们把之前的代码加上

import requests
import csv

f = open('评论.csv',mode='a',encoding='utf-8-sig',newline='')
csv_write = csv.writer(f)
csv_write.writerow(['id','screen_name','text_raw','like_counts','total_number','created_at'])
# 请求头
headers = {
        # 用户身份信息
        'cookie': 'SINAGLOBAL=3869338173200.8403.1711845564842; SUB=_2A25LDMCxDeRhGeFJ71sS8CvLzTmIHXVoYFx5rDV8PUNbmtB-LVD9kW9Nf6JZvhCZ3PGanwgbD1yc6zGrHhnf6wrq; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W586R5s7_p1VykF21DkOu3L5JpX5o275NHD95QNS0B4e05fS0qfWs4DqcjAMJv09CH8SE-4BC-RSFH8SCHFxb-ReEH8SFHFBC-RBbH8Sb-4SEHWSCH81FHWxCHFeFH8Sb-4BEHWB7tt; ALF=1712450401; ULV=1711898034864:2:2:2:7503967975067.276.1711898034641:1711845565244; XSRF-TOKEN=aCKBvTY69V5X8kKbW1jSLjdj; WBPSESS=7dB0l9FjbY-Rzc9u1r7G0AeIukWsnj2u9VSmMssaP8z8nNdVQm3MrakDKiijTO3Y_iL6pEDJ8mgGw5Ql6jIh-fzvfDRMIeuWHMU2fJkIgYlwx20EQfKsyJ2pPS9worRswHbmrN7qQifEsHMJ5esrgA==',
        # 防盗链
        'referer': 'https://weibo.com/7190522839/O1kt4jTyM',
        # 浏览器基本信息
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36'
    }


def get_next( next = 'count=10'):
    url = f'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5003170104741808&is_show_bulletin=2&is_mix=0&{next}&uid=7190522839&fetch_level=0&locale=zh-CN'

    response = requests.get(url=url,headers=headers)
    json_data = response.json()

    data_list = json_data['data']
    max_id = json_data['max_id']
    for data in data_list:
        text_raw = data['text_raw']
        id = data['id']
        created_at = data['created_at']
        like_counts = data['like_counts']
        total_number = data['total_number']
        screen_name = data['user']['screen_name']
        print(id,screen_name,text_raw,like_counts,total_number,created_at)

        csv_write.writerow([id,screen_name,text_raw,like_counts,total_number,created_at])

    max_str = 'max_id='+str(max_id)
    get_next(max_str)
get_next()

到这第一步就彻底成功喽!!!!!!

打开生成的表格之前的文章里面有!

有任何问题或者写的有错误,都可以在评论区和我说,虽然我不一定会,因为我也是刚入门!!


啦啦啦啦啦啦大家清明有出去玩吗,我出去了一天,但是感觉耽误了很多时间 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐