写了一个人人网信息备份工具,敬请指教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
whusnoopy
V2EX    Python

写了一个人人网信息备份工具,敬请指教

  •  1
     
  •   whusnoopy 2018-08-20 11:35:12 +08:00 6439 次点击
    这是一个创建于 2681 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前阵子人人网又冒了个热点,在热点事件前就考虑是不是把自己的人人信息备份下来。找了一圈,之前的各个备份工具在 2017 年人人登录机制改变后就都不能用了。参考前辈们的经验,写了这么一个工具:

    https://github.com/whusnoopy/renrenBackup

    目前可以

    1. 邮箱密码登录
    2. 抓取自己的 状态、留言板、相册、日志 及对应的评论和点赞信息
    3. 抓取指定用户,被当前登录用户可见的上述内容
    4. 用 Flask 展示抓取的信息

    1. 头像、照片都抓到本地了,但是可能有因为人人的原因导致原图不存在的情况
    2. 原文评论和点赞评论都抓了,但有遗漏多半是人人自己的锅,登录到官方网页版都看不到
    3. 点赞数是对的,但只能显示最近 8 个点赞的人,也是人人接口的锅,官方网页版也只显示 8 个人

    还打算做的工作

    1. 纯静态输出(即脱离 Flask 查看,方便抓取后导给没有 Python 环境的其他人看)
    2. 对抓挂了的图的补救抓取(对应上面注 1 )
    3. RESTful + Vue.js 纯动态输出(自我学习玩)
    第 1 条附言    2018-11-14 18:09:57 +08:00
    纯静态输出已经完成,有环境的可以抓完了生成一个压缩包给别人,直接离线查看
    30 条回复    2019-10-31 15:17:33 +08:00
    yanyuechuixue
        1
    yanyuechuixue  
       2018-08-20 12:02:25 +08:00
    赞一下~ 这是有用的东西, 比什么知乎爬虫高到不知道哪里去了~
    xream
        2
    xream  
       2018-08-20 13:16:16 +08:00
    感谢 已备份
    RYAN0UP
        3
    RYAN0UP  
       2018-08-20 13:20:18 +08:00 via Android
    不错不错
    ys0290
        4
    ys0290  
       2018-08-20 13:24:44 +08:00 via iPhone
    活在我的记忆中
    matrix1010
        5
    matrix1010  
       2018-08-20 13:35:40 +08:00 via Android
    我以前按最近来访爬,爬了大概几万人
    4u1kto
        6
    4u1kto  
       2018-08-20 13:57:56 +08:00
    谢谢提醒,已停用
    sniper1211
        7
    sniper1211  
       2018-08-20 15:31:41 +08:00
    vjnjc
        8
    vjnjc  
       2018-08-20 16:14:08 +08:00
    看起来不错,多谢分享
    luanluan
        9
    luanluan  
       2018-08-20 16:19:15 +08:00
    不错,我把它改一下
    muyi
        10
    muyi  
       2018-08-20 16:20:24 +08:00
    非常实用,已备份,送上感谢~
    wocanmei
        11
    wocanmei  
       2018-08-20 21:22:58 +08:00 via iPhone
    人人网好久不用了
    mingyun
        12
    mingyun  
       2018-08-20 23:03:58 +08:00
    进入主页就是一个妹子直播,还开着声音 现在人人网都这样了。。。
    lemonda
        13
    lemonda  
       2018-08-20 23:36:59 +08:00
    有人人的时候交往女生真是很容易啊
    whusnoopy
        14
    whusnoopy  
    OP
       2018-11-14 18:09:05 +08:00
    今天看到新闻,人人网的社交资产已经被陈一舟卖掉了,真庆幸自己先留了个后手
    neoprc
        15
    neoprc  
       2018-11-15 11:36:29 +08:00
    File "fetch.py", line 5, in <module>
    from playhouse.shortcuts import model_to_dict
    ImportError: No module named playhouse.shortcuts
    whusnoopy
        16
    whusnoopy  
    OP
       2018-11-15 12:24:47 +08:00
    @neoprc 环境都装好了么?这个应该是 sqlite 库里的
    crazybaikal
        17
    crazybaikal  
       2018-11-17 07:52:55 +08:00
    非常实用,感谢楼主!
    hackpro
        18
    hackpro  
       2019-05-01 18:19:00 +08:00
    感谢大佬 非常棒的工具 已 Star

    提两点意见:
    1、浏览器中显示时支持左右方向键自动切换图片,这个比一个个点按钮体验要好很多
    2、当前显示大图的时候似乎是按照 Actual Size 模式显示的,能否做成 Fit 模式显示,这样不用滚轮上下滚了。用户查看原图的话可以考虑双击或者放大镜工具。

    再次感谢
    whusnoopy
        19
    whusnoopy  
    OP
       2019-05-01 19:08:22 +08:00
    @hackpro 麻烦直接在 GitHub 项目下提 issue 吧,issue 不仅仅是问题,也可以是建议,这样有助于统一管理,如果有其他人能做,也可以看到 issue 后提 Pull Request (或者你有空的话也可以把这两个功能做掉发个 PR 来)
    whusnoopy
        20
    whusnoopy  
    OP
       2019-05-16 15:32:24 +08:00
    whusnoopy
        21
    whusnoopy  
    OP
       2019-05-19 08:42:01 +08:00
    @hackpro 展示大图对宽高比过高的图片现在也加了最大高度限制,通过点击图片查看原图(可能会影响习惯了点图是看下一张操作),详见 https://github.com/whusnoopy/renrenBackup/issues/39
    hackpro
        22
    hackpro  
       2019-05-19 10:33:43 +08:00 via iPad
    @whusnoopy 感谢 键盘快捷键现在已经很好用了 但是图片显示还是有的问题 每次都要上下拖动滚动条才能看全图片
    另外请教下如何按用户名 /相册名称层级导出原始图片 方便用其他软件查看 谢谢
    whusnoopy
        23
    whusnoopy  
    OP
       2019-05-19 10:54:04 +08:00
    @hackpro 看全图片这个可能还要再考虑下屏幕大小的适配优化,我开发调试是在 1920x1080 或 2560x1440 的分辨率下弄的,对更低分辨率或开了高 DPI 的是不太友好(捂脸

    按用户名和相册名称导出原始图片,这个可以参考下 export.py 下的 export_albums 这个方法,就是导出的时候别渲染页面,直接新建文件夹拷贝图片就好
    hackpro
        24
    hackpro  
       2019-05-19 16:42:19 +08:00
    @whusnoopy 可以按照长宽中取 max 按照一定的比例缩放就行了
    另外更新之后的版本似乎经常出现验证码的问题 而且验证码按照弹出的图片输入四个汉字总是通不过

    get icode image, output to ./static/icode.jpg
    Input text on Captcha icode image
    whusnoopy
        25
    whusnoopy  
    OP
       2019-05-19 17:20:01 +08:00
    @hackpro 就是这个缩放尺度把握不好,而且还有外部容器和内部图片的比例问题,前端设计还是见仁见智并且各种坑

    验证码的问题,建议换个 IP 后把之前的登录信息清掉后再试,这个是触发安全阈值的问题,如果你的号在不同的地方登录或同一个 IP 不停的登不同的号,容易触发验证码,这个和代码版本没有关系
    hackpro
        26
    hackpro  
       2019-10-24 10:08:30 +08:00 via iPad
    @whusnoopy 老哥 GitHub 上最新 pull 的代码有点问题 希望检查下
    whusnoopy
        27
    whusnoopy  
    OP
       2019-10-24 10:58:37 +08:00
    @hackpro 问题是什么。。。没看到 issue 这里也没有任何有效信息,猜猜我是谁么
    hackpro
        28
    hackpro  
       2019-10-30 21:15:26 +08:00
    @whusnoopy 抱歉 我没有说清楚
    >>> python manage.py fetch -e mobile -p 'pwd' -u id_num -s -g -a -b -r
    最后报错的部分结果为:
    fetched 8 albums
    prepare to fetch blogs
    start crawl blog list page 0
    Traceback (most recent call last):
    File "manage.py", line 116, in <module>
    manager.run()
    File "/usr/local/anaconda3/lib/python3.6/site-packages/flask_script/__init__.py", line 417, in run
    result = self.handle(argv[0], argv[1:])
    File "/usr/local/anaconda3/lib/python3.6/site-packages/flask_script/__init__.py", line 386, in handle
    res = handle(*args, **config)
    File "/usr/local/anaconda3/lib/python3.6/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
    File "manage.py", line 41, in fetch
    fetched = fetch_user(uid, fetch_status=status, fetch_gossip=gossip, fetch_album=album, fetch_blog=blog)
    File "/Users/XXX/Code/Python/renrenBackup/fetch.py", line 99, in fetch_user
    fetch_blog(uid)
    File "/Users/XXX/Code/Python/renrenBackup/fetch.py", line 76, in fetch_blog
    blog_count = crawl_blog.get_blogs(uid)
    File "/Users/XXX/Code/Python/renrenBackup/crawl/blog.py", line 83, in get_blogs
    total = load_blog_list(cur_page, uid)
    File "/Users/XXX/Code/Python/renrenBackup/crawl/blog.py", line 26, in load_blog_list
    r = crawler.get_json(config.BLOG_LIST_URL.format(uid=uid), {'curpage': page})
    File "/Users/XXX/Code/Python/renrenBackup/crawl/crawler.py", line 123, in get_json
    r = json.loads(resp.text.replace(',}', '}'))
    File "/usr/local/anaconda3/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
    File "/usr/local/anaconda3/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/local/anaconda3/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    whusnoopy
        29
    whusnoopy  
    OP
       2019-10-31 11:23:12 +08:00
    @hackpro 这不是最新的代码更新带来的问题,而是人人网 Web 端的 blog 页面全挂导致的解析问题,在人人网自己解决这个问题前,暂时没有办法处理,建议跳过 `-b` 参数抓取 blog。这个在项目介绍文档一开始就有更新说明 https://github.com/whusnoopy/renrenBackup#%E4%BA%BA%E4%BA%BA%E7%BD%91%E4%BF%A1%E6%81%AF%E5%A4%87%E4%BB%BD%E5%B7%A5%E5%85%B7

    有人提议可以用网页手机版来抓取,但是网页手机版的 blog 输出里,排版格式基本全挂,且不一定能输出全文,还有登陆安全问题(非 HTTPS,授权走明文参数),所以只能等待

    另:遇到问题先看 Issue 列表也是个好习惯,可能你遇到的问题已经有其他人提出过了,如果没有,也在 Issue 里提出会更有助于他人了解问题
    hackpro
        30
    hackpro  
       2019-10-31 15:17:33 +08:00 via iPad
    @whusnoopy 好的好的 感谢开发者
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1223 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 17:38 PVG 01:38 LAX 09:38 JFK 12:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86