热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分分钟百万条数据的微博爬虫分析

微博爬虫系列2-分析微博接口大家好,我是W经

微博爬虫系列2-分析微博接口

大家好,我是W

经过上一篇的分析我们无意中发现了微博的接口,并且不做任何的账号、流量限制可以直接获取最完整的微博数据。接下来我们就通过分析微博粉丝接口查看其中的数据结构顺便看看能不能找到其他api。

最新消息,微博接口没有修复,本篇文章不仅仅可供简单参考,下述所有api都没有失效!2020年4月22日09:18:26

分析微博粉丝接口

由微博爬虫系列1可以知道无意间发现的微博粉丝接口可以高频请求数据,并且其返回的数据都是最权威最全的,甚至用户无法查看的数据都可以找到了。接下来我们要分析这个json串的内容,查看其格式。

请求 https://m.weibo.cn/api/container/getIndex?cOntainerid=231051_-_fans_-_5371249259&since_id=1

可以看到返回的数据格式是这样的:

"ok":1,
"data":Object{...}

明显ok是状态码,目前接口还没有被替换,所以请求结果还是1。看看data下的数据是怎么样的:

"data":{
"cardlistInfo":Object{...},
"cards":Array[32],
"banners":null,
"scheme":"sinaweibo://cardlist?cOntainerid=231051_-_fans_-_5371249259&since_id=1&v_p=42&luicode=10000011&lfid=231051_-_fans_-_5371249259"
}

data下有cardlistInfocardsscheme其中cardlistInfocards是很有可能藏有数据的,分别来看看。

cardlistInfo

"cardlistInfo":{
"containerid":"231051_-_fans_-_5371249259",
"title_top":"他的好友",
"show_style":"1",
"cardlist_head_cards":Array[1],
"since_id":"2"
},

点开cardlistInfo立马发现了些许端倪,返回头观察请求的接口:https://m.weibo.cn/api/container/getIndex?cOntainerid=231051_-_fans_-_5371249259&since_id=1,中间有一个containerid不就藏在这里吗?ok,这里好像已经请求过了,没什么用。但是接下来就需要注意有没有类似的字段了。

继续点开cardlistInfo下的cardlist_head_cards

