这个是介绍如何爬取微博的博客。
参考资料
微博分类
其中,PC
站是信息最多,也是反爬机制最强的一个。
?
站,最简陋,反爬也较为宽松,已经有大佬写好相关的项目。
它的效果也是非常惊人。
- 用户信息抓取
- 用户微博抓取(全量/指定时间段)
- 用户社交关系抓取(粉丝/关注)
- 微博评论抓取
- 基于关键词和时间段(粒度到小时)的微博抓取
- 微博转发抓取
但是唯一不好的是,需要购买小号建立 cookie
池之后才可以进行数据采集。
那么,有没有无需 cookie
也能爬取的站呢,就是微博的 M 站
。
网上也有人写好了相关的项目。
但是,他的这个项目太笨重了,其实用简单的 requests
请求就可以了。
下面说一下它的原理吧。
原理
以
为例「选择这个是因为其他博文的例子是她,图省事,直接拿来用了」。
按 F12
会发现有一个接口是这样的
https://m.weibo.cn/api/container/getIndex?type=uid&value=3669102477&containerid=1076033669102477
其中 3669102477
是该用户的 UID
后面的 containerid
是 107603 + 3669102477
。
ps:107603
可能会变,这个不能爬取数据的时候,要看一下这个。
而这个接口会返回 10
条左右的该用户最新的微博,以 json
为返回数据。
所以,我们只要构建一个 uids list
然后循环爬取就行。
部分代码
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| r = requests.get( f"https://m.weibo.cn/api/container/getIndex?type=uid&value={uid}&containerid=107603{uid}") logger.info( "开始爬取:" + f"https://m.weibo.cn/api/container/getIndex?type=uid&value={uid}&containerid=107603{uid}") if r.status_code == 200: weiboitems = defaultdict(list) items = json.loads(r.text).get("data").get("cards") for item in items[::-1]: url = item.get("scheme", '') item_data = item.get("mblog", None) if item_data is not None: createtime = weibotime2common(item_data.get("created_at")) weiboitems[uid].append({ "_id": item_data.get("id"), "uid": item_data.get("user", {}).get("id", 0), "name": item_data.get("user", {}).get("screen_name"), "url": url, "content": item_data.get("text", ""), "images": item_data.get("pic_ids", []), "createtime": createtime, "sqltime": time.time() }) else: continue logger.info("网络数据解析完成 " + str(uid)) time.sleep(5)
|
其他