由于本人初学爬虫没几天,所以有一些可以改进的地方希望可以得到改正!
这篇爬虫需要用到的模块不是很多
-
requests(重要)
-
json(重要)
-
pprint
对于我个人来说,模块用的越少,那么对于理解数据挖掘的信息难度就越大,越需要自己的总结归纳。
刚开始首先明确目标:通过url找到某个你想要爬取的用户首页(我爬取的微博是手机版(m.weibo.cn)的页面数据比较好分析)
需要找到的信息如下:
-
大v的博文文章id,文章内容,以及关于评论的一些信息
-
找到评论页面的信息,评论内容,id,翻页信息,等等
-
把俩者结合起来就行
看起来总体思路不是很难,难就难在页面分析怎么找到,我以我的例子来页面分析,我查的是宋雨琦的大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")
注意:
- 在获取第一页数据和第二页数据有不同的地方,第一页数据不需要cookies值,但是获取第二页数据就需要cookie值,不然访问不到预期文件,而是跳转到微博登陆界面
- 在界面分析的时候在cards下面不一定每一个字典里面都含有键"mblog"所以需要
if(card.get("mblog",None)):
在循环的时候做出判断,不然会出错
-
如果发现代码没有问题,但是报错关于什么json解析错误,说明Cooke可能过期,需要重新获取cookies才能访问界面
最后代码实现结果如下:
但是我还有有问题的地方,那就是,在评论里面有表情显示html文本,怎么在结果里面去掉?
希望有大佬来帮我解答!
顺便关注一下我的个人独立博客哟