私はここ数日、約 500 の Facebook URL から都市をスクレイピングしようとしてきました (失敗しました)。しかし、Facebook はそのデータを非常に奇妙な方法で処理しており、私が何をする必要があるかを理解するために内部で何が起こっているのかを理解することはできません.
基本的に問題は、ログインしているユーザーやアカウントのプライバシー設定によって、Facebook が表示するデータ量が大きく異なることです。たとえば、次の 3 つのリンクを、Facebook にログインしているブラウザとログインしていないブラウザの両方で開いてみてください。
[プライバシー上の懸念によりリンクを削除]
ご覧のとおり、Facebook は最初のリンクの両方のケースでデータを読み込みますが、(ANY アカウントに) ログインしている場合は 2 番目のリンクのデータのみを取得します。3 番目のリンクには、ログインしている場合は都市が表示されますが、ログインしていない場合は他の情報のみが表示されます。
これが非常に問題となる (そして Python に関連する) 理由は、Beautiful Soup や Mechanize でページをスクレイピングしようとすると、アカウントにログインしているようにプログラムに「ふりをさせる」方法がわからないからです。つまり、最初のタイプのリンク (10 個未満) からは簡単にデータを取得できますが、2 番目または 3 番目のタイプからは都市を取得できません。これまでのところ、いくつかのソリューションを試しましたが、ほとんど成功していません。
次のサンプル コードは、最初のタイプでは正しく動作しますが、他のタイプでは正しく動作しません。
import mechanize
import re
import csv
user_info = []
fb_url = 'http://www.facebook.com/100004210542493'
br = mechanize.Browser()
br.set_handle_robots(False)
br.open(fb_url)
all_html = br.response().get_data()
print all_html
city = re.search('fsl fwb fcb">(.+?)</a></div><div class="aboutSubtitle fsm fwn fcg', all_html).group(1)
user_info = [fb_url, city]
print user_info
Beautiful Soupを使ったバージョンもあります。誰かがこれを回避する方法について何かアイデアを持っているなら、私は非常に感謝しています. ありがとうございました!