Проблема с получением 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.

https://github.com/danpaquin/gdax-python