#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")