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