Использование запросов 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