【问题标题】:Why can't I load a Facebook app page in Python?为什么我不能在 Python 中加载 Facebook 应用页面?
【发布时间】:2012-03-15 19:48:46
【问题描述】:

我正在设计一个链接抓取程序,它可以抓取给定 URL 的基本链接预览字段,例如页面标题、描述和图像等。到目前为止,我已经有了一个使用 Python @ 的非常好的工作版本987654321@图书馆和Beautiful Soup

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

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

Facebook 应用示例: http://www.facebook.com/cocacola/app_106795496113635

来自浏览器的响应:

<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 登录页面的。这是一个公共应用程序,所以问题是它为什么需要从我的服务器登录。

【问题讨论】:

  • 不,看起来它正试图让我的服务器登录 - 查看我的编辑

标签: python facebook http


【解决方案1】:

就像其他人提到的那样,Facebook 正在查看您的 User-Agent 字符串。您可以在随请求发送的标头中设置它:

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

如您所见,否则您将重定向到登录页面。

【讨论】:

    【解决方案2】:

    使用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
    

    【讨论】:

    • 不知道该怎么办——我知道如何从浏览器访问标题,但这会告诉我什么?
    • 用来欺骗网站。如果您添加标题和标题,它不会将您识别为机器人。
    • 啊,好的。因此,在我的请求中添加此标头可以让我模拟浏览器。知道了。我会试试这个并报告......
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      所以你的脚本应该像往常的网络浏览器一样呈现它们自己。您可以使用嗅探器分析您对 facebook 的请求。 Wireshark 会很好地完成这项任务。

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

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

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

      如您所见,facebook 可以轻松地将您识别为机器人。蟒蛇机器人。要看起来像 Web 浏览器,您必须在请求中添加额外的标头。

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

      【讨论】:

      • @Adam- 谢谢,您的解释是正确的,但解决方案过于复杂 - 我们可以使用 requests 库更轻松地修改标题(并完成所有操作)。
      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 2019-02-09
      • 1970-01-01
      • 2018-09-20
      • 2011-12-24
      • 1970-01-01
      • 2013-03-09
      • 2019-05-31
      相关资源
      最近更新 更多