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 · 5886 次点击
    这是一个创建于 2285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前阵子人人网又冒了个热点,在热点事件前就考虑是不是把自己的人人信息备份下来。找了一圈,之前的各个备份工具在 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   ·   实用小工具   ·   3201 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:40 · PVG 08:40 · LAX 16:40 · JFK 19:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.