用Python抓取Facebook数据

7 投票
2 回答
2795 浏览
提问于 2025-04-16 07:43

我想知道我在Facebook上的每个朋友有多少个朋友。显然,官方的Facebook接口不允许获取朋友的朋友,所以我需要想办法绕过这个(有点合理的)限制。我尝试了以下方法:

import sys
import urllib, urllib2, cookielib

username = 'me@example.com'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'email' : username, 'pass' : password})
request = urllib2.Request('https://login.facebook.com/login.php')
request.add_header('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc14 Firefox/3.6.12')
opener.open(request, login_data)
resp = opener.open('http://facebook.com')
print resp.read()

但我最后只得到了一个验证码页面。有人知道Facebook是怎么检测到这个请求不是来自“正常”浏览器的吗?我可以加一步去解决验证码,但那样会让程序变得复杂,所以我更想避免这样。当我用同样的用户代理字符串在网页浏览器中操作时,我就不会遇到验证码。

另外,有没有人有更合理的想法,能帮我实现我的目标,也就是获取朋友的朋友的列表?

2 个回答

0

我尝试了很多方法来抓取Facebook的数据,最终只有一种方法对我有效:

首先,你需要安装selenium,还有Firefox插件、服务器和Python客户端库。然后,使用这个Firefox插件,你可以录制你登录时的操作,并将其导出为一个Python脚本。这个脚本可以作为你工作的基础,基本上我在这个脚本中添加了一个请求,让我的服务器获取一份需要在Facebook上检查的内容列表,最后在脚本结束时,我把结果发送回我的服务器。

我没有找到直接从我的服务器使用像mechanize这样的浏览器模拟器来实现这个的办法!我想这需要在客户端浏览器上进行。

3

你有没有试过用Fiddler2或者Wireshark来跟踪和比较HTTP交易?Fiddler甚至可以跟踪https,只要你的客户端代码能够处理虚假的证书。

撰写回答