0%

爬虫 | 微博爬取

这个是介绍如何爬取微博的博客。


参考资料



微博分类


其中,PC 站是信息最多,也是反爬机制最强的一个。

? 站,最简陋,反爬也较为宽松,已经有大佬写好相关的项目。

它的效果也是非常惊人。

  • 用户信息抓取
  • 用户微博抓取(全量/指定时间段)
  • 用户社交关系抓取(粉丝/关注)
  • 微博评论抓取
  • 基于关键词和时间段(粒度到小时)的微博抓取
  • 微博转发抓取

但是唯一不好的是,需要购买小号建立 cookie 池之后才可以进行数据采集。

那么,有没有无需 cookie 也能爬取的站呢,就是微博的 M 站

网上也有人写好了相关的项目。

但是,他的这个项目太笨重了,其实用简单的 requests 请求就可以了。

下面说一下它的原理吧。


原理


为例「选择这个是因为其他博文的例子是她,图省事,直接拿来用了」。

F12 会发现有一个接口是这样的

https://m.weibo.cn/api/container/getIndex?type=uid&value=3669102477&containerid=1076033669102477

其中 3669102477 是该用户的 UID 后面的 containerid107603 + 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)

其他


请我喝杯咖啡吧~