CoderCastrov logo
CoderCastrov
Фейсбук

Парсинг Facebook страницы с помощью Python

Парсинг Facebook страницы с помощью Python
просмотров
6 мин чтение
#Фейсбук

В настоящее время социальные платформы очень популярны. Веб-сайты, такие как Youtube, Facebook, Instagram и т. д., широко используются миллиардами людей. На этих веб-сайтах содержится много данных, которые можно использовать для анализа настроений по любому инциденту, предсказания выборов, предсказания результатов любого крупного события и т. д. Если у вас есть эти данные, вы можете проанализировать риски любого решения, использовать данные для получения большего количества потенциальных клиентов и т. д.

В этой статье мы собираемся парсить публичные страницы Facebook с использованием Python и Selenium.

Что нам нужно перед написанием кода?

Мы будем использовать Python 3.x для этого руководства, и я предполагаю, что вы уже установили его на свой компьютер. Кроме того, нам нужно установить две сторонние библиотеки BeautifulSoup и Selenium.

  • BeautifulSoup — Это поможет нам разбирать сырой HTML и извлекать нужные данные. Он также известен как BS4.
  • Selenium — Это поможет нам отображать веб-сайты с использованием JavaScript.
  • Нам также нужен chromium для отображения веб-сайтов с использованием API Selenium. Вы можете скачать его здесь.

Перед установкой этих библиотек вам нужно создать папку, в которой будете хранить файлы Python.

mkdir facebook

Теперь создайте файл Python внутри этой папки. Вы можете использовать любое имя, а затем, наконец, установите эти библиотеки.

pip install selenium
pip install beautifulsoup4

Что мы будем извлекать со страницы Facebook?

Мы собираемся извлекать адреса, номера телефонов и электронные адреса с нашей целевой страницы.

Сначала мы извлечем исходный HTML с использованием Selenium со страницы Facebook, а затем мы будем использовать методы .find() и .find_all() из BS4 для парсинга этих данных из исходного HTML.

Для загрузки веб-сайта будет использоваться Chromium в сотрудничестве с Selenium.

Парсинг Facebook

Давайте сначала напишем небольшой код, чтобы убедиться, что у нас все работает нормально.

from bs4 import BeautifulSoup
from selenium import webdriver
import time



PATH = 'C:\Program Files (x86)\chromedriver.exe'



l=list()
o={}

target_url = "https://www.facebook.com/involvehealth"


driver=webdriver.Chrome(PATH)

driver.get(target_url)
time.sleep(2)

resp = driver.page_source

driver.close()

Давайте пошагово разберем этот код.

  • Мы импортировали все библиотеки, которые мы установили ранее. Мы также импортировали библиотеку time. Она будет использоваться для ожидания драйвера перед закрытием драйвера Chromium.
  • Затем мы объявили PATH нашего драйвера Chromium. Это путь, где вы сохраняете chromedriver.
  • Один пустой list и object, чтобы хранить данные.
  • target_url содержит страницу, которую мы собираемся парсить.
  • Затем с помощью метода .Chrome() мы создаем экземпляр для отображения веб-сайта.
  • Затем с помощью метода .get() из API Selenium мы открываем целевую страницу.
  • Метод .sleep() приостанавливает выполнение скрипта на две секунды.
  • Затем с помощью .page_source мы собираем все исходный HTML страницы.
  • Метод .close() закрывает экземпляр Chrome.

После запуска этого кода будет открыт экземпляр Chrome, затем будет открыта целевая страница, а затем после ожидания двух секунд экземпляр Chrome будет закрыт. При первом запуске экземпляр Chrome открывается немного медленно, но после двух или трех запусков он будет работать быстрее.

После того, как вы проинспектируете страницу, вы увидите, что раздел вступления, раздел контактной информации и раздел фотогалереи имеют одинаковые имена классов x9f619 x1n2onr6 x1ja2u2z x78zum5 x2lah0s x1qughib x1qjc9v5 xozqiw3 x1q0g3np x1pi30zi x1swvt13 xyamay9 xykv574 xbmpl8g x4cne27 xifccgj с div. Но поскольку для этого руководства наш основной фокус на контактной информации, поэтому мы сосредоточимся на втором теге div.

Давайте найдем этот элемент с помощью метода .find(), предоставленного API BS4.

soup=BeautifulSoup(resp,'html.parser')


