2012-03-15 68 views
0

我正在設計一個鏈接抓取程序,抓取給定的URL的基本鏈接預覽字段,如頁面標題,描述和圖像等。到目前爲止,我有一個相當不錯的工作版本,它使用Python requests庫和Beautiful Soup爲什麼我無法在Python中加載Facebook應用程序頁面?

大多數網址都可以完美呈現,但是當我嘗試Facebook應用的網址時,我得到的HTML響應與直接從瀏覽器訪問它不同。例如,如果我在瀏覽器和視圖源中導航到應用程序,則會看到特定於該應用程序的標題字段。但是,Python中的HTML響應返回通用Facebook.com標題字段。

我在試着瞭解Facebook應用程序頁面是如何向我的瀏覽器發送特定的HTML響應,以及如何向我的Python服務器發送另一個HTML響應。

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 

UPDATE: OK,所以才實現了Python的響應是一個Facebook登錄頁面。這是一個公共應用程序,所以問題是爲什麼它要求從我的服務器登錄。

+0

你得到403錯誤嗎? – Froyo 2012-03-15 20:27:56

+0

不,看起來像試圖讓我的服務器登錄 - 看到我的編輯 – Yarin 2012-03-15 21:38:52

回答

1

容易得多是使用Chrome開發者工具(換擋控制-J或查看 - >開發技術>開發工具然後去網絡選項卡上,按下錄製按鈕(默認情況下,黑色圓圈不錄製時,起初很難找到)然後訪問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 
+0

不知道該怎麼辦 - 我知道如何從我的瀏覽器訪問標題,但那會告訴我什麼? – Yarin 2012-03-15 20:25:43

+0

它被用來欺騙網站。如果添加標題和標題,它不會將您識別爲bot。 – Froyo 2012-03-15 20:31:36

+0

啊,好的。因此,在我的請求中添加此標題可以讓我模擬一個瀏覽器。得到它了。我會嘗試這個,並報告回... – Yarin 2012-03-15 21:40:40

1

所以你的腳本應該呈現他們自己一如既往的網頁瀏覽器。您可以使用嗅探器來分析您對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 bot。要看起來像網絡瀏覽器,你必須爲你的請求添加額外的頭文件。

在這個問題上,你可以看到如何檢查默認標題:Changing user agent on urllib2.urlopen

+0

@ Adam-謝謝,你的解釋是正確的,但解決方案過於複雜 - 我們可以更容易地使用[請求]對頭文件進行修改(並且完成所有任務) (http://docs.python-requests.org/en/v0.10.7/index.html)庫。 – Yarin 2012-03-16 03:34:54

1

Facebook不允許機器人。也許因爲你只是使用請求噸,它不會讓你進入該頁面。併發送給其他頁面。

您應該在Facebook上註冊您的應用程序。使用oauth2完成授權,然後發送這些請求。它應該工作。

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 

否則你會得到一個重定向到登錄頁面,因爲你已經注意到。

+0

@ Chesles-謝謝,這正是我最終做的 – Yarin 2012-03-16 03:36:13

相關問題