Использование запросов python с страницами javascript

Я пытаюсь использовать структуру Requests с python (http://docs.python-requests.org/en/latest/), но на странице, которую я пытаюсь использовать, используется javascript для получения информации, которую я хочу,

Я попытался найти в Интернете решение, но тот факт, что я ищу с ключевым словом javascript, больше всего из того, что я получаю, - это как очистить язык javascript.

Можно ли использовать структуру запросов со страницами, использующими javascript?

Ответы

Ответ 1

Вам нужно будет сделать тот же запрос (используя библиотеку запросов), который делает javascript. Вы можете использовать любое количество инструментов (в том числе встроенных в Chrome и Firefox) для проверки HTTP-запроса, поступающего с javascript, и просто сделать этот запрос самостоятельно с Python.

Ответ 2

В то время как Selenium может показаться заманчивым и полезным, у него есть одна основная проблема, которая не может быть исправлена: производительность. Рассчитывая все, что делает браузер, вам понадобится намного больше энергии. Даже PhantomJS не конкурирует с простым запросом. Я рекомендую вам использовать Selenium только тогда, когда вам действительно нужно нажать кнопки. Если вам нужен только javascript, я рекомендую PyQt (проверьте https://www.youtube.com/watch?v=FSH77vnOGqU, чтобы узнать его).

Однако, если вы хотите использовать Selenium, я рекомендую Chrome поверх PhantomJS. У многих пользователей есть проблемы с PhantomJS, где веб-сайт просто не работает в Phantom. Chrome может быть безголовым (не графическим) тоже!

Сначала убедитесь, что вы установили ChromeDriver, от которого зависит Селен для использования Google Chrome.

Затем убедитесь, что у вас есть Google Chrome версии 60 или выше, проверив его в URL-адресе chrome://settings/help

Теперь вам нужно всего лишь следующий код:

from selenium.webdriver.chrome.options import Options
from selenium import webdriver

chrome_options = Options()
chrome_options.add_argument("--headless")

driver = webdriver.Chrome(chrome_options=chrome_options)

Если вы не знаете, как использовать Selenium, вот краткий обзор:

driver.get("https://www.google.com") #Browser goes to google.com

Поиск элементов: Используйте метод ELEMENTS или ELEMENT. Примеры:

driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
  • driver.find_element (s) _by_css_selector (css_selector) # Каждый элемент, соответствующий этому селектору CSS
  • driver.find_element (s) _by_class_name (class_name) # Каждый элемент со следующим классом
  • driver.find_element (s) _by_id (id) # Каждый элемент со следующим идентификатором
  • driver.find_element (s) _by_link_text (link_text) # Каждый с текстом полной ссылки
  • driver.find_element (s) _by_partial_link_text (partial_link_text) # Каждый с частичным текстом ссылки.
  • driver.find_element (s) _by_name (name) # Каждый элемент, где name = argument
  • driver.find_element (s) _by_tag_name (tag_name) # Каждый элемент с аргументом имени тега

Ok! Я нашел элемент (или список элементов). Но что мне теперь делать?

Вот методы, которые вы можете сделать для элемента elem:

  • elem.tag_name # Может вернуть кнопку в.
  • elem.get_attribute ( "id" ) # Возвращает идентификатор элемента.
  • elem.text # Внутренний текст элемента.
  • elem.clear() # Очищает ввод текста.
  • elem.is_displayed() # True для видимых элементов, False для невидимых элементов.
  • elem.is_enabled() # Истина для разрешенного ввода, False в противном случае.
  • elem.is_selected() # Выбран ли этот переключатель или флажок?
  • elem.location # Словарь, представляющий местоположение X и Y элемента на экране.
  • elem.click() # Нажмите elem.
  • elem.send_keys ( "thelegend27" ) # Введите thelegend27 в elem (полезно для текстовых входов)
  • elem.submit() # Отправить форму, в которой участвует elem.

Специальные команды:

  • driver.back() # Нажмите кнопку "Назад".
  • driver.forward() # Нажмите кнопку "Переслать".
  • driver.refresh() # Обновить страницу.
  • driver.quit() # Закройте браузер, включая все вкладки.
  • foo = driver.execute_script ( "return 'hello';" ) # Выполнить javascript (МОЖЕТ ПРИВЕСТИ К ВОЗВРАТАМ!)

Ответ 3

Хорошие новости: теперь есть модуль запросов, который поддерживает JavaScript: https://pypi.org/project/requests-html/

from requests_html import HTMLSession

session = HTMLSession()

r = session('http://www.yourjspage.com')

r.html.render()  # this call executes the js in the page

Я думаю, что это бонус BeautifulSoup, так что вы можете делать что-то вроде

r.find('#myElementID').text

который возвращает содержимое HTML-элемента, как вы ожидаете.

Ответ 4

Использовать Python Selenium, это довольно легко, и если вам не нравится, что графический браузер открывается, используйте phantomJs с селеном, у меня есть видео на Youtube, показывающее пример использования, поиск "Скремблирование javascript-форм с помощью Python". Канал "KeyStrokes".

Ответ 5

У меня недостаточно репутации, чтобы комментировать, но я хотел бы поделиться своим опытом, используя пакет "questions_html".

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

r.html.render()  # this call executes the js in the page
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 84299992/84299992 [00:18<00:00, 4644126.66it/s]
[W:pyppeteer.chromium_downloader] 
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: .../Library/Application Support/pyppeteer/local-chromium/575458