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

微博爬虫系列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个娱乐明星博主关注了他”**这种信息,显然就是粉丝列表中的子频道,微博把一些该用户下比较出名的粉丝按照分类置顶了,而其他粉丝就放在下面。

分分钟百万条数据的微博爬虫分析_第1张图片

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

你可能感兴趣的:(爬虫)