有时无法正确保存用户头像和用户名
xuan-w opened this issue · comments
Xuan Wang commented
当抓取别人的内容时,个别时候,运行结束时,输出的uid正确,而用户名、用户头像都来自于抓取者本人。
我现在手里有一个例子,但限于隐私不便放出。
据我分析,这个问题分成两部分
首先,当fetch.py脚行时,无论是否给出 -u 选项,utils.get_user() 几乎总是给出抓取者本人的姓名和头像。无论提供哪个uid的homepage,结果总是一样的。
似乎这并没有很简短的修复办法。是可以抓取首页上的头像和姓名,但可能需要上BeautifulSoup来解析,而不是简单地字符搜索。
这样的话,初始的姓名和头像就是错的。
第二个问题,似乎绝大多数情况下,正确的用户名和头像会在脚本运行的过程中被更新。但是仍然存在少数时候没有更新。我还没有搞清楚为什么大部分时候会更新,少数时候没有被更新。
更新:
分析源码之后我似乎明白怎么回事了。save_user总共只有三个被调用点。既然 get_user() 返回的总是错的,那么只能是 get_comments() get_likes() 更新了用户的小头像。对于gossips来说,因为用户的头像是当年的头像,抓取留言板的时候并没有更新用户头像信息。
结论:当一个用户从未回复过评论,且从未对自己的内容点赞时,就无法抓取到正确的用户姓名和用户头像。
这样看来,还是修正get_user() 比较可行。我可能研究研究发个PR。
Wen YE commented
这里有几个问题
utils.get_user()
获取的都是当前登录用户的姓名和头像,这个地方属于设计时就有问题,因为之前遇到过抓某人信息,自己都从来没回复过自己,导致一直没有姓名和头像,回头去拿的时候没有完整测试到底是自己还是别人- 用
BeautifulSoup
和pyquery
之类的可以更好解析页面,这个也是刻意规避开的,因为这两个库一用,就要带着装一堆库,尤其是lxml
这个在 Windows 环境下默认装不上的库,所以才各种正则匹配和直接字符串查找去试图解决 gossip
里人人自己的数据结构就存的比较诡异,历史留言保存的是历史头像,所以是分开处理的
我看到你提的 PR,在用 bs4 解决,其实不用这么麻烦,在用户页面
id="userpic"
这个元素一定是用户头像,所以用个正则就可以取到,这个还不涉及跨行的问题。另外需要注意的是这里取到的用户头像是main
这个尺寸(177x177),其他地方都用的tiny
这个尺寸(50x50),把拿到的头像 url 里最后一段的main
换成tiny
就可以- 源码里
var profileOwnerName = '*****';
这段可以取到对应的用户名,也是正则就可以解决,注意一下里面有的不是空格是\t