为什么可以';我不能用Python加载Facebook应用程序页面吗?

为什么可以';我不能用Python加载Facebook应用程序页面吗?,python,facebook,http,Python,Facebook,Http,我正在设计一个链接抓取程序,它可以抓取给定URL的基本链接预览字段,如页面标题、描述和图像等。到目前为止,我已经有了一个使用Python库和 大多数url都能很好地显示,但当我尝试Facebook应用程序的url时,我得到的HTML响应与直接从浏览器访问时不同。例如,如果我在浏览器中导航到该应用程序并查看源代码,我将看到特定于该应用程序的标题字段。但是,Python中的HTML响应返回通用的Facebook.com标题字段 我试图理解Facebook应用程序页面是如何向我的浏览器发送特定的HTM

我正在设计一个链接抓取程序,它可以抓取给定URL的基本链接预览字段,如页面标题、描述和图像等。到目前为止,我已经有了一个使用Python库和

大多数url都能很好地显示,但当我尝试Facebook应用程序的url时,我得到的HTML响应与直接从浏览器访问时不同。例如,如果我在浏览器中导航到该应用程序并查看源代码,我将看到特定于该应用程序的标题字段。但是,Python中的HTML响应返回通用的Facebook.com标题字段

我试图理解Facebook应用程序页面是如何向我的浏览器发送特定的HTML响应,并向我的Python服务器发送另一个响应的

Facebook应用程序示例:

从浏览器响应:

<title>Coca-Cola</title>
<title>Facebook</title>

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

所以您的脚本应该像往常一样在web浏览器中显示它们。您可以使用嗅探器分析您对facebook的请求。这将有助于完成这项任务

以下是来自Chrome的请求的示例:

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

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

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

正如你所看到的,facebook可以很容易地将你识别为机器人。Python机器人。要看起来像web浏览器,您必须在请求中添加额外的标题


在这个问题中,您可以看到如何检查默认标题:

,因此您的脚本应该像往常一样在web浏览器中显示它们。您可以使用嗅探器分析您对facebook的请求。这将有助于完成这项任务

以下是来自Chrome的请求的示例:

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

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

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

正如你所看到的,facebook可以很容易地将你识别为机器人。Python机器人。要看起来像web浏览器,您必须在请求中添加额外的标题


在这个问题中,您可以看到如何检查默认标题:

更简单的方法是使用chrome开发者工具(Shift-Control-J或View->developer->developer tools)。然后转到“网络”选项卡,按“录制”按钮(不录制时默认为黑色圆圈,一开始可能很难找到)。然后访问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

更简单的方法是使用chrome开发者工具(Shift-Control-J或View->developer->developer tools)。然后转到网络选项卡,按下录制按钮(不录制时默认为黑色圆圈,一开始可能很难找到)。然后访问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

Facebook不允许机器人。也许因为你只是在使用请求,它不允许你访问该页面。并将你发送到其他页面


你应该向facebook注册你的应用程序。使用oauth2完成授权,然后发送这些请求。它应该可以工作。

facebook不允许机器人。也许因为你只是在使用请求,它不允许你访问该页面。然后将你发送到其他页面


你应该向facebook注册你的应用程序。使用oauth2完成授权,然后发送这些请求。它应该可以工作。

就像其他人提到的那样,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

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

正如其他人所提到的,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

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

不确定该怎么办-我知道如何从浏览器访问标题,但这会告诉我什么?它用于欺骗网站。如果添加标题和标题,它将无法识别您是机器人。啊,好的。因此,根据我的请求添加此标题可以让我模拟我是一个broswer。明白了。我会试试这个,然后报告回来…不知道该怎么办-我知道如何从我的浏览器访问标题,但这会告诉我什么?它是用来愚弄网站的。如果你添加标题和标题,它就不会认出你是一个机器人。啊,好的。所以根据我的请求添加这个标题可以让我模仿broswer。明白了。我不会检查并报告…不,看起来它试图让我的服务器登录-查看我的编辑否,看起来它试图让我的服务器登录-查看我的编辑edit@Adam-谢谢,您的解释是正确的,但解决方案过于复杂-我们可以修改标题(和做任何事情)使用库要容易得多。@Adam-谢谢,你的解释是对的,但解决方案太复杂了-我们可以用库更容易地修改标题(和做任何事情)。