爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战

一、回顾

我们之前利用Scrapy爬取豆瓣网站信息时,直接通过加载目标URL返回的Response得到想要的值。我也在后面爬取知乎网站时通过模拟登录的方式进入到目标URL,也是通过返回的Response得到需要的值。
这一次,我们将通过解析网站的HTTP请求去破解获取数据的API的方式去爬取想要的数据。

二、找出微博用户唯一标示:oid

一般做爬虫爬取网站时,首选的都是m站,其次是wap站,最后考虑PC站,因为PC站的各种验证最多。当然,这不是绝对的,有的时候PC站的信息最全,而你又恰好需要全部的信息,那么PC站是你的首选。一般m站都以m开头后接域名, 我们这次通过m.weibo.cn去分析微博的HTTP请求。

  • 首先在PC打开人民日报的微博主页:人民日报PC站微博主页
  • 接着打开调试页面(F12,或右击检查),先选中右侧手机模式,然后刷新页面,这个时候就出来了m站微博主页:
    https://m.weibo.com/p/1005052803301701
    也有些是m站微博主页为:https://m.weibo.com/u/2189067512

注意:
1)当你打开一个页面,再点开network标签时是不会有信息的,我们需要在打开的情况下,刷新一下页面;
2)为了防止页面突然的跳转而丢失信息,一定要勾上preserved单选框。

《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 手机模式打开网页

  • 那么这里的1005052803301701和2189067512是什么呢?我们不妨继续在PC上进行观察。我们进入调试页面打开Network,选择Doc,分析返回的HTTP包内容,我们发现有一个oid的值为2803301701。

    《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 在网页需要用户唯一标示

  • 我们通过多次抓包分析不同的微博主页,我们会发现以p打头的类似“p/1005052803301701”,或以u打头的类似“u/2189067512”,它们的oid要么是除掉100505之外的其他数字,要么就是u后面的数字。那么我们推断这里的oid就是用户的唯一标示。

三、找出微博用户的微博内容api

找到用户id后,我们继续在Network搜索api,即选择XHR进行过滤,发现有两个已经发送的api请求。(api请求一般都在XHR中,其他网页请求在Doc)

《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 通过XHR获取过滤出api

我们查看这两个api返回的数据发现,第一个api返回的是用户数据,第二个api返回的是微博内容数据。而它们的唯一参数就是containerid的值,我们通过采集多个情况进行分析得出,它们获取用户内容的containerid为100505+oid,获取微博内容的containerid为107603+oid。

https://m.weibo.cn/api/container/getIndex?containerid=1005052803301701
https://m.weibo.cn/api/container/getIndex?containerid=1076032803301701

《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 分析返回的api

我们在右边选择Preview预览一下json,点击cards中任选一个card,其中的mblog标签下就有我们要的微博内容数据。
我们继续观察发现这个json中只有11条数据,那么我们往下滑动到下一页,继续查看请求的api。

《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 下一页

我们发现在获取下一页数据时的api加了一个值为2的参数page。继续往下翻页,page变成3、4、5…,由此我们推断这个api获取哪一页的数据由page决定。

四、分析返回的json格式的微博内容

通过api我们获取到返回的微博内容数据,我们以其中一个card来分析获取到的数据,微博内容数据在mblog中。

《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 返回的json格式数据

通过和微博网页上的内容对比,我们推断出text为微博标题内容,created_at为微博发布时间,id为该微博的详情地址中的唯一标示字段(后面会说),如果该微博为视频时,视频的内容在page_info里面,page_info中的page_pic下的url为视频封面图地址。

我们点击进入该条json数据对应的微博
https://m.weibo.cn/status/4177004524361519

《爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战》 某条微博详情页

通过多条微博的数据进行验证,我们发现微博详情页的地址为m.weibo.cn/status/+id,这个id页就是返回的json数据中的
"id" : "4177004524361519"

五、获取微博内容的代码实现

我们分析完接口之后就可以开始编写爬虫代码。此处附上完整代码。

# -*- coding: utf-8 -*-

import scrapy
from scrapy.http import Request
import json


