python之requests+json爬取一个用户10篇文章相关信息以及每篇文章前六页评论信息

由于本人初学爬虫没几天,所以有一些可以改进的地方希望可以得到改正!

这篇爬虫需要用到的模块不是很多

  1. requests(重要)

  2. json(重要)

  3. pprint

对于我个人来说,模块用的越少,那么对于理解数据挖掘的信息难度就越大,越需要自己的总结归纳。

刚开始首先明确目标:通过url找到某个你想要爬取的用户首页(我爬取的微博是手机版(m.weibo.cn)的页面数据比较好分析)

需要找到的信息如下:

  1. 大v的博文文章id,文章内容,以及关于评论的一些信息

  2. 找到评论页面的信息,评论内容,id,翻页信息,等等

  3. 把俩者结合起来就行

看起来总体思路不是很难,难就难在页面分析怎么找到,我以我的例子来页面分析,我查的是宋雨琦的大v首页

目前是2020年2月4号的界面内容,直接查看后台代码,network一下

抓包分析

getIndex?开头的文件就是数据的主要存储地,点开data->cards->mblog,查看数据的存储方式,我们就能看到宋雨奇的第一篇博文

就大致猜到数据的存放信息,博文内容就是text后面的值,经过长时间的猜测恶,id后面的值就是博文的id,textlength就是博文的长度。接下来点进博文具体内容查看一下博文下面的评论信息是在哪里的

经过长时间的猜测对比,发现id后面的是文章id,text属性后面的是评论内容,user后面的id是用户信息,screen_name后面是评论用户后面的用户名,我们就发现具体要爬取信息的内容大致解析

接下来分析微博主页和微博正文之间url的关系也就是分析程序的接口

这个是上述图片里面hotflow文件Headers里面的Request URL里面的内容,经过对比分析发现里面的id和mid相同并且是文章的id

所以我们只需要获取文章id并且把上面的id和mid内容替换一下就可以找到不同文章数的评论内容

接下来对比第一页评论和第二页评论hotflow文件里面的Request URL内容

发现第二页比第一页多了一个"max_id"里面的内容,至于这个内容是什么呢?我不太清楚,但是我知道,我只需要获取到这个max_id内容,我就能获取多条数据,于是我苦思冥想,max_id应该和ajax请求有关系,并且第二页是接着第一页往下刷新的,于是我想从第一页找到第二页的max_id信息,最终发现在第一页的status里面有max_id并且值和第二页里面是相同的,推理一下,第二页就会有第三页的max_id,那么就能循环查找每一页的评论了

上面讲的是总体思路接下来上代码:

先获取当前界面的若干文章

import requests
import pprint
import json
import test1
url="https://m.weibo.cn/api/container/getIndex?uid=6634214154&luicode=20000174&type=uid&value=6634214154&containerid=1076036634214154"#获取主页的json数据
r=requests.get(url)
r.encoding="utf-8"
res=r.json()#json解析
# def GetCon(id):
#     UserUrl="https://m.weibo.cn/comments/hotflow?id={ids}&mid={ids}&max_id_type=0".format(ids=id)#第一页的数据,替换id使切换不同文章
#     test1.morePage(UserUrl,id)#显示一个博文下面前六页的评论信息
cards=res["data"]["cards"]#获取cards标签下面的所有数据
ids=[]
num=1#记录找到的博文数量
for card in cards:
    if(card.get("mblog",None)):
        id=card["mblog"]["id"]#获取博文id
        title=card["mblog"]["text"]#获取博文上面的标题
        print("文章数:"+str(num))#打印博文的篇数是第几篇
        num+=1
        print("文章id:"+str(id))#打印文章id
        print("文章内容:"+str(title))#显示文章内容
        print("用户评论==>")
        # GetCon(id)#显示用户评论

然后在获取一篇文章下面的若干条评论

import requests
import pprint
import json
def morePage(url,id):
    #使用cookies登陆访问
    header={"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
            "cookie":"你自己的cookies"}
    r=requests.get(url,headers=header)
    print(r.url)
    print("第一页")
    res=r.json()
    # pprint.pprint(res)
    max_ids=res["data"]["max_id"]
    print("max_id="+str(max_ids))
    users=res["data"]["data"]
    for user in users:
        print("用户id:"+str(user["user"]["id"]))
        print("用户名称:"+str(user["user"]["screen_name"]))
        print("评论内容:"+str(user["text"]))
        print("___")

    def getmax_id(id,max_id):
        #评论文件下面第一个文件有一个max_id的值就是第二页评论数据的内容,不过需要cookie登陆访问
        url="https://m.weibo.cn/comments/hotflow?id={id}&mid={id}&max_id={max_id}&max_id_type=0"
        header = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
            "cookie": "你自己的Cooke"}
        r=requests.get(url.format(id=id,max_id=max_id),headers=header)#定期更换cookies
        print(r.url)
        res=r.json()
        max_ids = res["data"]["max_id"]#获取下一页评论数据max_id,实现页面翻滚
        print("max_id=" + str(max_ids))
        users = res["data"]["data"]
        for user in users:
            print("用户id:" + str(user["user"]["id"]))#获取用户id
            print("用户名称:" + str(user["user"]["screen_name"]))#获取用户信息
            print("评论内容:" + str(user["text"]))#获取用户评论的内容
            print("___")
        return max_ids

    # print("第二页")
    # getmax_id(max_ids)
    for index in range(5):#循环五次找到后五页数据,由于刚开始找到一页,所以总共六页
        print("第%s页"%(str(index+2)))
        max_ids=getmax_id(id,max_ids)

# morePage("https://m.weibo.cn/comments/hotflow?id=4467541420632557&mid=4467541420632557&max_id_type=0","4467541420632557")

注意:

  1. 在获取第一页数据和第二页数据有不同的地方,第一页数据不需要cookies值,但是获取第二页数据就需要cookie值,不然访问不到预期文件,而是跳转到微博登陆界面
  2. 在界面分析的时候在cards下面不一定每一个字典里面都含有键"mblog"所以需要
    if(card.get("mblog",None)):

    在循环的时候做出判断,不然会出错

  3. 如果发现代码没有问题,但是报错关于什么json解析错误,说明Cooke可能过期,需要重新获取cookies才能访问界面

最后代码实现结果如下:

但是我还有有问题的地方,那就是,在评论里面有表情显示html文本,怎么在结果里面去掉?

希望有大佬来帮我解答!

顺便关注一下我的个人独立博客​​​​​​​哟

如果大家喜欢记得点个关注哟!我会持续更新的!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值