编写油猴插件来爬取女神微博列表
微博H5模式下,可以无限刷微博列表,在这个模式下,编写脚本,把所有的博客列表抓取下来,传送到我们自己的服务器。
以杨幂微博为例。
image.png
我们在H5模式下的console里直接编写我们脚本,这里的网络请求,可以规避相关网站的防爬措施。
image.png
代码
var uid = "1195242865";
function get(link) {
return fetch(link).then((res) => res.json());
}
async function getList({ page = 5, id, s_id = "", arr = [] }) {
if (page <= 0) return arr;
page -= 1;
const list = await get(
`https://m.weibo.cn/api/container/getIndex?jumpfrom=weibocom&type=uid&value=${uid}&containerid=${id}&since_id=${s_id}`
);
const { containerid, since_id } = list.data.cardlistInfo;
const ret = list.data.cards
.filter((item) => item.card_type === 9)
.map((item) => ({
text: item.mblog.raw_text,
pics: (item.mblog.pics || []).map((pic) => pic.url),
}));
return getList({
page,
id: containerid,
s_id: since_id,
arr: [...arr, ...ret],
});
}
(async () => {
try {
const config = await get(
`https://m.weibo.cn/api/container/getIndex?jumpfrom=weibocom&type=uid&value=${uid}`
);
const id = config.data.tabsInfo.tabs[1].containerid;
const ret = await getList({ id });
console.log(ret);
} catch (e) {
console.log(e);
}
})();
代码如上,可以直接拷贝到console里,你将在日志里看到50条杨幂的微博列表和图片。你也可以把这个列表上传给你的接口,存储起来。
介绍下上述脚本的几个参数:
page:爬取的总页数,默认是爬取5页,你可以自己更改。
uid:微博给每个用户分配的ID,如果你想爬取其他用户,可以找到该用的uid,进行替换。
爬取到的数据
image.png
游猴插件
根据上面的效果,我们可以编写一个油猴插件,当用户某个用户的微博H5网页时,可以直接输出这个用户所有的微博列表,不需要用户一个个点击下拉复制。
下面复制下我的油猴脚本,感兴趣的可以试用下。
// ==UserScript==
// @name weibo_list
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 获取微博列表
// @author hanhuizhu
// @match https://m.weibo.cn/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
var uid = location.href.match(/\d+/)[0];
function get(link) {
return fetch(link).then((res) => res.json());
}
async function getList({ page = 5, id, s_id = "", arr = [] }) {
if (page <= 0) return arr;
page -= 1;
const list = await get(
`https://m.weibo.cn/api/container/getIndex?jumpfrom=weibocom&type=uid&value=${uid}&containerid=${id}&since_id=${s_id}`
);
const { containerid, since_id } = list.data.cardlistInfo;
const ret = list.data.cards
.filter((item) => item.card_type === 9)
.map((item) => ({
text: item.mblog.raw_text,
pics: (item.mblog.pics || []).map((pic) => pic.url),
}));
return getList({
page,
id: containerid,
s_id: since_id,
arr: [...arr, ...ret],
});
}
(async () => {
try {
const config = await get(
`https://m.weibo.cn/api/container/getIndex?jumpfrom=weibocom&type=uid&value=${uid}`
);
const id = config.data.tabsInfo.tabs[1].containerid;
const ret = await getList({ id });
console.log(ret);
} catch (e) {
console.log(e);
}
})();
})();
安利下油猴
https://greasyfork.org/zh-CN
发表评论 (审核通过后显示评论):