热门标签 | 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了,下次希望能够挑战分布式。


推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文介绍了如何在Delphi中使用剪切板类TClipboard进行文本的复制和粘贴操作,包括AsText属性、SetTextBuf方法和GetTextBuf方法的具体使用。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • Delphi XE Rtti单元深入解析:TRttiContext的应用与实践
    Delphi XE Rtti单元深入解析:TRttiContext的应用与实践 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
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社区 版权所有