对于个人项目,我正在尝试使用Requests和BeautifulSoup从Facebook获取用户的完整好友列表(我自己)。 然而,主要的朋友页面只显示20个,其余的则在向下滚动时加载了Ajax。
请求网址看起来像这样(方法是GET):
https://www.facebook.com/ajax/pagelet/generic.php/AllFriendsAppCollectionPagelet?dpr=1&data={"collection_token":"1244314824:2256358349:2","cursor":"MDpub3Rfc3RydWN0dXJlZDoxMzU2MDIxMTkw","tab_key":"friends","profile_id":1244214828,"overview":false,"ftid":null,"order":null,"sk":"friends","importer_state":null}&__user=1364274824&__a=1&__dyn=aihaFayfyGmagngDxfIJ3G85oWq2WiWF298yeqrWo8popyUW3F6wAxu13y78awHx24UJi28cWGzEgDKuEjKeCxicxabwTz9UcTCxaFEW58nVV8-cxnxm1typ9Voybx24oqyUf9UgC_UrQ4bBv-2jAxEhw&__af=o&__req=5&__be=-1&__pc=EXP1:DEFAULT&__rev=2677430&__srp_t=1474288976
我的问题是,是否可以重新创建动态生成的令牌,例如__dyn
,cursor
,collection_token
等,以便在我的请求中手动发送?有没有办法弄清楚它们是如何生成的,还是一个失败的原因?
我知道目前的Facebook API不支持查看完整的朋友列表。我也知道我可以用Selenium或其他一些浏览器模拟器来做到这一点,但这感觉太慢了,理想情况下我想在合理的时间内抓住成千上万的朋友列表(朋友列表公开的用户)。
我目前的代码是:
import requests
from bs4 import BeautifulSoup
with requests.Session() as S:
requests.utils.add_dict_to_cookiejar(S.cookies, {'locale': 'en_US'})
form = {}
form['email'] = 'myusername'
form['pass'] = 'mypassword'
response = S.post('https://www.facebook.com/login.php?login_attempt=1&lwv=110', data=form)
# Im logged in
page = S.get('https://www.facebook.com/yoshidakai/friends?source_ref=pb_friends_tl')
任何帮助将不胜感激,包括实现此目的的其他方法:)
答案 0 :(得分:0)
在撰写本文时,您可以通过解析页面来提取此信息,然后通过解析前面的ajax响应来获取后一页面的下一个游标。但是,由于Facebook会定期对其后端进行更新,因此使用selenium to drive a Chrome headless browser滚动页面,然后解析生成的HTML,我获得了更稳定的结果。