"cardlist_head_cards":[
{
"head_type":0,
"head_type_name":"channel_list",
"menu_scheme":"",
"channel_list":[
{
"id":"231051_-_fansrecomm_-_5371249259",
"name":"推荐",
"containerid":"231051_-_fansrecomm_-_5371249259",
"scheme":"",
"must_show":1,
"default_add":1
},
{
"id":"231051_-_followers_-_5371249259",
"name":"他的关注",
"containerid":"231051_-_followers_-_5371249259",
"scheme":"",
"must_show":1,
"default_add":1
},
{
"id":"231051_-_fans_-_5371249259",
"name":"他的粉丝",
"containerid":"231051_-_fans_-_5371249259",
"scheme":"",
"must_show":1,
"default_add":1
}
]

哦吼,好像就发现了宝藏~这里的channel_list下的id格式就跟containerid一模一样啊!这样一来就不需要辛苦请求页面然后解析了,完全可以直接按照api的格式反复请求就可以获取数据了,而且还省了解析页面的编码工作。其他字段好像没什么用,就不用看了。

cards

既然cardlistInfo装的是其他频道的url,那么cards装的就是本次请求的几十个粉丝的信息了。看看是不是先!

"cards":[
Object{...},
Object{...},
{
"card_style":1,
"card_type":11,
"itemid":"",
"card_group":[
{
"card_type":42,
"scheme":"https://m.weibo.cn/p/index?cOntainerid=231051_-_followerstagBigV_-_5371249259_-_1042015%3AtagCategory_050&luicode=10000011&lfid=231051_-_fans_-_5371249259",
"display_arrow":1,
"title_extra_text":"查看",
"itemid":"2310511045_3_5371249259_0",
"desc":"71个娱乐明星博主关注了他",
"actionlog":{
"act_code":659,
"fid":"231051_-_fans_-_5371249259",
"lfid":"",
"oid":"",
"cardid":"2310511045_3_5371249259_0",
"ext":"act:skip|skiptype:grouplist"
}
},

可以看到cards里装了几十个object,点开前几个发现都是类似**“desc”:“71个娱乐明星博主关注了他”**这种信息,显然就是粉丝列表中的子频道,微博把一些该用户下比较出名的粉丝按照分类置顶了,而其他粉丝就放在下面。

在这里插入图片描述

card_group下的第二个object里的elements居然就装着每一个博主的uid、粉丝列表URL,我去简直不能太爽。

"elements":[
{
"uid":6004589610,
"scheme":"sinaweibo://userinfo?uid=6004589610&lcardid=2310511026_2_42_5371249259",
"itemid":"2310511045_2_5371249259_0",
"actionlog":{
"act_code":695,
"fid":"231051_-_fans_-_5371249259",
"lfid":"",
"oid":"",
"cardid":"2310511045_2_5371249259_0",
"ext":"act:skip|skiptype:profile"
}
},

那么再看普通粉丝(非大V)的情况,经过我一通乱点,终于把各个领域的大V点掉了,同时在反复请求多个博主的粉丝列表后发现普通粉丝的列表都藏在cards下的最后一个object,所以在解析json是可以直接'cards'[-1],也挺方便的,如果不嫌麻烦把前面的大V都先请求了也行,但是要额外的代码去判断,也不是很麻烦。但是既然显示的是‘他的全部粉丝’,那么应该也包括大V吧。

Object{...},
{
"card_type":11,
"title":"他的全部粉丝",
"itemid":"2310510033_1_ _5371249259",
"card_group":Array[20]
}

可以看到card_group里藏了20个object。而且每一位粉丝的信息都超级详细,详细的我不敢相信!不管你有的没的,有用没用,前台能不能显示,这里全都给你!

"card_type":10,
"itemid":"2310510033_1_ _5324423598",
"scheme":"https://m.weibo.cn/u/5324423598?uid=5324423598&luicode=10000011&lfid=231051_-_fans_-_5371249259",
"background_color":0,
"recom_remark":"",
"recommend":"",
"desc1":"",
"desc2":"粉丝:310",
"user":{
"id":5324423598,
"screen_name":"Daben_忠",
"profile_image_url":"https://tvax2.sinaimg.cn/crop.0.0.512.512.180/005OkJNYly8fraqwzsrimj30e80e8wf5.jpg?KID=imgbed,tva&Expires=1587363328&ssig=yIX%2BW4cg4R",
"profile_url":"https://m.weibo.cn/u/5324423598?uid=5324423598&luicode=10000011&lfid=231051_-_fans_-_5371249259",
"statuses_count":null,
"verified":false,
"verified_type":-1,
"close_blue_v":false,
"description":"",
"gender":null,
"mbtype":2,
"urank":null,
"mbrank":1,
"follow_me":false,
"following":false,
"followers_count":310,
"follow_count":310,
"cover_image_phone":"https://tva1.sinaimg.cn/crop.0.0.640.640.640/549d0121tw1egm1kjly3jj20hs0hsq4f.jpg",
"desc1":null,
"desc2":null
},
"actionlog":{
"act_code":695,
"cardid":"2310510033_1_ _5324423598",
"oid":5324423598,
"featurecode":"",
"mark":"",
"ext":"act:skip|act_valu:sinaweibo://userinfo?uid=5324423598|uid:0|follow:5324423598|skiptype:profile",
"uicode":"",
"luicode":"",
"fid":"231051_-_fans_-_5371249259",
"lfid":"",
"lcardid":""
},
"buttons":[
{
"type":"follow",
"sub_type":0,
"name":"关注",
"skip_format":1,
"params":{
"uid":5324423598,
"need_follow":1,
"trend_ext":5324423598,
"trend_type":42,
"itemid":5324423598
},
"actionlog":{
"act_code":1338,
"cardid":"2310510033_1_ _5324423598",
"oid":"",
"featurecode":"",
"mark":"",
"ext":"act:follow|act_valu:sinaweibo://userinfo?uid=5324423598|uid:0|follow:5324423598",
"luicode":"",
"fid":"231051_-_fans_-_5371249259",
"lfid":"",
"lcardid":""
},
"scheme":"/api/container/btn?module=follow&uid=5324423598&cardid=2310510033_1_+_5324423598"
}

总结

ok到这里粉丝列表接口就分析结束了,从中我们可以一次请求到其他频道的containerid,并且还能获取20位粉丝的uid,而且信息超级全。到这里其实我们的项目就可以换一个思路了,是不是可以通过固定请求一些大V的粉丝列表直接获取粉丝的详情呢?那么第一篇中解析用户详情页的代码是不是就作废了?这是值得思考的问题,毕竟一个方法简便,另一个方法好像有一些其他标签可以获取。看个人取舍把。

分析cOntainerid=231051_-_followers_-_{}

从上节可以得到followers的列表,不废话,直接请求!

{
"ok":1,
"data":{
"cardlistInfo":Object{...},
"cards":Array[2],
"banners":null,
"scheme":"sinaweibo://cardlist?cOntainerid=231051_-_followers_-_5371249259&since_id=1&luicode=10000011&lfid=231051_-_fansrecomm_-_5371249259&v_p=42"
}
}

同样的分为cardlistInfocards,看看呗。

cardlistInfo

"cardlistInfo":{
"containerid":"231051_-_followers_-_5371249259",
"title_top":"他的好友",
"show_style":"1",
"total":50
},

可以看到这里显示的仅仅是他的好友(关注)数量,如果有需要的话也可以解析。

cards

"cards":[
Object{...},
Object{...}
],

点开只有两个object,我估计逻辑跟fans一样,前面的object是他的大V好友(关注),最后一个是普通好友(关注)(非关系普通啊)。果不其然:

{
"card_type":10,
"itemid":"2310510024_1_ _5183309747",
"scheme":"https://m.weibo.cn/u/5183309747?uid=5183309747&luicode=10000011&lfid=231051_-_followers_-_5371249259",
"background_color":0,
"recom_remark":"",
"recommend":"",
"desc1":"V用户创作中心官方微博",
"desc2":"粉丝:140万",
"user":Object{...},
"actionlog":Object{...},
"buttons":Array[1]
},

具体信息大家自己看吧,我就不发完整版出来了。所以同样的还是通过-1来请求。通过这个api可以获得5000位关注,大部分人都没有关注五千位博主,所以并不需要担心遗漏。

总结

到这里我们已经撬出了微博几乎所有的****了(大家懂的),那么当我们有一些场景需要做情感分析、语义分析等内容研究的时候,或者做用户数据分析的时候还需要获取大家的发言(微博)。所以我决定继续扒下去(虽然3G版已经确认可以获取了,但是接口更方便啊)。

分析获取用户所有微博

目前移动版已经在维护了,我没有办法给大家实际刷新用户微博来找ajax刷新。但是我之前撬出来的接口还是在的,经过请求https://m.weibo.cn/api/container/getIndex?cOntainerid=2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page=2这个接口可以获取该用户历史上发过的所有微博,没错是所有的微博。

{
"ok":1,
"data":{
"cards":Array[10],
"cardlistInfo":Object{...},
"banners":null,
"scheme":"sinaweibo://cardlist?cOntainerid=2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO&page=2&luicode=10000011&lfid=231051_-_followers_-_5371249259&v_p=42"
}
}

还是一样,data下有cards和’cardkustInfo’,主要看这两个。

cards

我给大家来了一个完整的微博携带的信息,其中微博放在mblog字段里,有发布时间、该条微博的id、是否可编辑、微博文字内容、文本长度、发送源、发送者的基本信息、微博的点赞、评论、转发数、观看数、甚至还可以直接获取微博的视频、附图等等,我的妈简直想要啥有啥!

"cards":[
{
"card_type":9,
"card_type_name":"",
"itemid":"",
"scheme":"https://m.weibo.cn/status/IDIvCdDl9?mblogid=IDIvCdDl9&luicode=10000011&lfid=2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO",
"mblog":{
"visible":{
"type":0,
"list_id":0
},
"created_at":"04-17",
"id":"4494658883249491",
"idstr":"4494658883249491",
"mid":"4494658883249491",
"can_edit":false,
"show_additional_indication":0,
"text":"【#六安#这个会不会上新闻?交警:安排[doge]】近日,@六安公安交警微发布 酒驾醉驾查缉行动时,查获一辆卖麻花的小货车驾驶员醉酒驾驶,经呼气式酒精检测仪检测,结果为100mg/100ml。经询问后得知,当日驾驶员与妻子发生口角,心情郁闷喝酒消愁,喝完后驾车离家散心,不料被民警当场查获,再添新愁 ...全文",
"textLength":325,
"source":"iPhone 11",
"favorited":false,
"pic_types":"",
"is_paid":false,
"mblog_vip_type":0,
"user":{
"id":3142725962,
"screen_name":"六安身边事",
"profile_image_url":"https://tvax3.sinaimg.cn/crop.444.444.1111.1111.180/bb52314aly8ftvqcdmgeuj21jk1jkgr8.jpg?KID=imgbed,tva&Expires=1587376254&ssig=ZVtMNpgTff",
"profile_url":"https://m.weibo.cn/u/3142725962?uid=3142725962&luicode=10000011&lfid=2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO",
"statuses_count":24129,
"verified":true,
"verified_type":0,
"verified_type_ext":0,
"verified_reason":"本地资讯博主(六安) 城市生活家 资讯视频自媒体",
"close_blue_v":false,
"description":"六安市2018年度影响力自媒体;微博区域MCN机构",
"gender":"m",
"mbtype":12,
"urank":48,
"mbrank":7,
"follow_me":false,
"following":false,
"followers_count":392912,
"follow_count":1261,
"cover_image_phone":"https://wx2.sinaimg.cn/crop.0.0.640.640.640/b71b8da8ly1flzuujb28qj20v90v9diw.jpg",
"avatar_hd":"https://wx3.sinaimg.cn/orj480/bb52314aly8ftvqcdmgeuj21jk1jkgr8.jpg",
"like":false,
"like_me":false,
"badge":{
"gongyi_level":1,
"dailv":1,
"dzwbqlx_2016":1,
"follow_whitelist_video":1,
"league_badge":1,
"super_star_2017":1,
"travel_2017":1,
"user_name_certificate":1,
"suishoupai_2018":1,
"wenchuan_10th":1,
"super_star_2018":1,
"worldcup_2018":34,
"dailv_2018":1,
"lol_s8":1,
"double11_2018":1,
"relation_display":1,
"hongbaofei_2019":1,
"suishoupai_2019":2,
"wusi_2019":1,
"hongrenjie_2019":1,
"china_2019":1,
"dzwbqlx_2019":2,
"rrgyj_2019":1,
"hongbao_2020":2,
"feiyan_2020":1,
"daka_2020":1
}
},
"reposts_count":0,
"comments_count":3,
"attitudes_count":2,
"pending_approval_count":0,
"isLongText":true,
"reward_exhibition_type":2,
"reward_scheme":"sinaweibo://reward?bid=1000293251&enter_id=1000293251&enter_type=1&oid=4494658883249491&seller=3142725962&share=18cb5613ebf3d8aadd9975c1036ab1f47&sign=b004151e640c99bdc9293b74382fd13c",
"hide_flag":0,
"mlevel":0,
"mblogtype":0,
"more_info_type":0,
"cardid":"star_005",
"extern_safe":0,
"number_display_strategy":{
"apply_scenario_flag":3,
"display_text_min_number":1000000,
"display_text":"100万+"
},
"content_auth":0,
"pic_num":0,
"mblog_menu_new_style":0,
"weibo_position":1,
"show_attitude_bar":0,
"obj_ext":"1万次观看",
"page_info":{
"page_pic":{
"url":"https://wx4.sinaimg.cn/large/bf43fbefly1gdryw81xdmj20q80f4760.jpg"
},
"page_url":"https://m.weibo.cn/p/index?cOntainerid=2304444493207631757333&url_type=39&object_type=video&pos=2&luicode=10000011&lfid=2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO",
"page_title":"六安公安交警微发布的微博视频",
"content1":"六安公安交警微发布的微博视频",
"content2":"#一线微观# 【这个会不会上新闻?交警:安排!】近日,六安市公安局交警支队一大队在例行开展酒驾醉驾查缉行动时,查获一辆卖麻花的小货车驾驶员醉酒驾驶,经呼气式酒精检测仪检测,结果为100mg/100ml。经询问后得知,当日驾驶员与妻子发生口角,心情郁闷便在家喝酒消愁,喝完后驾车离家",
"type":"video",
"media_info":{
"video_orientation":"horizontal",
"name":"六安公安交警微发布的微博视频",
"stream_url":"http://f.video.weibocdn.com/3QTv0zsMlx07CsAapi2I01041200hzKP0E010.mp4?label=mp4_ld&template=624x360.25.0&trans_finger=40a32e8439c5409a63ccf853562a60ef&Expires=1587369054&ssig=%2BXJ4cyp54e&KID=unistore,video",
"stream_url_hd":"http://f.video.weibocdn.com/cnBPuJmelx07CsAaxM6401041200r7t00E010.mp4?label=mp4_hd&template=832x480.25.0&trans_finger=62b30a3f061b162e421008955c73f536&Expires=1587369054&ssig=wXMI%2FfqsPc&KID=unistore,video",
"h5_url":"https://video.weibo.com/show?fid=1034:4493207631757333",
"mp4_sd_url":"http://f.video.weibocdn.com/3QTv0zsMlx07CsAapi2I01041200hzKP0E010.mp4?label=mp4_ld&template=624x360.25.0&trans_finger=40a32e8439c5409a63ccf853562a60ef&Expires=1587369054&ssig=%2BXJ4cyp54e&KID=unistore,video",
"mp4_hd_url":"http://f.video.weibocdn.com/cnBPuJmelx07CsAaxM6401041200r7t00E010.mp4?label=mp4_hd&template=832x480.25.0&trans_finger=62b30a3f061b162e421008955c73f536&Expires=1587369054&ssig=wXMI%2FfqsPc&KID=unistore,video",
"h265_mp4_hd":"",
"h265_mp4_ld":"",
"inch_4_mp4_hd":"",
"inch_5_mp4_hd":"",
"inch_5_5_mp4_hd":"",
"mp4_720p_mp4":"http://f.video.weibocdn.com/Bdk41g2Olx07CsAaymg001041200zTxw0E010.mp4?label=mp4_720p&template=944x544.25.0&trans_finger=1f0da16358befad33323e3a1b7f95fc9&Expires=1587369054&ssig=sVeIvpAkMv&KID=unistore,video",
"hevc_mp4_720p":"",
"prefetch_type":1,
"prefetch_size":262144,
"act_status":1,
"protocol":"general,dash",
"media_id":"4493207631757333",
"origin_total_bitrate":0,
"duration":81,
"next_title":"【#六安#这个会不会上新闻?交警:安排[doge]】近日,@六安公安交警微发布 酒驾醉驾查缉行动时,查获一辆卖麻花的小货车驾驶员醉酒驾驶,经呼气式酒精检测仪检测,结果为100mg/100ml。经询问后得知,当日驾驶员与妻子发生口角,心情郁闷喝酒消愁,喝完后驾车离家散心,不料被民警当场查获,再添新愁 ​​​",
"play_completion_actions":[
{
"type":"1",
"icon":"http://img.t.sinajs.cn/t6/style/images/face/feed_c_r.png",
"text":"重播",
"link":"",
"btn_code":1000,
"show_position":1,
"actionlog":{
"oid":"2304444493207631757333",
"act_code":1221,
"act_type":0,
"source":"video"
}
}
],
"video_publish_time":1586747661,
"play_loop_type":0,
"author_mid":"4493208203541512",
"author_name":"六安公安交警微发布",
"is_playlist":1,
"get_playlist_id":4318905293016382,
"extra_info":{
"sceneid":"feed"
},
"has_recommend_video":1,
"back_paster_info":{
"has_back_paster":1,
"request_param":{
"video_type":1,
"video_orientation":"horizontal",
"width":832,
"height":480
}
},
"author_verified_type":1,
"video_download_strategy":{
"abandon_download":0
},
"jump_to":2,
"online_users":"1万次观看",
"online_users_number":13335,
"ttl":3600,
"storage_type":"oss",
"is_keep_current_mblog":0
},
"play_count":"1万次观看",
"object_id":"1034:4493207631757333"
},
"bid":"IDIvCdDl9"
},
"show_type":1,
"title":""
},

cardlistInfo

同样的来看看cardlistInfo有什么

"cardlistInfo":{
"can_shared":0,
"total":24132,
"show_style":1,
"title_top":"微博",
"page_type":"03",
"cardlist_head_cards":[
Object{...}
],
"page":3
},

这里有个total字段表示总共发的微博数

继续点看cardlist_head_cards

"cardlist_head_cards":[
{
"head_type":0,
"channel_list":[
{
"id":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO",
"name":"全部",
"containerid":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO",
"default_add":1,
"must_show":1,
"apipath":"/2/profile/statuses/tab"
},
{
"id":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_ORI",
"name":"原创",
"containerid":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_ORI",
"default_add":1,
"must_show":1,
"apipath":"/2/profile/statuses/tab"
},
{
"id":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_VIDEO",
"name":"视频",
"containerid":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_VIDEO",
"default_add":1,
"must_show":1,
"apipath":"/2/profile/statuses/tab"
},
{
"id":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_ARTICAL",
"name":"文章",
"containerid":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_ARTICAL",
"default_add":1,
"must_show":1,
"apipath":"/2/profile/statuses/tab"
},
{
"id":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_PIC",
"name":"图片",
"containerid":"2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO_PIC",
"default_add":1,
"must_show":1,
"apipath":"/2/profile/statuses/tab"
}
]
}
],

发现就是一堆containerid,现在我内心毫无波澜,这点风浪吹不动我了!但是!我怎么访问其他用户啊?看来还是要从接口找规律:

我们发现请求微博的URL是:

https://m.weibo.cn/api/container/getIndex?cOntainerid=2304133142725962_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page=2

而其中上面看到该用户的uid是3142725962,试着改改其他用户看看。果然!所以在这个逻辑下我们可以完整的把所有微博内容拿到。当然上面这堆containerid并不是毫无价值,其实是根据内容分类把带相应内容的做成不同的接口了,大家感兴趣可以搞一搞。

获取微博下的评论列表

还记得上面提到的微博有个微博id吗?按照我们正常的思维,要是把微博和评论联系在一起当然是要给每条微博一个id,每条评论一个id(评论可以被评论,万恶之源啊哈哈)。所以我们要做的是针对每条微博获取id,然后通过id去找相关的评论,当然这不需要我们写SQL。因为服务器会根据请求把相关内容传回来!

我是怎么发现这个接口的

其实在经过上面那么多接口的挖掘后,我觉得微博应该不会搞特殊(经验),评论也是通过ajax传来的,并且api格式应该大同小异。所以在移动版评论区里随意划了几下就找到ajax文件了。

查看接口

https://m.weibo.cn/comments/hotflow?id=4491013580124575&mid=4491013580124575&max_id_type=0&display=0&retcode=6102

找到接口后后面几个字段不知道是什么,删删看。当请求URL删成https://m.weibo.cn/comments/hotflow?id=4491013580124575&mid=4491013580124575还是可以访问的,并且会自动补全&display=0&retcode=6102

再刷一下,发现来了一个max_id

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

而且这东西好像是时间戳?转一个看看:6382-10-26 06:16:22 我猜错了。那会不会是毫秒级时间戳,经过一波操作计算,还是不对!这时候我突然想起鲁迅说的一句话:万事万物都有联系,你看看上一条有没有这一个字段?

行!我去看看,我相信鲁迅(在数据传输中有一个方法来确认是否是可信赖的客户端请求的 类似于计算机网络中的三次握手 每一次都会有一个seq ack 然后对方回送确认信息需要ACK=seq+1 seq = 自定义 这样就可以形成可信赖的握手机制 )。

我们直接请求第一条URL应该是可以直接请求得到数据的,那么想要获得下一条数据应该要在第一条中找到相应的字段。

{
"ok":1,
"data":{
"data":[
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...}
],
"total_number":163,
"status":{
"comment_manage_info":{
"comment_permission_type":-1,
"approval_comment_type":0
}
},
"max_id":139529951856077,
"max":9,
"max_id_type":0
}
}

果然在第一条下有一个max_id,这就是请求第二条的依据。ok,找到这个规律后剩下得到信息就是易如反掌。

查看评论的数据格式

"data":{
"data":[
{
"created_at":"Tue Apr 07 10:47:26 +0800 2020",
"id":"4491026611982537",
"rootid":"4491026611982537",
"rootidstr":"4491026611982537",
"floor_number":16,
"text":"教育类可能扩招吗",
"disable_reply":0,
"user":{
"id":3156249175,
"screen_name":"鸡蛋丫丫丫",
"profile_image_url":"https://tvax4.sinaimg.cn/crop.0.0.512.512.180/bc208a57ly8gdsb3q3b3pj20e80e8aah.jpg?KID=imgbed,tva&Expires=1587377510&ssig=X0%2BhuHDAJI",
"profile_url":"https://m.weibo.cn/u/3156249175?uid=3156249175",
"statuses_count":9,
"verified":false,
"verified_type":-1,
"close_blue_v":false,
"description":"迪士尼在逃公主",
"gender":"f",
"mbtype":0,
"urank":14,
"mbrank":0,
"follow_me":false,
"following":false,
"followers_count":111,
"follow_count":33,
"cover_image_phone":"https://tva3.sinaimg.cn/crop.0.0.640.640/6ce2240djw1e9uwsjwemzj20hs0hs41z.jpg",
"avatar_hd":"https://wx4.sinaimg.cn/orj480/bc208a57ly8gdsb3q3b3pj20e80e8aah.jpg",
"like":false,
"like_me":false,
"badge":{
"bind_taobao":1,
"unread_pool":1,
"dzwbqlx_2016":1,
"panda":1,
"user_name_certificate":1,
"hongbao_2020":2
}
},
"mid":"4491026611982537",
"readtimetype":"comment",
"comments":[
{
"created_at":"Tue Apr 07 10:49:04 +0800 2020",
"id":"4491027022489150",
"rootid":"4491026611982537",
"rootidstr":"4491026611982537",
"floor_number":0,
"text":"会",
"disable_reply":0,
"comment_badge":[
{
"pic_url":"https://h5.sinaimg.cn/upload/1007/25/2019/05/17/feed_icon_poster_identity133low.png",
"length":1.3300000000000000710542735760100185871124267578125,
"actionlog":{
"act_code":"3671",
"ext":"status:author"
},
"scheme":"https://kefu.weibo.com/faqdetail?id=20848"
}
],
"user":{
"id":5448321577,
"screen_name":"白先生驿站",
"profile_image_url":"https://tva2.sinaimg.cn/crop.0.0.664.664.180/005WIBktjw8f87vu6ik0nj30ig0igq3o.jpg?KID=imgbed,tva&Expires=1587377510&ssig=IJmDx9yP3U",
"profile_url":"https://m.weibo.cn/u/5448321577?uid=5448321577",
"statuses_count":889,
"verified":true,
"verified_type":0,
"verified_type_ext":1,
"verified_reason":"头条文章作者",
"close_blue_v":false,
"description":"自律给我自由",
"gender":"f",
"mbtype":11,
"urank":19,
"mbrank":1,
"follow_me":false,
"following":false,
"followers_count":40587,
"follow_count":240,
"cover_image_phone":"https://tva1.sinaimg.cn/crop.0.0.640.640.640/6ce2240djw1e9ob3xerqoj20hs0hsjur.jpg",
"avatar_hd":"https://ww2.sinaimg.cn/orj480/005WIBktjw8f87vu6ik0nj30ig0igq3o.jpg",
"like":false,
"like_me":false,
"badge":{
"bind_taobao":1,
"unread_pool":1,
"unread_pool_ext":1,
"panda":1,
"user_name_certificate":1,
"wenda_v2":1,
"wbzy_2018":1,
"hongbaofei_2019":1,
"status_visible":1,
"suishoupai_2019":1,
"hongbao_2020":3,
"feiyan_2020":1,
"daka_2020":1
}
},
"mid":"4491027022489150",
"readtimetype":"comment",
"shouldShowColon":1,
"bid":"ICc1MarxA",
"source":""
},

可以看到这个接口可以请求到发布时间、用户信息、楼层等等,同时评论内还是会嵌套评论的因为有一个rootidid的区别,所以循着这个规则是可以一层层的请求下去的。

总结

到此为止整个微博爬虫的分析就已经完毕了,原本通过3G版微博获取用户信息,结果发现了微博的接口,并且经过一段时间的尝试把微博的几乎所有接口的规则都撬出来了。刚开始做这个项目还是小心翼翼的,因为不知道如果控制不好抓取大量数据会怎么样。现在就不用担心了,因为移动版已经在维护了,我估计这个接口很快就会修复,而我的目的也达到了。但是还是继续努力吧,这次是运气好碰上这个api了,下次希望能够挑战分布式。


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
author-avatar
望空心vn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有