V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SleepyRaven
V2EX  ›  分享发现

分享一个 node.js 纯 http 请求的 twitter 爬虫思路

  •  1
     
  •   SleepyRaven · 2021-08-20 10:20:12 +08:00 · 3343 次点击
    这是一个创建于 973 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文仅阐述心路历程及简要思路,以供学习 node.js 及网络安全相关知识,请勿过度解读或用于非法用途。

    动机

    在 twitter 关注了很多小姐姐,但是每隔一段时间就会有“退网”的,推文直接清空或禁止查看。
    这个时候的我就会很懊悔没有提前保存好所有影像资料。

    检索

    然后就去网上找各种现成的工具,发现大部分都是基于 python 的,或者模拟滚屏解析 html 的;
    继续检索发现 twitter 提供了开发者 API,但是要申请,并且现在申请成功率很低。

    探究

    于是观察了一下 twitter 媒体页面的加载方式,发现以下几点:

    • xhr 中显然存在着关于推文的直接 http 请求,且有推文数量参数
    • 滚屏瀑布加载的起点为当前最后一条推文数据中的标记字段
    • 请求到的推文数据直接包含了图片和视频的 uri 地址,其中图片尺寸可通过修改 query 参数控制
    • twitter 关于 cookie 的校验非常松
    • twitter 对资源的并发数量有限制
      开整吧那就

    思路

    环境及工具:node.js, node-fetch, request, http-proxy, fs
    流程:键入某 twitter 用户名 -> 先请求到 media 数量 -> 将数量修改至 media 请求的参数中 -> 发起 media 请求 -> 解析返回 json 中的 资源 uri -> 下载资源到本地

    优势

    • 只需要一个 node.js ,不用登录 /py 环境 /headless 浏览器
    • 代码简单,业务逻辑只需两三百行 js
    • 性能优秀,两次毫秒级请求取到所有 uri,具体资源下载速度由带宽决定

    结果

    • npm run download xxx 将 xxx 用户的所有最大尺寸图片和视频资源到本地
    • npm run update 更新./Medias 目录下所有已存在用户的推文资源
    第 1 条附言  ·  282 天前
    时隔数百日,突然有人收藏帖子,简单更新下信息,一龙马接手 twitter 之后改了不少东西。
    其中最主要的是:
    1. 开发者 api 中请求推文的接口等要付费了,不过这个不关心,继续用 web api ;
    2. web api v2 接口入参和回调调整,推文列表接口的 count 参数有了实际最大限制,不能一次性返回所有了,但是每次返回中都会携带 cursor 项,将对应的 value 附加到除了首次请求外的后续请求的 query 就行,直到返回中只剩下两个 cursor 表示到底了;
    3. 用户信息和推文列表接口有了更高的频率限制,但是经测试,CD 时间不长,可以在返回 limit 后等待 5 分钟继续任务,且暂时未发现 block 风险,一个 bearer token 用了几年了(🐶)。

    另外感慨下,从几百天前开始收集关注的资源,到今天已经有几十个女菩萨销号了,每次看到不禁对着爬好的遗产唏嘘不已...在想要不要把文本类的推文也存起来,搞个推特版的赛博骨灰盒...
    25 条回复    2023-05-11 14:33:04 +08:00
    Pythoner666666
        1
    Pythoner666666  
       2021-08-20 10:47:23 +08:00
    show em your code
    rodrick
        2
    rodrick  
       2021-08-20 11:12:48 +08:00
    这就是 lsp 推动技术进步?
    yunying
        3
    yunying  
       2021-08-20 11:18:03 +08:00
    求姐姐推荐
    mrweiwei
        4
    mrweiwei  
       2021-08-20 11:25:10 +08:00
    我是申请了开发者账号用官方的 api 去爬,跑了大半年了,现在图片资源已经有 20w+了😄
    lzgshsj
        5
    lzgshsj  
       2021-08-20 11:25:11 +08:00
    有点意思。庆幸前两年宽松的时候申请了开发者 API,当时貌似写了个 100 词小作文就过了。
    主要是拿来鼓捣自建的 rsshub 去了。
    监测几个推特账号的话,用户名是挺好。不过我看的账号挺多,就把要监测的账户全拉到一个列表里,监测列表就完事了。
    lc1450
        6
    lc1450  
       2021-08-20 11:30:45 +08:00   ❤️ 2
    白嫖党: 你最好把代码给我一下,顺便给几个推特账号。希望你不要不识抬举🐶
    Puteulanus
        7
    Puteulanus  
       2021-08-20 12:16:02 +08:00
    以前做过 tumblr 的,有个思路,很多小姐姐可能会互相转发,然后企鹅的万象优图有个 API 是鉴黄的,可以顺着一个小姐姐去找其他小姐姐
    zuosiruan
        8
    zuosiruan  
       2021-08-20 12:19:39 +08:00
    @lc1450 哈哈+10086
    Building
        9
    Building  
       2021-08-20 12:30:48 +08:00 via iPhone
    Twitter: 从露脸到网黄…
    tediorelee
        10
    tediorelee  
       2021-08-20 14:17:01 +08:00
    啊啊啊你把你的代码给我交了(
    collen
        11
    collen  
       2021-08-20 14:38:26 +08:00
    好的懂了 之前没想到煎黄这个 api 已经下单硬盘了
    wwwtarzan
        12
    wwwtarzan  
       2021-08-20 14:49:44 +08:00
    把关注列表给我交了
    zingwu
        13
    zingwu  
       2021-08-20 14:50:12 +08:00   ❤️ 1
    白嫖党: 你最好把代码给我一下,顺便给几个推特账号。希望你不要不识抬举🐶
    itning
        14
    itning  
       2021-08-20 14:51:03 +08:00
    不开源?
    nameuser
        15
    nameuser  
       2021-08-20 15:58:19 +08:00
    只要是老账号 ,推特开发者账号申请还是比较容易过。

    爬推特还可以试试 go-rod
    kdwnil
        16
    kdwnil  
       2021-08-20 16:02:14 +08:00
    不知如何解决 api 的硬性推文数量限制?希望能看看思路学习学习
    Maxbee
        17
    Maxbee  
       2021-08-20 17:51:48 +08:00
    😦
    acmore
        18
    acmore  
       2021-08-20 18:01:50 +08:00
    hxd 给个车牌
    ybnsjl
        19
    ybnsjl  
       2021-08-23 16:48:38 +08:00
    @kdwnil [twint]( https://github.com/twintproject/twint)这个库可以不受 api 数量限制,虽然它也是通过 api 抓取的。但是它的 Bearer 比较特殊。我是复制过来直接改的,目前运行比较稳定
    xgfan
        20
    xgfan  
       2021-08-23 20:01:56 +08:00
    官方 API 都说很难,但是前两天申请秒过啊。
    100 字的作文我干脆就摊牌了:我要保存朋( xiao )友( jiejie )的推文,使用频率很低,你要是不批准,那我就直接抓网页了。
    kdwnil
        21
    kdwnil  
       2021-08-23 23:16:24 +08:00
    @ybnsjl 这个 Bearer 是固定的,而且已经用了很多年了,至于那个 twint,用的是旧的搜索接口,同一个 guest-token 剩余次数是在返回头的 header 体现( x-rate-limit-remaining,timeline 是 180 请求 /15 分钟),刷新 guest-token 会重置,但长期超限会随缘丢 429 。
    目前 timeline 的 api 限制只能获取最新的 800-900 条推文,再往下就空白了,老外们研究出用高级搜索绕,我就好奇楼主用了什么思路来突破这个限制,想学习个思路,结果这贴发出来也没更新,GitHub 的库只有个 readme,就很尴尬了
    Te11UA
        22
    Te11UA  
       2021-12-17 15:13:27 +08:00
    没看明白,那 python + reqeusts 不一样可以做吗?也是仅需一个 Python 环境
    huai
        23
    huai  
       344 天前
    @xgfan 请问现在还在用吗?我昨天刚申请了,照着教程做。不过一直提示没有权限,不知道是什么情况
    SleepyRaven
        24
    SleepyRaven  
    OP
       344 天前
    @huai 你说的是开发者 API 吧,那个现在 basic 版已经不给查推文 list 了,要订阅才行
    我这个帖子说的是 web 页面的 api ,有 v1 和 v2 的,用了好久了,但是几个月前限制了单次请求推文最大数量为 100 个了
    huai
        25
    huai  
       344 天前
    @SleepyRaven #24 嗯 对,开发者 API

    你说的 web api 是指自己看网页请求,然后判断吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2539 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:13 · PVG 09:13 · LAX 18:13 · JFK 21:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.