1

Тема: парсинг рекламних постів facebook

Потрібно парсити рекламні пости з стрічки новин facebook.
Вирішив зробити авторизацію через selenium і разом з тим парсити ним же.
З авторизацією проблем не виникло, а от з парсингом...

from selenium import webdriver
from time import sleep

def authorization():
    usr = input('Enter Email Id: ')
    pwd = input('Enter Password: ')

    username_box = driver.find_element_by_id('email')
    username_box.send_keys(usr)
    sleep(3)

    password_box = driver.find_element_by_id('pass')
    password_box.send_keys(pwd)
    sleep(1)

    login_box = driver.find_element_by_id('loginbutton')
    login_box.click()
    sleep(2)

driver = webdriver.Firefox(executable_path="/home/eff1c/project/parser_fb/geckodriver") # була помилка з geckodriver, тому мусив його встановити і вказати шлях до нього
driver.get('https://www.facebook.com/') # переходим на FB
sleep(3)

authorization()

arr_post = driver.find_elements_by_class_name('_1dwg _1w_m _q7o') # дістаєм всі пости з стрічки
print(arr_post)
arr_advertising = [ads for ads in arr_post if ads.find_element_by_xpath('//div[@class="_5pcp _5lel _2jyu _232_"]/a')] # вибираємо серед постів рекламу
print(arr_advertising)

input('Press anything to quit ')
driver.quit()
print("Finished")

Спочатку збираю всі пости (по класу "_1dwg _1w_m _q7o")
При варіанті:

arr_post = driver.find_elements_by_class_name('_1dwg _1w_m _q7o')

Повертає пустий список. А якщо шукати через xpath то повертає щось типу:

[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="a5a75724-17e9-413c-af4d-fce6a0fea62d", element="27fa7d68-f8ef-447c-ac39-ec71649ef895")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="a5a75724-17e9-413c-af4d-fce6a0fea62d", element="32c1f50a-ba80-4cea-b100-8b6cab528a55")>]

А рекламні серед них вибирав по тому, що у рекламних в тезі div з класом "_5pcp _5lel _2jyu _232_" є два тега <a> i тег <span>, а у звичайних тега <a> немає:

if ads.find_element_by_xpath('//div[@class="_5pcp _5lel _2jyu _232_"]/a')

Якщо шукав пости через xpath, то повертає аналогічний список, нічого не відфільтровувавши. Міг би спробувати не через xpath, але немає сенсу так як на вхід буде пустий список.
Зараз спробую парсити через bs4, але хотілося б дізнатись що тут не так.

2

Re: парсинг рекламних постів facebook

Вони з AdBlocker-ами воюють, ви ніц не вдієте. Навіть якщо ви знайдете сьогодні конкретну ознаку реклами, завтра вона може повністю змінитися.

Подякували: Eff1c, ostap34PHP, /KIT\3

3

Re: парсинг рекламних постів facebook

koala написав:

Вони з AdBlocker-ами воюють, ви ніц не вдієте. Навіть якщо ви знайдете сьогодні конкретну ознаку реклами, завтра вона може повністю змінитися.

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

4

Re: парсинг рекламних постів facebook

Все-таки строка

arr_post = driver.find_elements_by_xpath('//div[@class="_1dwg _1w_m _q7o"]')

працює правильно
Залишається лише проблема з відсіювання не рекламних постів.

arr_advertising = [ads for ads in arr_post if ads.find_element_by_xpath('//div[@class="_5pcp _5lel _2jyu _232_"]/a')]

Що тут може бути не так? *SCRATCH*

5

Re: парсинг рекламних постів facebook

А попробуйте може в лоб. find_element(By.PARTIAL_LINK_TEXT)

6

Re: парсинг рекламних постів facebook

pluszz написав:

А попробуйте може в лоб. find_element(By.PARTIAL_LINK_TEXT)

Була така ідея)
А якщо браузер буде не в українській розкладці і link_text буде не "Реклама"?
Передбачити можливу англійську розкладку і перевірити ще на слово "advertasing" (чи як там воно підписується в фейсбуці)?
І, до речі, в фейсбуці можна робити текст з посиланням? Якщо так, то можуть бути звичайні пости, в яких опис чи будь-який текст містить слово "реклама" з посиланням.

7

Re: парсинг рекламних постів facebook

Поки що зробив так:

arr_post = driver.find_elements_by_xpath('//div[@class="_1dwg _1w_m _q7o"]') # дістаєм всі пости з стрічки
arr_post = [i.get_attribute("outerHTML") for i in arr_post] # переводим кожен пост в html

driver.quit() # закриваєм вкладку

arr_advertising = [ads for ads in arr_post if "Реклама</a>" in ads or "Advertising</a>" in ads]  # вибираємо серед постів рекламу

Помилок, поки що, не було.

Подякували: pluszz1