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

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

  •  1
     
  •   SleepyRaven · 99 天前 · 1607 次点击
    这是一个创建于 99 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文仅阐述心路历程及简要思路,以供学习 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 目录下所有已存在用户的推文资源
    21 条回复    2021-08-23 23:16:24 +08:00
    Pythoner666666
        1
    Pythoner666666   99 天前
    show em your code
    rodrick
        2
    rodrick   99 天前
    这就是 lsp 推动技术进步?
    yunying
        3
    yunying   99 天前
    求姐姐推荐
    mrweiwei
        4
    mrweiwei   99 天前
    我是申请了开发者账号用官方的 api 去爬,跑了大半年了,现在图片资源已经有 20w+了😄
    lzgshsj
        5
    lzgshsj   99 天前
    有点意思。庆幸前两年宽松的时候申请了开发者 API,当时貌似写了个 100 词小作文就过了。
    主要是拿来鼓捣自建的 rsshub 去了。
    监测几个推特账号的话,用户名是挺好。不过我看的账号挺多,就把要监测的账户全拉到一个列表里,监测列表就完事了。
    lc1450
        6
    lc1450   99 天前   ❤️ 2
    白嫖党: 你最好把代码给我一下,顺便给几个推特账号。希望你不要不识抬举🐶
    Puteulanus
        7
    Puteulanus   99 天前
    以前做过 tumblr 的,有个思路,很多小姐姐可能会互相转发,然后企鹅的万象优图有个 API 是鉴黄的,可以顺着一个小姐姐去找其他小姐姐
    zuosiruan
        8
    zuosiruan   99 天前
    @lc1450 哈哈+10086
    Building
        9
    Building   99 天前 via iPhone
    Twitter: 从露脸到网黄…
    tediorelee
        10
    tediorelee   99 天前
    啊啊啊你把你的代码给我交了(
    collen
        11
    collen   99 天前
    好的懂了 之前没想到煎黄这个 api 已经下单硬盘了
    wwwtarzan
        12
    wwwtarzan   99 天前
    把关注列表给我交了
    zingwu
        13
    zingwu   99 天前   ❤️ 1
    白嫖党: 你最好把代码给我一下,顺便给几个推特账号。希望你不要不识抬举🐶
    itning
        14
    itning   99 天前
    不开源?
    nameuser
        15
    nameuser   99 天前
    只要是老账号 ,推特开发者账号申请还是比较容易过。

    爬推特还可以试试 go-rod
    kdwnil
        16
    kdwnil   99 天前
    不知如何解决 api 的硬性推文数量限制?希望能看看思路学习学习
    Maxbee
        17
    Maxbee   98 天前
    😦
    acmore
        18
    acmore   98 天前
    hxd 给个车牌
    ybnsjl
        19
    ybnsjl   96 天前
    @kdwnil [twint]( https://github.com/twintproject/twint)这个库可以不受 api 数量限制,虽然它也是通过 api 抓取的。但是它的 Bearer 比较特殊。我是复制过来直接改的,目前运行比较稳定
    xgfan
        20
    xgfan   95 天前
    官方 API 都说很难,但是前两天申请秒过啊。
    100 字的作文我干脆就摊牌了:我要保存朋( xiao )友( jiejie )的推文,使用频率很低,你要是不批准,那我就直接抓网页了。
    kdwnil
        21
    kdwnil   95 天前
    @ybnsjl 这个 Bearer 是固定的,而且已经用了很多年了,至于那个 twint,用的是旧的搜索接口,同一个 guest-token 剩余次数是在返回头的 header 体现( x-rate-limit-remaining,timeline 是 180 请求 /15 分钟),刷新 guest-token 会重置,但长期超限会随缘丢 429 。
    目前 timeline 的 api 限制只能获取最新的 800-900 条推文,再往下就空白了,老外们研究出用高级搜索绕,我就好奇楼主用了什么思路来突破这个限制,想学习个思路,结果这贴发出来也没更新,GitHub 的库只有个 readme,就很尴尬了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2433 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 08:53 · PVG 16:53 · LAX 00:53 · JFK 03:53
    ♥ Do have faith in what you're doing.