Извлечение данных из Facebook с помощью Python

Я уже несколько дней пытаюсь (безуспешно) собрать города примерно с 500 URL-адресов Facebook. Однако Facebook очень странно обрабатывает свои данные, и я не могу понять, что происходит под капотом, чтобы понять, что мне нужно делать.

По сути, проблема заключается в том, что Facebook отображает очень разные объемы данных в зависимости от того, кто вошел в систему и какие настройки конфиденциальности учетной записи. Например, попробуйте открыть следующие три ссылки, как в браузере, в котором вы вошли в Facebook, так и в другом:

[ССЫЛКИ УДАЛЕНЫ ИЗ-ЗА КОНФИДЕНЦИАЛЬНОСТИ]

Как видите, Facebook загружает данные в обоих случаях для первой ссылки, но получает данные для второй ссылки только в том случае, если вы вошли в систему (в ЛЮБУЮ учетную запись). Третья ссылка показывает город, когда вы вошли в систему, но отображает другую информацию только тогда, когда вы этого не сделаете.

Причина, по которой это чрезвычайно проблематично (и связана с Python), заключается в том, что при попытке очистить страницу с помощью Beautiful Soup или Mechanize я не могу понять, как заставить программу «притвориться», что я вошел в учетную запись. Это означает, что я могу легко получить данные по первому типу ссылки (которых меньше 10), но я не могу получить город по второму или третьему типу. До сих пор я пробовал ряд решений с небольшим успехом.

Вот пример кода, который правильно работает для первого типа, но не для других типов:

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. Если у кого-то есть идеи, как это обойти, буду очень признателен. Спасибо!


person cscanlin    schedule 27.09.2013    source источник
comment
При удаче? Я тоже что-то пробовал, но потерпел неудачу.   -  person xxbinxx    schedule 07.09.2015


Ответы (4)


Правильный способ сделать это — использовать API facebook. По различным причинам, связанным с бизнесом, безопасностью и конфиденциальностью, они изо всех сил стараются усложнить сбор данных.

Если вы настаиваете на очистке, я попытаюсь сначала войти в систему, используя механизировать, чтобы отправить форму. Я никогда не пытался сделать это с Facebook, но многие веб-сайты имеют более простые для анализа версии, предназначенные для мобильных пользователей, на m.site.com.

person James Robinson    schedule 27.09.2013
comment
насколько я могу судить, facebook не позволяет вам получить доступ к городу пользователя, если только пользователь не разрешит вам это сделать. Знаете ли вы какой-либо способ обойти это, или мне придется запрашивать доступ у всех из них? - person cscanlin; 27.09.2013
comment
«facebook не позволяет вам получить доступ к городу пользователя, если только пользователь не разрешит вам это сделать». — да, это называется конфиденциальность, пожалуйста, посмотрите. «Знаете ли вы какой-нибудь способ обойти это» — значит, вы явно спрашиваете, как нарушить конфиденциальность пользователя…? - person CBroe; 28.09.2013
comment
Весело и несколько болезненно оглядываться на этот вопрос годы спустя. В любом случае, я только что понял, что никогда не принимал ответ, и это лучший ответ на вопрос. Так что спасибо за помощь заблудшему новичку! - person cscanlin; 26.03.2017
comment
@CBroe нет, пользователь решил раскрыть эту информацию, чтобы она стала общедоступной. Как пользователь, вы можете видеть это, так какая разница в том, чтобы позволить API выставлять это? Facebook и конфиденциальность несовместимы, если вы не заметили. - person shinzou; 02.02.2018
comment
Публичный @shinzou через веб-сайт означает, что он доступен для реального человека, который может просмотреть несколько сайтов и просмотреть информацию для нескольких человек - ничего страшного. Публичный доступ через API будет означать, что теневой разработчик приложения из дерьмовой страны по вашему выбору может собирать эти данные в массовом порядке и (аб-)использовать их для любых злонамеренных целей, которые они имеют в виду. - person CBroe; 02.02.2018
comment
И этот реальный человек не может этим злоупотреблять? Чем это отличается от публичного форума? Чем это отличается от ведения журнала irc-канала? Вход в твиттер-аккаунт? и так далее. Кроме того, как они собираются злоупотреблять ОБЩЕСТВЕННОЙ информацией, которую пользователи явно публикуют в Интернете??? если вы пишете вещи, о которых можете пожалеть, может быть, не публикуйте их? виноват только плакат. @CBroe - person shinzou; 02.02.2018
comment
@shinzou, конечно, человек тоже может это сделать, но им потребуется гораздо больше времени, чтобы собрать эту информацию, скажем, для ста тысяч пользователей, тогда как (при условии, что идентификаторы пользователей известны) приложение, делающее это через API, может сделать это практически в кратчайшие сроки... - person CBroe; 02.02.2018

Вам следует изучить использование facepy от Йоханнеса Горсета. Он проделал блестящую работу. Я использовал его, когда работал над небольшим приложением Facebook для личного проекта.

person Rohit    schedule 27.09.2013
comment
Есть успехи в парсинге со страниц и групп в фейсбуке? :-) - person Nabin; 13.08.2015
comment
Вы сравнивали facepy и facebook-sdk? Я пытаюсь выбрать лучшую библиотеку на данный момент. - person Tennessee Leeuwenburg; 24.05.2017

Я считаю, что сбор данных с Facebook незаконен. Это есть в условиях использования facebook. Каждое действие регистрируется с вашими данными для входа, даже если вы используете бота для парсинга. Если вас поймают, они могут запретить вам пользоваться Facebook на всю жизнь. Если существует потенциальная угроза для любого актива, который вы можете представлять, они могут дополнительно оштрафовать вас.

person TNT    schedule 13.06.2016

Вы можете попробовать использовать селен и Facebook API. Мне также пришлось извлечь некоторые похожие данные из списка тестовых учетных записей Facebook, а веб-драйвер selenium помог эмулировать реального пользователя и собрать необходимые данные.

person shashivs    schedule 27.03.2015
comment
Для инстаграма есть очень хорошая библиотека под названием "instaloader", есть что-то подобное для фейсбука? Я наткнулся на это, но не смог найти больше информации и больше функций: pypi.org/ проект/facebook-scraper/#description - person taga; 14.08.2019