# 微博内容
class WeiBoWBSpider(scrapy.Spider):

    name = 'weibo_wb_spider'
    allowed_domains = ['weibo.com']


    def __init__(self, task_id=None, object_urls=None, *args, **kwargs):
        super(WeiBoWBSpider, self).__init__(*args, **kwargs)
        self.start_urls = ['https://m.weibo.cn/p/1005052803301701',
                           'https://m.weibo.cn/u/2189067512']

    def start_requests(self):
        for start_url in self.start_urls:
            containerid = ''
            url_head = 'https://m.weibo.cn/api/container/getIndex?containerid='
            if 'https://m.weibo.cn/p/' in start_url:
                containerid = start_url.replace('https://m.weibo.cn/p/','').replace('100505','107603')
            elif 'https://m.weibo.cn/u/' in start_url:
                containerid = '107603' + start_url.replace('https://m.weibo.cn/u/', '')
            if containerid:
                origin_url = '%s%s'%(url_head,containerid)
                yield Request(origin_url,callback=self.parse)


    def parse(self, response):
        content = json.loads(response.body)
        weibo_info = content.get('cards',[])
        for info in weibo_info:
            if info.get('mblog') and info.get('mblog').get('text'):
                title = (info['mblog']['text']).encode('utf8')
                url = "https://m.weibo.cn/status/%s" % info["mblog"]["mid"]
                time_str = info.get('mblog').get('created_at').encode('utf8')
                picture_urls = ''
                if info.get('mblog').get('page_info'):
                    if info.get('mblog').get('page_info').get('media_info'):
                        picture_urls = info.get('mblog').get('page_info').get('page_pic')['url']
                if not picture_urls:
                    if info.get('mblog').get('pics'):
                        pics = map(lambda x:x.get('url'),info["mblog"]["pics"])
                        picture_urls = ','.join(pics)

                print '======微博内容======'
                print title
                print url
                print time_str
                print picture_urls

运行结果为:

======微博内容======
【<a class='k' href='https://m.weibo.cn/k/%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%98%8E%E5%A4%A9?from=feed'>#你好,明天#</a>】每年8月19日将成“中国医师节”。因为生命可贵,所以医生可爱,尊医,根本上是尊重生命,这是专设节日道声辛苦的逻辑所在。从设立教师节到创设医师节,当“育人者,人恒敬之;救人者,人恒敬之”成为社会共识,发展就有了良性基石。你爱我一尺,我敬你一丈,这便是最好的医患关系。 ​​​
https://m.weibo.cn/status/4177028770994033
17分钟前
https://wx2.sinaimg.cn/orj360/a716fd45ly1flra8mn4rwj20wb0kdb29.jpg
======微博内容======
【夜读:今天没有比昨天糟,就很好呀】生活只要还在继续,就没有所谓大团圆,它既不会让公主做一生美梦,也不会成全所有灰姑娘。我们不再和生活较劲,而是学着和周遭互相成全。不求一夜之间大富大贵,不求一朝一夕美梦就实现,只期待明天比今天更好一点点。 <a data-url="http://t.cn/RYZzvve" href="http://media.weibo.cn/article?object_id=1022%3A2309404177020421566854&url_type=39&object_type=article&pos=1&luicode=10000011&lfid=1076032803301701&id=2309404177020421566854&ep=FwjEugcmK%2C2803301701%2CFwjEugcmK%2C2803301701" data-hide=""><span class="url-icon"><img src="https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_article_default.png"></span></i><span class="surl-text">【夜读】今天没有比昨天糟,就很好呀</a> ​​​
https://m.weibo.cn/status/4177020423860786
50分钟前

======微博内容======
【人民微评:法治时代,须让潜规则走开】讨厌应聘者问五险一金和加班费,如此“坦荡”,让人愕然。本是合法权利,为何不能主张?玩噱头、贫贫嘴,无伤大雅,若真这么想、更这么做,则涉嫌违法。无视员工权益的企业能走多远?而在资强劳弱的现实语境中,法律是员工的最好武器。
https://m.weibo.cn/status/4177012673297550
1小时前

