为什么我不能在Python中加载Facebook应用程序页面?

时间:2012-03-15 19:48:46

标签: python facebook http

我正在设计一个链接抓取程序,它抓取给定URL的基本链接预览字段,如页面标题,描述和图像等。到目前为止,我有一个非常好的工作版本,它使用Python { {3}}库和requests

大多数网址都很完美,但是当我尝试使用Facebook应用的网址时,我得到的HTML响应与我直接从浏览器访问时的不同。例如,如果我在浏览器和视图源中导航到应用程序,我将看到特定于该应用程序的标题字段。但是,Python中的HTML响应返回通用的Facebook.com标题字段。

我试图了解Facebook应用页面是如何向我的浏览器提供某个HTML响应,另一个是我的Python服务器。

Facebook应用示例: Beautiful Soup

来自浏览器回复:

<title>Coca-Cola</title>

来自Python'请求'回复:

<title>Facebook</title>

Python代码:

import requests
r = requests.get(url, allow_redirects=True)
html = r.text
print html

更新 好的,所以才意识到Python响应是针对Facebook登录页面的。这是一个公共应用程序,所以问题是为什么它要求从我的服务器登录。

4 个答案:

答案 0 :(得分:2)

正如其他人提到的那样,Facebook正在查看您的用户代理字符串。您可以在随请求发送的标头中进行设置:

headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3)..."}
r = requests.get("http://www.facebook.com/cocacola/app_106795496113635",
                  headers=headers, allow_redirects=True)
print r.text

否则,您将看到重定向到登录页面,正如您所注意到的那样。

答案 1 :(得分:1)

因此,您的脚本应该像往常一样自我呈现Web浏览器。您可以使用嗅探器来分析您对Facebook的请求。 Wireshark将很好地完成这项任务。

以下是Chrome的请求示例:

chrome request

以下是来自python脚本的请求的示例:

>>> import urllib2
>>> opener = urllib2.build_opener()
>>> response = opener.open('facebook.com')
>>> response = opener.open('http://facebook.com')

urllib2 request

因此,您可以看到Facebook可以很容易地将您识别为机器人。 Python机器人。要将其视为Web浏览器,您必须为请求添加其他标头。

在这个问题中,您可以看到如何检查默认标题:Changing user agent on urllib2.urlopen

答案 2 :(得分:1)

使用chrome开发人员工具(Shift-Control-J或View-&gt; Developer-&gt;开发人员工具)更容易。然后转到网络选项卡,按录制按钮(默认情况下不录制黑圈) ,一开始可能很难找到。)然后访问Facebook,突出显示您选择的请求,在子标签中查看该请求的标题。您可能正在寻找类似

的内容
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11

答案 3 :(得分:1)

Facebook不允许机器人。也许既然你只是在使用请求,它就不允许你进入那个页面。并将您发送到其他页面。

您应该在Facebook注册您的应用程序。使用oauth2完成授权,然后发送这些请求。它应该工作。