web-dev-qa-db-ja.com

Python)を使用してFacebookからデータをスクレイピングする

私はここ数日(失敗して)約500のFacebookURLから都市を削り取ろうとしてきました。しかし、Facebookはそのデータを非常に奇妙な方法で処理しており、私が何をする必要があるかを理解するために内部で何が起こっているのか理解できません。

基本的に問題は、Facebookがログインしているユーザーと、アカウントのプライバシー設定によって、表示されるデータの量が大きく異なることです。たとえば、Facebookにログインしているブラウザとログインしていないブラウザの両方で、次の3つのリンクを開いてみてください。

ご覧のとおり、Facebookはどちらの場合も最初のリンクのデータをロードしますが、(任意のアカウントに)ログインしている場合にのみ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

ビューティフルスープを使ったバージョンもあります。これを回避する方法について誰かが何かアイデアを持っているなら、私は非常にありがたいです。ありがとうございました!

7
cscanlin

rightこれを行う方法は、FacebookAPIを使用することです。さまざまなビジネス、セキュリティ、プライバシーの理由から、データのスクレイピングを難しくしています。

スクレイピングを主張する場合は、最初にmechanizeを使用してログインしてフォームを送信しようとします。私はFacebookでこれを試みたことがありませんが、多くのWebサイトでは、m.site.comでモバイルユーザー向けのバージョンを簡単に解析できます。

13
James Robinson

facepy by Johannes Gorset の使用を検討する必要があります。彼は素晴らしい仕事をした。個人的なプロジェクトのために小さなFacebookアプリで作業したときに使用しました。

15
Rohit

Facebookからデータを取得することは違法だと思います。フェイスブックの使い方という意味ではあります。ボットを使用してスクレイプする場合でも、すべてのアクティビティはログインの詳細に登録されます。捕まえられた場合、彼らはあなたがあなたの生涯にわたってFacebookを使用することを禁止することができます。あなたが提起する可能性のある資産に潜在的な脅威がある場合、それらはあなたにさらにペナルティを課す可能性があります。

4
TNT

SeleniumとFacebookAPIを使用してみることができます。また、テスト用のFacebookアカウントのリストから同様のデータをいくつか取得する必要があり、Selenium Webdriverは、実際のユーザーとしてエミュレートし、必要なデータを取得するのに役立ちました。

1
shashivs