whusnoopy / renrenBackup

A backup tool for renren.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

有时无法正确保存用户头像和用户名

xuan-w opened this issue · comments

当抓取别人的内容时,个别时候,运行结束时,输出的uid正确,而用户名、用户头像都来自于抓取者本人。

我现在手里有一个例子,但限于隐私不便放出。

据我分析,这个问题分成两部分
首先,当fetch.py脚行时,无论是否给出 -u 选项,utils.get_user() 几乎总是给出抓取者本人的姓名和头像。无论提供哪个uid的homepage,结果总是一样的。
似乎这并没有很简短的修复办法。是可以抓取首页上的头像和姓名,但可能需要上BeautifulSoup来解析,而不是简单地字符搜索。
这样的话,初始的姓名和头像就是错的。

第二个问题,似乎绝大多数情况下,正确的用户名和头像会在脚本运行的过程中被更新。但是仍然存在少数时候没有更新。我还没有搞清楚为什么大部分时候会更新,少数时候没有被更新。
更新:
分析源码之后我似乎明白怎么回事了。save_user总共只有三个被调用点。既然 get_user() 返回的总是错的,那么只能是 get_comments() get_likes() 更新了用户的小头像。对于gossips来说,因为用户的头像是当年的头像,抓取留言板的时候并没有更新用户头像信息。
结论:当一个用户从未回复过评论,且从未对自己的内容点赞时,就无法抓取到正确的用户姓名和用户头像。

这样看来,还是修正get_user() 比较可行。我可能研究研究发个PR。

这里有几个问题

  1. utils.get_user() 获取的都是当前登录用户的姓名和头像,这个地方属于设计时就有问题,因为之前遇到过抓某人信息,自己都从来没回复过自己,导致一直没有姓名和头像,回头去拿的时候没有完整测试到底是自己还是别人
  2. BeautifulSouppyquery 之类的可以更好解析页面,这个也是刻意规避开的,因为这两个库一用,就要带着装一堆库,尤其是 lxml 这个在 Windows 环境下默认装不上的库,所以才各种正则匹配和直接字符串查找去试图解决
  3. gossip 里人人自己的数据结构就存的比较诡异,历史留言保存的是历史头像,所以是分开处理的

我看到你提的 PR,在用 bs4 解决,其实不用这么麻烦,在用户页面

  1. id="userpic" 这个元素一定是用户头像,所以用个正则就可以取到,这个还不涉及跨行的问题。另外需要注意的是这里取到的用户头像是 main 这个尺寸(177x177),其他地方都用的 tiny 这个尺寸(50x50),把拿到的头像 url 里最后一段的 main 换成 tiny 就可以
  2. 源码里 var profileOwnerName = '*****'; 这段可以取到对应的用户名,也是正则就可以解决,注意一下里面有的不是空格是 \t