======微博内容======
【国旗护卫队训练视频曝光,这才是中国的男神天团<span class="url-icon"><img src="//h5.sinaimg.cn/m/emoticon/icon/others/h_good-55854d01bb.png" style="width:1em;height:1em;" alt="[good]"></span>】近日,天安门国旗护卫队36名武警官兵在进行“百步筑梦”挑战时的精彩表现刷爆朋友圈。这样的纪录背后凝聚了部队官兵艰辛的训练,他们靠着三百六十五天,冬不穿棉,夏不穿单的精神,始终坚守在祖国心脏、“红墙”之畔。<a data-url="http://t.cn/RYhobG2" href="http://miaopai.com/show/aEI6nMSViUwTkwfmxG1d8eOl5NBZKAaX3J3pbg__.htm?containerid=23044236374fce0aa4d816085086a81e8f0812&showurl=http%3A%2F%2Fmiaopai.com%2Fshow%2FaEI6nMSViUwTkwfmxG1d8eOl5NBZKAaX3J3pbg__.htm&url_open_direct=1&toolbar_hidden=1&url_type=39&object_type=video&pos=1&luicode=10000011&lfid=1076032803301701&ep=FwjeQiiD5%2C2803301701%2CFwjeQiiD5%2C2803301701" data-hide=""><span class="url-icon"><img src="https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_video_default.png"></span></i><span class="surl-text">小央视频的秒拍视频</a> ​​​
https://m.weibo.cn/status/4177004524361519
1小时前
http://bsyimg3.cdn.krcom.cn/stream/aEI6nMSViUwTkwfmxG1d8eOl5NBZKAaX3J3pbg___32768.jpg
======微博内容======
【苹果,你吃对了吗?】“一日一苹果,疾病远离我。”苹果一直被称为“全方位的健康水果”,是名副其实的“水果之王”。吃苹果有哪些好处?应该怎样挑苹果?不同品种的苹果如何区别?每天该吃多少苹果?什么时间吃最好?吃苹果该不该削皮?...关于苹果,这些你应该知道↓转给爱吃苹果的TA!<a href='https://m.weibo.cn/n/生命时报'>@生命时报</a> ​​​
https://m.weibo.cn/status/4176996177285720
2小时前
https://wx2.sinaimg.cn/orj360/a716fd45ly1flr6ht4fb8j20hs1bpaio.jpg,https://wx2.sinaimg.cn/orj360/a716fd45ly1flr6hthffyj20hs1jhgub.jpg,https://wx3.sinaimg.cn/orj360/a716fd45ly1flr6htxrt4j20hs12nn19.jpg,https://wx4.sinaimg.cn/orj360/a716fd45ly1flr6hu56oij20hs18243u.jpg,https://wx1.sinaimg.cn/orj360/a716fd45ly1flr6huc0bgj20hs0wy0xt.jpg,https://wx1.sinaimg.cn/orj360/a716fd45ly1flr6hukk1nj20hs122n1h.jpg,https://wx2.sinaimg.cn/orj360/a716fd45ly1flr6hut1zsj20hs12dgrs.jpg,https://wx1.sinaimg.cn/orj360/a716fd45ly1flr6hv32vzj20hs13gage.jpg,https://wx4.sinaimg.cn/orj360/a716fd45ly1flr6hvf634j20hs1lv105.jpg
======微博内容======
【厉害了!毕业生众筹200万元,地下车库变身24小时书店<span class="url-icon"><img src="//h5.sinaimg.cn/m/emoticon/icon/default/d_bingbujiandan-3344440c43.png" style="width:1em;height:1em;" alt="[并不简单]"></span>】山西太原,几名山西大学的毕业生通过在校园内众筹的200万元人民币,将一座地下车库改建成书店,极具文艺气息, 24小时不打烊,良好的阅读环境吸引了不少爱读书的年轻人。网友:我愿意24小时在里面看书! ​​​​(中国新闻网) ​​​
https://m.weibo.cn/status/4176987838803470
2小时前
https://wx1.sinaimg.cn/orj360/a716fd45ly1flr5j9yuffj20j60csdj0.jpg,https://wx2.sinaimg.cn/orj360/a716fd45ly1flr5jaa954j20j60srth7.jpg,https://wx4.sinaimg.cn/orj360/a716fd45ly1flr5jb7gcjj20j60cs0xc.jpg,https://wx2.sinaimg.cn/orj360/a716fd45ly1flr5jbeuk1j20j60csn1l.jpg,https://wx3.sinaimg.cn/orj360/a716fd45ly1flr5jch4p0j20j60cb0x9.jpg,https://wx1.sinaimg.cn/orj360/a716fd45ly1flr5jd328hj20j60csn1o.jpg,https://wx1.sinaimg.cn/orj360/a716fd45ly1flr5jd94ljj20j60csgqg.jpg,https://wx3.sinaimg.cn/orj360/a716fd45ly1flr5jdm48lj20j60cs429.jpg,https://wx1.sinaimg.cn/orj360/a716fd45ly1flr5je0lawj20j60cs43k.jpg
======微博内容======
【法庭保安4年过司法考试:站岗空隙学习】江苏50岁的赵传朱在法庭当了7年保安。为了圆自己的律师梦,高中没毕业的他利用站岗空闲啃书本。“就像天书一样,从零学起。”法律专业的书他看了300多本,真题做了不下一万道,今年他终于通过司法考试。他的梦想是成为一名公益律师。<a data-url="http://t.cn/RYzKAff" href="http://miaopai.com/show/9bqnM9S4E2rpzs--RrXgvE2T7jvPk~4RIniV3Q__.htm?containerid=2304426ff216ec9172da4ad49edff4580721fd&showurl=http%3A%2F%2Fmiaopai.com%2Fshow%2F9bqnM9S4E2rpzs--RrXgvE2T7jvPk%7E4RIniV3Q__.htm&url_open_direct=1&toolbar_hidden=1&url_type=39&object_type=video&pos=1&luicode=10000011&lfid=1076032803301701&ep=FwiAgoWy7%2C2803301701%2CFwiAgoWy7%2C2803301701" data-hide=""><span class="url-icon"><img src="https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_video_default.png"></span></i><span class="surl-text">蟹视频的秒拍视频</a> ​​​
https://m.weibo.cn/status/4176979365944939
3小时前
http://bsyimg3.cdn.krcom.cn/stream/9bqnM9S4E2rpzs--RrXgvE2T7jvPk~4RIniV3Q___32768.jpg
======微博内容======
【四川天全县通报“感恩费”调查:学校两次授意家委会强捐145万】四川雅安天全县第二初级中学今年两次利用家委会向家长劝捐“感恩费”。21日,天全县新闻办公室通报称:经调查,学校授意家委会两次共计收款145.95万元,现决定退还;教育局副局长被警告处分,该校校长被免职。<a data-url="http://t.cn/RYhSBvi" href="http://miaopai.com/show/0YZSSsXBletqFJV5piQOq9zcbRHICx18AH7EBQ__.htm?containerid=2304423213e06e470fdedcdea06805173023b6&showurl=http%3A%2F%2Fmiaopai.com%2Fshow%2F0YZSSsXBletqFJV5piQOq9zcbRHICx18AH7EBQ__.htm&url_open_direct=1&toolbar_hidden=1&url_type=39&object_type=video&pos=1&luicode=10000011&lfid=1076032803301701&ep=Fwin8EYNY%2C2803301701%2CFwin8EYNY%2C2803301701" data-hide=""><span class="url-icon"><img src="https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_video_default.png"></span></i><span class="surl-text">澎湃新闻的秒拍视频</a> ​​​
https://m.weibo.cn/status/4176971229766858
4小时前
http://bsyimg3.cdn.krcom.cn/stream/0YZSSsXBletqFJV5piQOq9zcbRHICx18AH7EBQ___32768.jpg
======微博内容======
【反感求职者提问&quot;五险一金&quot;,你怎么看?】近日,考研教师张雪峰参加某节目曝光职场“潜规则”的视频引发网友热议。“进入职场的目标是未来以拿退休金去生活的人。”“你得为我们公司付出,再说加班费的事。”随后补充道,不谈不意味着没有,你要相信只要你努力,老板都看得见!<a data-url="http://t.cn/RYvrgF5" href="https://m.weibo.cn/p/index?containerid=2310844ac9da8e68ff9785557e20b768eae5e2&url_type=39&object_type=video&pos=1&luicode=10000011&lfid=1076032803301701&ep=Fwibs6Hkw%2C2803301701%2CFwibs6Hkw%2C2803301701" data-hide=""><span class="url-icon"><img src="https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_video_default.png"></span></i><span class="surl-text">求职不该问有没有五险一金?张雪峰言论引争议</a> ​​​
https://m.weibo.cn/status/4176963981596532
4小时前
http://p.ivideo.sina.com.cn/video/252/080/873/252080873_432_243.jpg
======微博内容======
【手脚冰凉,试试这几招!】①揉搓手心:一手握拳,揉搓另一只手的手心部,直到感到手心微热,再换另一只手,交替进行;②按摩穴位:两手交替按揉位于手腕背横纹中心处的阳池穴;③热水泡脚:每晚泡脚20分钟,水温42℃左右最佳;④足部按摩:按摩脚掌的涌泉穴,或用双脚掌对搓…更多↓
https://m.weibo.cn/status/4176956101186715
5小时前

