Проблема с получением trade-price с помощью библиотеки " Requests-HTML
Я написал скрипт на python, чтобы получить цену последней сделки с веб-страницы JavaScript. Я могу получить контент, если я решу пойти с selenium
. Моя цель здесь не использовать любой симулятор браузера, как selenium
или что-то, потому что последняя версия запросы-HTML-код предполагается иметь возможность анализировать зашифрованное содержимое javascript. Тем не менее, я не в состоянии сделать успешный ход. Когда я запускаю сценарий, я получаю следующую ошибку. Любая помощь по этому поводу будем очень признательны.
адрес сайта : webpage_link
скрипт, с которым я пробовал:
import requests_html
with requests_html.HTMLSession() as session:
r = session.get('https://www.gdax.com/trade/LTC-EUR')
js = r.html.render()
item = js.find('.MarketInfo_market-num_1lAXs',first=True).text
print(item)
это полный traceback:
Exception in callback NavigatorWatcher.waitForNavigation.<locals>.watchdog_cb(<Task finishe...> result=None>) at C:UsersarAppDataLocalProgramsPythonPython36-32libsite-packagespyppeteernavigator_watcher.py:49
handle: <Handle NavigatorWatcher.waitForNavigation.<locals>.watchdog_cb(<Task finishe...> result=None>) at C:UsersarAppDataLocalProgramsPythonPython36-32libsite-packagespyppeteernavigator_watcher.py:49>
Traceback (most recent call last):
File "C:UsersarAppDataLocalProgramsPythonPython36-32libasyncioevents.py", line 145, in _run
self._callback(*self._args)
File "C:UsersarAppDataLocalProgramsPythonPython36-32libsite-packagespyppeteernavigator_watcher.py", line 52, in watchdog_cb
self._timeout)
File "C:UsersarAppDataLocalProgramsPythonPython36-32libsite-packagespyppeteernavigator_watcher.py", line 40, in _raise_error
raise error
concurrent.futures._base.TimeoutError: Navigation Timeout Exceeded: 3000 ms exceeded
Traceback (most recent call last):
File "C:UsersarAppDataLocalProgramsPythonPython36-32experiment.py", line 6, in <module>
item = js.find('.MarketInfo_market-num_1lAXs',first=True).text
AttributeError: 'NoneType' object has no attribute 'find'
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "C:UsersarAppDataLocalProgramsPythonPython36-32libshutil.py", line 387, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 5] Access is denied: 'C:Usersar.pyppeteer.dev_profiletmp1gng46swCrashpadMetrics-active.pma'
цена, которую я ищу, доступна в верхней части страницы, которая может быть видна так 177.59 EUR Last trade price
. Я хочу получить 177.59
или независимо от текущей цены.
3 ответов
у вас есть несколько ошибок. Первый-это тайм-аут "навигации", показывающий, что страница не завершила рендеринг:
Exception in callback NavigatorWatcher.waitForNavigation.<locals>.watchdog_cb(<Task finishe...> result=None>) at C:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyppeteer\navigator_watcher.py:49
handle: <Handle NavigatorWatcher.waitForNavigation.<locals>.watchdog_cb(<Task finishe...> result=None>) at C:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyppeteer\navigator_watcher.py:49>
Traceback (most recent call last):
File "C:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\asyncio\events.py", line 145, in _run
self._callback(*self._args)
File "C:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyppeteer\navigator_watcher.py", line 52, in watchdog_cb
self._timeout)
File "C:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyppeteer\navigator_watcher.py", line 40, in _raise_error
raise error
concurrent.futures._base.TimeoutError: Navigation Timeout Exceeded: 3000 ms exceeded
эта трассировка не вызывается в основном потоке, ваш код не был прерван из-за этого. Ваша страница может быть или не быть полной; Вы можете установить более длительный тайм-аут или ввести цикл сна для браузера, чтобы иметь время для обработки ответов AJAX.
далее response.html.render()
элемент возвращает None
. Он загружает HTML в безголовый браузер Chromium, оставляет рендеринг JavaScript в этом браузере, а затем копирует обратно HTML-страницу в response.html
datasctructure на месте, и ничего не нужно возвращать. Так что js
установлено значение None
, не новый HTML
экземпляр, вызывающий следующую трассировку.
использовать существующей response.html
объект поиска, после рендеринга:
r.html.render()
item = r.html.find('.MarketInfo_market-num_1lAXs', first=True)
здесь скорее всего нет такого класса CSS, потому что последние 5 символов созданный на каждой странице рендеринга после загрузки данных JSON через AJAX. Это затрудняет использование CSS для поиска рассматриваемого элемента.
кроме того, я обнаружил, что без цикла сна браузер не имеет времени для извлечения ресурсов AJAX и отображения информации, которую вы хотели загрузить. Дайте ему, скажем, 10 секунд sleep
выполнить некоторую работу перед копированием HTML. Установить более длительный тайм-аут (по умолчанию 8 секунд) если вы видите сеть тайм-ауты:
r.html.render(timeout=10, sleep=10)
вы можете установить timeout
to 0
тоже, чтобы удалить тайм-аут и просто ждать бесконечно, пока страница не загрузится.
надеюсь будущее обновление API также предоставляет возможности дождитесь прекращения сетевой активности.
вы можете использовать входит parse
библиотека чтобы найти соответствующие классы CSS:
# search for CSS suffixes
suffixes = [r[0] for r in r.html.search_all('MarketInfo_market-num_{:w}')]
for suffix in suffixes:
# for each suffix, find all matching elements with that class
items = r.html.find('.MarketInfo_market-num_{}'.format(suffix))
for item in items:
print(item.text)
теперь мы получаем на выходе произведено:
169.81 EUR
+
1.01 %
18,420 LTC
169.81 EUR
+
1.01 %
18,420 LTC
169.81 EUR
+
1.01 %
18,420 LTC
169.81 EUR
+
1.01 %
18,420 LTC
ваш последний traceback показывает, что путь к пользовательским данным Chromium не может быть очищен. В основе библиотека Pyppeteer настраивает браузер Chromium без головы с временным путем данных пользователя, и в вашем случае каталог содержит некоторый все еще заблокированный ресурс. Вы можете игнорировать ошибку, хотя вы можете попытаться удалить все оставшиеся файлы в .pyppeteer
папка в более позднее время.
в случае, если вы хотите использовать другой способ, запустив Selenium web scraping
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
chrome_path = r"C:\Users\Mike\Desktop\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("https://www.gdax.com/trade/LTC-EUR")
item = driver.find_element_by_xpath('''//span[@class='MarketInfo_market-num_1lAXs']''')
item = item.text
print item
driver.close()
результат: 177.60 EUR
вам нужно это, чтобы пройти через запросы-HTML? В день, когда вы разместили РЕПО, было 4 дня, а в течение 3 дней прошло 50 коммитов. Некоторое время он не будет полностью стабильным.
см. здесь: https://github.com/kennethreitz/requests-html/graphs/commit-activity
OTOH, есть API для gdax.
https://docs.gdax.com/#market-data
теперь, если вы настроены на использование Py3, есть клиент python, указанный на веб-сайте GDAX. Заранее я упомяну, что это неофициальный клиент; однако, если вы используете это, вы сможете быстро и легко получить ответы от официального api GDAX.