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

我是 V2EX Plus 作者,关于扩展中 vDaily (分布式爬虫)功能的情况说明

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

    凌晨的时候朋友告诉我 tg 有一些奇怪的消息,然后看到了主题 /t/939486 大概是对扩展爬取数据的一些疑问。

    针对疑问我整理一下:


    Q: 扩展的操作是否涉及灰产、黑产?

    A: 没有

    扩展的前后端代码都是开源的,同时一开始就把日志、请求分析、API 等各项内容开放,如果扩展有其他的偷鸡摸狗的行为欢迎石锤然后再投诉和删除。

    日志、API 、请求分析在 vDaily 最底部

    前端: https://github.com/sciooga/v2ex-plus

    后端: https://github.com/sciooga/v2ex-plus-backend

    目前扩展发布是 Github 配置的 CI 发布的,也欢迎解包线上代码对比是否和开源代码一致


    Q: 扩展是否能爬取 V 站之外的数据?

    A: 不能

    扩展有权限能访问的域名有三个: imgur 、v2ex 、weibo ,除此之外会触发跨域请求无法发出,可以看源码或者看浏览器内的扩展授权(部分 webkit 魔改浏览器可能会显示所有域名权限,可以解包查看对应代码)。


    Q: 是否会操作 Cookie ?

    A: 不会

    欢迎查看源码


    Q: 翻页 502 是否是扩展导致?

    A: 大概率不是

    因为没有操作 cookie ,同时也有非扩展用户遇到这种情况,早两天还也和站长沟通了这个情况 /t/937337


    Q: 是否会涉及到隐私?

    A: 不会

    扩展无论获取当前浏览还是历史主题,都只是获取主题公开信息然后提交,具体看源码,用户个人任何隐私数据都没有获取以及提交。 https://github.com/sciooga/v2ex-plus/blob/master/spider/index.js


    Q: 是否会导致活跃度快速到达黑条?

    A: 扩展会导致,但不只是 vDaily 功能

    扩展由于每几分钟会检查一次签到、未读消息,老版本还会检查关注的用户 /节点是否有新主题 /回复,这些才是导致活跃度增长的主要原因,vDaily 的工作逻辑是浏览一个主题可能(之前是 30% 目前是 0%)会附带 1-3 个请求历史帖子,这也会导致更多的活跃度增加


    Q: 为什么突然增加 vDaily 这个功能?

    A: 这也是 2.0 恢复的老功能

    vDaily 是一个很老的,大概五六年前的项目,之前的域名已经停止服务了,当时也是因为没有时间每天浏览 V 站,做了个爬虫爬取数据筛选精华方便看看错过的内容,后面由于没有维护停掉了几年,现在重写了加入了扩展侧栏做推荐。


    Q: 对用户、V 站造成什么额外的压力?

    A: 每个主题浏览都有可能附带 1-3 个额外的请求

    对于 V 站可能会产生一定量的未缓存的老主题请求,在站长的要求下已经关闭历史主题的抓取,对于用户会多消耗一些网络资源(仅加载 HTML ,图片、CSS 等不加载)


    Q: 为什么没有明确的告知?

    A: 是没有做好

    当时的通知过于简单 https://github.com/sciooga/v2ex-plus/blob/2936025bf45b7b4b64a890a2e39443140b103f9a/background.js#L28


    Q: 为什么默认开启?

    A: 我的错

    V 站用户需求还是很多的,扩展尽可能将大家的反馈都实现和改进,但是不少功能比较个性化,所以 2.0 大部分功能都有独立开关,至于是默认开启还是默认关闭,确实是由我决定的,这不好,以后的功能将默认都关闭。


    Q: 为什么要删除日志?

    A: 没有删除

    goAccess 的实时日志是由一个很脆弱的 websocket 实现的,昨天访问得多就挂掉了,这太正常了...然后今天早上我手动启动了之后就从启动时开始记录了,日志文件应该都在,有需要可以公布。


    目前扩展获取历史主题的功能也已经停掉了,项目仍然是开源的,前后端代码以及实时运行的日志、统计都是公开的,另外通过我们的 key 给我们发消息的朋友应该也明白这个功能并没有涉及到黑产灰产了吧?

    原图

    如果还有任何问题欢迎指正,开源项目得到大家的监督是很好的一件事,因为目前在外,看见消息会尽快回复。

    55 条回复    2023-05-15 19:08:49 +08:00
    iPhone11
        1
    iPhone11  
       345 天前
    貌似不是五次,很多次很快一页 不知道其他人的频率
    sciooga
        2
    sciooga  
    OP
       345 天前
    @iPhone11 #1 下面是源码,抱歉之前将 30 秒记错为 60 秒了,是你打开主题后会有最多额外 3 个请求,如果看了十秒就关闭,不会有额外请求,如果你停留超过 90 秒以上,最多可能会有 3 个额外请求
    https://github.com/sciooga/v2ex-plus/blob/master/spider/index.js#L160
    zyronon
        3
    zyronon  
       345 天前   ❤️ 3

    一直在请求。如图,7 分钟内请求了 23 次,差不多 20 秒请求一次

    默认设置,并不像你说的“A: 每个主题浏览都有可能附带 1-3 个额外的请求”
    sciooga
        4
    sciooga  
    OP
       345 天前
    @zyronon #3 因为你浏览了不止一个主题,每个主题的 tab 标签页还在的情况下会有额外的请求,但是你看的到的请求也不意味会爬取更多的数据(以前是 70% 以上返回空任务,现在是 100% 返回空任务),你看看会不会导致新的发向 V 站的请求就知道了
    chrawsl
        5
    chrawsl  
       345 天前   ❤️ 6
    V 站日常,情绪第一
    sciooga
        6
    sciooga  
    OP
       345 天前
    另外,vDaily 除了扩展内的推荐,还有机器人发送的周报比如这一期 https://www.v2ex.com/t/939837 ,如果大家反感这样的行为,我们也会停止。
    ZeroClover
        7
    ZeroClover  
       345 天前   ❤️ 1
    开源不是给自己脱罪的理由,Ant Design 也是在开源的情况下引入了「彩蛋」,结果是什么?

    我只知道你的插件:
    1. 用用户的设备和网络干了远超最初描述之外的事情
    2. 可以远程下发命令
    goophy
        8
    goophy  
       345 天前
    v2ex-plus, version 2.10, 看起来从主题浏览开始,30 秒就 fetch 一个主题,页面不刷新会一直继续。
    附上开了插件和不开插件相同页面 10 分钟的记录

    <img src=https://imgur.com/FRsJInk>

    <img src=https://imgur.com/ygXpRlm>
    jas0n2k
        9
    jas0n2k  
       345 天前 via iPhone
    开源并不是为你干坏事开脱的借口
    goophy
        11
    goophy  
       345 天前
    我倒是一直用 v2ex-plus ,都挺好,除了最近看过的主题确实困扰了一下(很多都是我不关心也不会点开的),作者继续改进吧,我相信作者初衷倒也没啥坏心思。
    kingfalse
        12
    kingfalse  
       345 天前 via Android
    有权限能访问的域名有三个: imgur 、v2ex 、weibo ,
    那不就是可以抓微博了,
    sciooga
        13
    sciooga  
    OP
       345 天前
    @goophy #8 你好 pull_once 是 V 站自己的接口每隔一段时间访问一次,并不是扩展行为
    sciooga
        14
    sciooga  
    OP
       345 天前
    @ZeroClover #7 针对你反馈的亮点,我解释一下

    1. 远超最初描述之外的事情,这个我不清楚该这么定义,功能更新有通知(没告知默认开启是我们的问题),选项页有介绍以及单独的开关,后续的功能将默认关闭,按用户喜好开启。
    2. 远程下发命令(或者说主题 id 更明确)仅限于获取某个 v 站的主题数据,并非“肉鸡”概念,也做不到除了获取一个主题数据之外的操作。
    sciooga
        15
    sciooga  
    OP
       345 天前
    @kingfalse #12 你好,需要微博域名权限唯一做的是在 header 增加 referer ,因为微博已经开启了防盗链,只有加上 referer ,v 站内历史主题发布的微博图片才能正常显示。

    https://github.com/sciooga/v2ex-plus/blob/master/manifest.json#L65
    https://github.com/sciooga/v2ex-plus/blob/master/rules.json

    扩展是否可以爬取微博?项目内没有对应的代码,爬取微博的难度也比较大,在我看来真要爬取换个途径可能更简单
    ZeroClover
        16
    ZeroClover  
       345 天前
    @sciooga 既然你自己在主楼发了功能更新通知的代码,那我问问「增加 vDaily 推荐主题及评论,数据在不断完善,如需反馈欢迎 @sciooga 」这里面那个中文字可以解读出你加了个爬虫的意思?

    肉鸡不肉鸡不是你觉得,爬虫可以托管在你自己的服务器上,你用用户的网络来爬无非就是为了绕过 V2EX 的 IP 限制,你猜猜没通知站方并且采用绕过站方安全功能的行为可不可以送你进去?
    sciooga
        17
    sciooga  
    OP
       345 天前
    @ZeroClover #7
    @jas0n2k #9

    两位提到了开源是否让我脱“罪”的问题,也包括之前主题的 OP 也说到分布式爬虫存在的问题。

    我认为最大的问题在于没有明确告知用户该功能的开启,这个功能是参考 京价保 https://github.com/sunoj/jjb 的历史价格实现的(无意引火),用户浏览商品时会提交当前商品的价格和优惠信息,V2EX Plus 扩展内参考实现了这个功能,同时为了补全历史数据增加了爬取历史数据的功能。
    goophy
        18
    goophy  
       345 天前
    @sciooga 是的,pull_once 是不开启插件的 V2EX 自己发起的 i.imgur.com/FRsJInk.png

    第二个图是开启插件发起的 imgur.com/ygXpRlm.png
    sciooga
        19
    sciooga  
    OP
       345 天前
    @ZeroClover #16 爬虫不在我服务器上,用用户网络是因为维护爬虫的登录态比较麻烦(数年前 1.0 就是这样实现的),并不是绕过 IP 限制,V 站每天更新的主题数量并不多。
    Creamliu
        20
    Creamliu  
       345 天前 via iPhone
    早干嘛去了???事情没闹大就继续干呗
    Livid
        21
    Livid  
    MOD
       345 天前   ❤️ 1
    关于翻页 502 。

    之前我们上了这样的一个功能,用 cookie 保存访问过的最后的页码。这样当你进入一个有多页的主题页面时,会直接进入到你最后访问过的页面。

    这个爬虫会让用户的这个 cookie 中增加大量用户没有访问过的页面的页码。

    至于是否是由于 cookie 尺寸过大造成的 502 ,因为我没有也不会去安装这个插件,所以我无法验证。

    这也是为什么遇到 502 问题的用户,清掉 cookie 之后就可以访问了。

    我们最近暂时把这个记住和跳转页码的功能下掉了。所以现在当你访问一个有多页的主题时,如果 URL 中没有指定 p=x 那么现在只会默认进入第一页。
    sciooga
        22
    sciooga  
    OP
       345 天前 via iPhone
    关于翻页 502 ,我补充一点,vDaily 功能上线是近期,之前我遇到时也查过 V 站以前的主题,一年以前就有反馈 /t/857753
    Xianmua
        23
    Xianmua  
       345 天前
    到现在为止,这个爬取历史主题的分布式爬虫 feature 还没有停掉,完全不像这个作者说的那样,“已经从服务器关闭下发任务了”
    我刚录了个屏,大家来看看吧。 @Livid ,也 @一下站长
    lwjef
        25
    lwjef  
       345 天前
    最最严重的问题是没有事先告知默认开启,也没有重点突出且提示该功能的作用,类比到网站,许多网站即使收集 cookie 做其他用途都会对用户提示,网站收集的用户日志如何处理也是个很复杂的问题,关键这网站也不是你的啊。

    最终收集的信息不管有没有侵犯特定用户的隐私,滑坡思考一下就和某些网站拿用户浏览记录配合 cookie 或者其他方式在第三方做广告盈利一样非常让人讨厌,这里并不是说你收集的浏览数量、点赞数量等信息做了这些事情,某些网站的行为显然更让用户讨厌,但是上述行为稍懂一些的用户是可以选择不用不打开类似网站,对于你的插件用户并没有对这些风险的预知。

    Q: 是否会操作 Cookie ?
    A: 不会
    欢迎查看源码

    前端有源码我觉得挺坦荡,后端提供源码就别提了,意义有限。
    同时通读源码为难人了,但是用户提出的细节猜测可以考虑解释下,这些问题比较容易回复。

    有用户提到了这个后端的 cookie 行为,其实和前端没关系,可以考虑下。
    https://github.com/sciooga/v2ex-plus-backend/blob/5427f9f97613e71086777bcfc8cac265a7b1255b/fastapi/tools.py#L137

    这里 get 和 post 有个 sign ,我觉得也需要
    https://www.v2ex.com/t/939839#r_13072767
    yxzblue
        26
    yxzblue  
       345 天前   ❤️ 1
    居然还 star 了,先取消为敬
    lwjef
        27
    lwjef  
       345 天前
    @Xianmua #24 我的理解作者应该指的是 task 接口停掉的,post 和 get 都是本地插件行为,除非更新插件没法停止这些行为,但是完全可以把远端关了直接 404 啊。插件作者真是没意识到问题的严重性,公关行为极其失败。
    Livid
        28
    Livid  
    MOD
       345 天前   ❤️ 3
    @Xianmua 是的,依然还在运行。而且,只要你停在 /t/ 主题页面上,就会持续获取新的任务,并不像 @sciooga 说的「浏览一个主题,最多会额外增加 3 个 get 请求」

    Xianmua
        29
    Xianmua  
       345 天前
    @lwjef task 接口没有停掉,获取历史主题爬虫任务没有停掉,自己看视频,别上来就回复
    lwjef
        30
    lwjef  
       345 天前
    @Xianmua #29 你说的 task 是参数和我说的 task 是接口,好好说话,不然我以为是小猫乱敲键盘。
    sciooga
        31
    sciooga  
    OP
       345 天前 via iPhone
    [项目地址]/blob/master/spider/index.js#L184

    实在抱歉,我在动车上,检查了代码是我这里的判断出错了,times-- 变为负数后布尔值又变成 True 了,是我的问题

    目前这部分代码只会请求我们的服务器,服务器返回的是空值,所以不会请求 V 站了,后续需要通过更新扩展移除掉这些请求


    @Xianmua 上面的朋友说得没错,请求会发到我们服务器申请新的任务但是任务一直返回空,所以不会再爬取历史数据
    Xianmua
        32
    Xianmua  
       345 天前   ❤️ 8
    这事录视频了,看视频就完了,昨天说不掺和了 还是又看了下,这回爱咋咋地吧,这条应该是真最后一条了,反正我提醒的义务尽到了,大部分朋友不可能来骂我,我没有任何歪心思,我对的起 v 站的朋友们。
    至于上面那个大眼睛 morty ,让它姥爷去折磨它吧,我没那本事哈哈。
    bxqqq
        33
    bxqqq  
       345 天前
    @zyronon 老哥,借楼问一句,你今天是更新了脚本吗?我上午还能正常使用,现在就点击帖子,悬浮的页面出现后就一直 load 转圈,加载不出来任何东西。。
    Livid
        34
    Livid  
    MOD
       345 天前   ❤️ 1
    @bxqqq 可能和我们今天针对这次爬虫事件部署的一条新的 WAF 规则有关,刚才做了一些调整,你再试试?
    iold
        35
    iold  
       345 天前
    @bxqqq 请求都是 403 ,应该是 v2 的后端做了特征处理。
    zyronon
        36
    zyronon  
       345 天前
    @bxqqq 我未更新脚本,站长更新的 WAF 规则导致的 ,我正在看什么地方不一致
    bxqqq
        37
    bxqqq  
       345 天前
    @Livid #34 谢谢站长,已经可以了。
    bxqqq
        38
    bxqqq  
       345 天前
    @zyronon #36 老哥,刚刚站长应该是已经做过一些调整,现在已经 work 了。
    zyronon
        39
    zyronon  
       345 天前
    @bxqqq 现在可以正常使用了。站长调整了 WAF 规则
    picone
        40
    picone  
       345 天前
    开源的确不是开脱的借口,但是作为用户应该反思对使用开源软件时审查的是否足够。所有人都是善良的当然好,但作为用户方也不能老依赖这个
    dianso
        41
    dianso  
       345 天前
    和你说的完全不一样,每秒钟访问几十次每个主题
    ffkjjj
        42
    ffkjjj  
       344 天前
    这个插件不知道什么情况下会自动启用 vDaily. 我关闭过 vDaily 两次, 都被自动启用了.
    因为我不喜欢在首页右侧出现 vDaliy 的相关主题列表, 我就关闭过这个功能. 后面发现 首页 vDaliy 列表又出现了, 一看设置, vDaliy 是开启的. 当时还以为记忆出现了偏差, 以为之前没关闭过 vDaliy. 然后又手动关闭了 vDaliy 一次. 今天看到这个主题, 又去看了眼设置, vDaliy 又被启用了...
    ffkjjj
        43
    ffkjjj  
       344 天前
    @ffkjjj #42 回复错了, 不是看了这个帖子, 是 https://www.v2ex.com/t/939839 这个
    shyrock
        44
    shyrock  
       344 天前
    哎,怎么说呢。
    首先挺喜欢这个插件的,也用了很多年。
    但是作者在这个主题中的表现确实不够坦诚,这种遮遮掩掩的态度越发加重了大家的质疑。
    希望这事情能够说清楚,但是似乎说清楚的希望不大。。。
    unco020511
        45
    unco020511  
       344 天前   ❤️ 12
    我觉得大家是不是有些太敏感了,插件也是为爱发电呀,分析了下前因后果,感觉就是作者的一个 bug 引起不符合预期的爬取次数?
    ukyoo
        46
    ukyoo  
       344 天前
    这点用户量爬了能干嘛...
    sillydaddy
        47
    sillydaddy  
       344 天前   ❤️ 4
    @shyrock 事件的经过大概是这样的:

    v2ex plus 插件作者开发了一个关于 V2EX 的新功能 vDaily ,可以发布类似于 v 站帖子排行榜的功能,也有挖掘历史帖子展示出来的功能,所以它不光需要 v 站近期的帖子,还需要历史帖子的数据。

    按照 plus 作者的说法,它向 sov2ex 作者借了一份爬取过的 v 站的存量帖子数据,但有些数据(点赞数、感谢数)不全。
    https://www.v2ex.com/t/939486?p=2#r_13072169

    所以,plus 作者决定自己爬取历史帖子数据。根据下面用户的反馈,这大概是在 2 个月前开始的:
    https://www.v2ex.com/t/924796

    问题在于,plus 作者完成这个爬取的过程,是借助 plus 插件用户:它用服务器下发给每个 plus 插件用户一些主题 id ,让这些用户在本地帮它完成主题的爬取,然后上传爬取到的主题内容到 plus 作者的服务器上。这就导致了刚才提到的那个帖子里,plus 插件的用户突然发现「最近查看过的主题」里面,出现了一些自己从来没有看过的主题。

    plus 作者的这个决定,并没有征得 plus 插件用户的同意,没有显式给出这些用户自主选择的权利。

    其实单 ip 爬取 v 站的数据,分布到 6 个月内,按照 90 万个帖子,180 天,每天大概 5000 个帖子,平均 20 秒请求一个帖子,对 v 站造成的压力应该不会增加多少。猜测 plus 作者可能是想快点爬完?
    goodryb
        48
    goodryb  
       344 天前   ❤️ 1
    @sillydaddy #47 课代表就是你。

    这个扩展原来也用了挺长时间,一直没什么更新,最近几个月感觉更新的很频繁,果然还是有些问题在里面。


    @sciooga #31 其实有时候我们也不需要多么复杂的功能,保持初心就好
    sillydaddy
        49
    sillydaddy  
       344 天前   ❤️ 1
    @goodryb
    问题在于,按照上面的分析,它这样加速爬,不管是单机加速爬,还是分布式加速爬,10 倍的加速,会给 v 站造成 10 倍压力,100 倍就是 100 倍压力。

    这样走捷径,相当于是走了歪路了,把用户和站长都触犯了。推出新功能,完全可以循序渐进啊,比如 v 站有 90 万个历史帖子,但不必都爬完,就可以推出新功能。想挖掘历史帖子的话,可以逐步挖掘,比如先爬取 1/3 的历史帖子,这 1/3 的历史帖子(30 万条),完全能够支撑新功能。后面再逐渐补充爬取剩下的 2/3 的帖子。
    mogazheng
        50
    mogazheng  
       344 天前
    不管你开不开源,有没有开关,在做这个功能的时候,难道没有一点点的罪恶感?
    如果有,但却没有尽可能让用户知道,是不是存在一点侥幸心理?
    如果没有,那更可怕。
    NessajCN
        51
    NessajCN  
       344 天前
    @lwjef 我进去看了一眼源码,的确只上传了帖子内容,没有用户个人信息。暂且相信作者没有窃取隐私的主观恶意。
    那么现在的爬虫行为最大的客观危害就是对站点的访问压力了
    剩下的就是对用户情感的损害(我个人不用插件所以这方面感受不深)
    quicksand
        52
    quicksand  
       344 天前   ❤️ 2
    我觉得作者的出发点肯定是好的, 做产品过程中难免会犯错. 不过确实侵犯了用户的权利, 这个和开源不开源是没关系的, 如果作者能从这次事件中吸取经验那也是好事
    micromars
        53
    micromars  
       344 天前   ❤️ 2
    @quicksand #52 没有冒犯的意思,但是'我觉得作者的出发点肯定是好的, 做产品过程中难免会犯错',这两句话太经典了,DNA 动了
    myselflove8090
        54
    myselflove8090  
       344 天前
    国内新闻发布会现场😄,楼上
    MajestySolor
        55
    MajestySolor  
       344 天前
    这种功能难道不应该是默认关闭由用户自己选择开启么
    不声不响默认开启这吃相也太难看了 🐶
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2871 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:32 · PVG 23:32 · LAX 08:32 · JFK 11:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.