2017-11-22 23:49:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://m.weibo.cn/api/container/getIndex?containerid=1076032189067512> (referer: None)
======微博内容======
向大家报告一个最新消息,受到“十点课堂”的不断邀请,和刘轩的再三推荐,我终于开了音频课程。《刘墉说:处世的智慧》正式上线了,这是一套40集的音频课程,也是我第一次线上的作品,希望借助互联网的力量,把我在处世、成长、励志、文学、艺术、亲子等各方面的心得,做个全盘的整理和发表,有辛辣、 ​​​...<a href="/status/4169238945824859">全文</a>
https://m.weibo.cn/status/4169238945824859
11-01

======微博内容======
<span class="url-icon"><img src="//h5.sinaimg.cn/m/emoticon/icon/others/d_doge-d903433c82.png" style="width:1em;height:1em;" alt="[doge]"></span> ​​​
https://m.weibo.cn/status/4164651681660841
10-19
https://wx1.sinaimg.cn/orj360/827a84f8gy1fknsr07jntj20gg0f8ta2.jpg
======微博内容======
我写了新文章《如何设计一款类“即刻”信息订阅推送的爬虫架构》( 分享自 <a href='https://m.weibo.cn/n/简书'>@简书</a> ) <a data-url="http://t.cn/ROGziUH" href="http://media.weibo.cn/article?object_id=1022%3A2309614160666389868942&url_type=39&object_type=article&pos=1&luicode=10000011&lfid=1076032189067512&id=2309614160666389868942&ep=Fps7vh8gE%2C2189067512%2CFps7vh8gE%2C2189067512" data-hide=""><span class="url-icon"><img src="https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_article_default.png"></span></i><span class="surl-text">如何设计一款类“即刻”信息订阅推送的爬虫架构</a> ​​​
https://m.weibo.cn/status/4160662974083360
10-08

