我正在设计一个链接抓取程序,它抓取给定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登录页面的。这是一个公共应用程序,所以问题是为什么它要求从我的服务器登录。
答案 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的请求示例:
以下是来自python脚本的请求的示例:
>>> import urllib2
>>> opener = urllib2.build_opener()
>>> response = opener.open('facebook.com')
>>> response = opener.open('http://facebook.com')
因此,您可以看到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完成授权,然后发送这些请求。它应该工作。