Очистка JS-страниц с помощью selenium / bs4

#python-3.x #selenium-webdriver #beautifulsoup

#python-3.x #selenium-webdriver #beautifulsoup

Вопрос:

Я пытаюсь очистить хэштеги Instagram (нет, я не использую api) с помощью selenium и bs4, но продолжаю получать ошибку:

«Элемент в настоящее время недоступен для взаимодействия и не может быть изменен»

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

 def scrape(browser):

browser.get("https://www.instagram.com/instagram/")
tag = input("Enter a hashtag you would like to search: ")

# ig search bar
search = browser.find_element_by_css_selector('._9x5sw')
if tag != '#':
    search.send_keys('#'   tag)
else:
    search.send_keys(tag)

# scrape IG hash tags
soup = BeautifulSoup(browser.page_source, 'html.parser')
time.sleep(5)
for soup in soup.find_all('a', {'class': '_k2vj6'}):
    print(soup)
  

Ответ №1:

Я смог заставить это работать (используя как firefox, так и phantomjs)

 from selenium import webdriver
from bs4 import BeautifulSoup
import time

if __name__ == '__main__':
    tag = input("Enter a hashtag you would like to search: ")
    url = 'https://www.instagram.com/instagram/'
    driver = webdriver.PhantomJS('<yourPathToPhantomJS>')
    driver.set_window_size(1124, 850)
    # driver = webdriver.Firefox()
    driver.get(url)
    search = driver.find_elements_by_tag_name('input')
    if tag != '#':
        search[0].click()
        search[0].send_keys('#'   tag)
    else:
        search[0].send_keys(tag)
    time.sleep(10)
    html = driver.page_source
    soup = BeautifulSoup(html)
    links = soup.find_all('a', {'class': '_k2vj6'})
    for link in links:
        print(link)
  

Две гниды:

  • Мне пришлось установить размер окна браузера, чтобы он работал в PhantomJS
  • Для нескольких моих тестов пяти секунд было недостаточно для загрузки выпадающего списка.

Комментарии:

1. спасибо, человек сработал! Итак, проблема заключалась в том, что страница загружалась чуть дольше 5 секунд? Также почему индекс [0] в переменной поиска?

2. Если вы использовали PhantomJS, то проблема, вероятно, заключалась в том, что размер окна должен был вызвать что-то на странице, чтобы активировать входной тег. Прежде чем я добавил эту строку, я получал ту же ошибку, что и вы. И индекс [0] при поиске просто потому, что я использовал find_elements_by_tag_name вместо find_element_by_tag_name .

Ответ №2:

Это руководство по созданию живого DOM и загруженного js итак, наслаждайтесь и экономьте свое время на поиске, идея состоит в том, чтобы получить все тело, если вы хотите, чтобы head заменил тело, это будет точно так же, как selenium get.

 options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
dri = webdriver.Chrome(options=options)
html = dri.find_element_by_tag_name("body").get_attribute('innerHTML')
        soup = BeautifulSoup(html, features="lxml")