======微博内容======
好内容 ​​​
https://m.weibo.cn/status/4157743633519601
09-30
https://wx2.sinaimg.cn/orj360/827a84f8gy1fk1rdeawx7j20zk0m8tbn.jpg
======微博内容======
包含测试的内容 ​​​
https://m.weibo.cn/status/4157743407500018
09-30
https://wx1.sinaimg.cn/orj360/827a84f8gy1fk1rcg5omaj20sg0segz5.jpg
======微博内容======
真正的平静不是你静坐可以几个小时不起,而是用一颗平和的心态看人间万象,听花开的声音。平静来自内心,勿向外求。花开有声,风过无痕。坐亦禅,行亦禅,缘起即灭,缘生已空。不要刻意的去追逐,一切遵循自然的规律,开心轻松,过好一生。 ​---《一切都是最好的安排》加措活佛 ​​​
https://m.weibo.cn/status/4157742958367316
09-30
https://wx3.sinaimg.cn/orj360/827a84f8gy1fk1raka5nvj20zk0m8tbn.jpg
======微博内容======
<a class='k' href='https://m.weibo.cn/k/%E5%A5%BD%E5%90%83?from=feed'>#好吃#</a>分享一些好吃的图片给你们 ​​​
https://m.weibo.cn/status/4157319832623207
09-29
https://wx1.sinaimg.cn/orj360/827a84f8gy1fk0ep683woj20go0cgabt.jpg,https://wx2.sinaimg.cn/orj360/827a84f8gy1fk0ep5h1b4j20ge0cbq3w.jpg,https://wx1.sinaimg.cn/orj360/827a84f8gy1fk0ep62i5hj20xc0mwwij.jpg
======微博内容======
#测试,我是一条测试微博001 海贼王 ​​​​,有图片 ​​​
https://m.weibo.cn/status/4157261687273709
09-29
https://wx4.sinaimg.cn/orj360/827a84f8gy1fk080ont55j20gg0f8ta2.jpg
======微博内容======
#测试,我是一条测试微博001 海贼王 ​​​
https://m.weibo.cn/status/4157260067780394
09-29

======微博内容======
#测试,我是一条测试微博001 ​​​
https://m.weibo.cn/status/4157260026634901
09-29
点赞