items = soup.find_all('div',{'class':'x9f619 x1n2onr6 x1ja2u2z x78zum5 x2lah0s x1qughib x1qjc9v5 xozqiw3 x1q0g3np x1pi30zi x1swvt13 xyamay9 xykv574 xbmpl8g x4cne27 xifccgj'})[1]

Мы создали дерево разбора с помощью BeautifulSoup, и теперь мы собираемся извлечь важные данные из него.

С помощью метода .find_all() мы ищем все теги div с классом x9f619 x1n2onr6 x1ja2u2z x78zum5 x2lah0s x1qughib x1qjc9v5 xozqiw3 x1q0g3np x1pi30zi x1swvt13 xyamay9 xykv574 xbmpl8g x4cne27 xifccgj, а затем мы выбираем второй элемент из списка.

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

Давайте найдем все эти элементы тегов, а затем позже мы будем использовать цикл for, чтобы перебрать каждый из этих элементов и определить, какой элемент что.

allDetails = items.find_all("div",{"class":"x9f619 x1n2onr6 x1ja2u2z x78zum5 x2lah0s x1nhvcw1 x1qjc9v5 xozqiw3 x1q0g3np xyamay9 xykv574 xbmpl8g x4cne27 xifccgj"})

Вот как мы будем определять адрес, номер и электронную почту.

  • Адрес можно определить, если текст содержит более двух запятых.
  • Номер можно определить, если текст содержит более двух тире (-).
  • Электронная почта можно определить, если текст содержит «@».
for contact in allDetails:
    checkaddress = len(contact.text.split(","))
    if(checkaddress>2):
        try:
            o["address"]=contact.text
        except:
            o["address"]=None
        continue

    checknumber = len(contact.text.split("-"))
    if(checknumber>2):
        try:
            o["number"]=contact.text
        except:
            o["number"]=None
        continue

    if('@' in contact.text):
        try:
            o["email"]=contact.text
        except:
            o["email"]=None
        continue

Мы запустили цикл for на переменной allDetails. Затем мы по одному определяем, какой элемент что. Затем, наконец, если они удовлетворяют условию if, мы сохраняем их в объекте o.

В конце вы можете добавить объект o в список l и вывести его.

l.append(o)
print(l)

После запуска этого кода вы получите следующий результат.

[{'address': '603 Hwy 321 N, Bldg 3, Ste 202, Lenoir City, TN, United States, Tennessee', 'number': '+1 865-269-2552', 'email': 'info@involvehealth.com'}]

Полный код

Мы можем внести дополнительные изменения в этот код, чтобы извлечь больше информации со страницы. Но пока код будет выглядеть так.

from bs4 import BeautifulSoup
from selenium import webdriver
import time

PATH = 'C:\Program Files (x86)\chromedriver.exe'

l=list()
o={}

target_url = "https://www.facebook.com/involvehealth"

driver=webdriver.Chrome(PATH)

driver.get(target_url)
time.sleep(5)
resp = driver.page_source
driver.close()

soup=BeautifulSoup(resp,'html.parser')

items = soup.find_all('div',{'class':'x9f619 x1n2onr6 x1ja2u2z x78zum5 x2lah0s x1qughib x1qjc9v5 xozqiw3 x1q0g3np x1pi30zi x1swvt13 xyamay9 xykv574 xbmpl8g x4cne27 xifccgj'})[1]

allDetails = items.find_all("div",{"class":"x9f619 x1n2onr6 x1ja2u2z x78zum5 x2lah0s x1nhvcw1 x1qjc9v5 xozqiw3 x1q0g3np xyamay9 xykv574 xbmpl8g x4cne27 xifccgj"})

for contact in allDetails:
    checkaddress = len(contact.text.split(","))
    if(checkaddress>2):
        try:
            o["address"]=contact.text
        except:
            o["address"]=None
        continue

    checknumber = len(contact.text.split("-"))
    if(checknumber>2):
        try:
            o["number"]=contact.text
        except:
            o["number"]=None
        continue

    if('@' in contact.text):
        try:
            o["email"]=contact.text
        except:
            o["email"]=None
        continue

l.append(o)
print(l)

Заключение

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

Также, если вы планируете проводить парсинг Facebook в большом масштабе, то без использования веб-скрапинг API этот скрипт не будет работать. Facebook заблокирует ваш IP-адрес, и ваша система сбора данных будет заблокирована. Для парсинга миллионов таких записей всегда можно использовать Scrapingdog.

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

Дополнительные ресурсы

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