使用 "Requests-HTML" 库获取交易价格时遇到问题
Trouble getting the trade-price using "Requests-HTML" library
我在 python 中编写了一个脚本,以从 javascript 呈现的网页中获取最后一笔交易的价格。如果我选择 selenium
,我可以获得内容。我的目标是不使用像 selenium
之类的任何浏览器模拟器,因为最新版本的 Requests-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)
这是完整的回溯:
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
Traceback (most recent call last):
File "C:\Users\ar\AppData\Local\Programs\Python\Python36-32\experiment.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:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\shutil.py", line 387, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 5] Access is denied: 'C:\Users\ar\.pyppeteer\.dev_profile\tmp1gng46sw\CrashpadMetrics-active.pma'
我想要的价格在页面顶部可用,可以像这样看到 177.59 EUR Last trade price
。我希望获得 177.59
或任何当前价格。
如果您想通过 运行 Selenium 网页抓取
使用其他方式
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 欧元
你需要它通过 Requests-HTML 吗?在您发布的那一天,回购已经 4 天了,在过去的 3 天内,已经有 50 次提交。一段时间内不会完全稳定。
看这里:
https://github.com/kennethreitz/requests-html/graphs/commit-activity
OTOH,gdax 有一个 API。
https://docs.gdax.com/#market-data
现在,如果您坚决不使用 Py3,GDAX 网站上列出了一个 python 客户端。预先我会提到它是非官方客户;但是,如果您使用它,您将能够快速轻松地从官方 GDAX api.
获得响应
您有几个错误。第一个是 'navigation' 超时,显示页面未完成渲染:
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()
元素 returns None
。它将 HTML 加载到无头 Chromium 浏览器中,将 JavaScript 呈现给该浏览器,然后将页面 HTML 复制回 response.html
数据结构 ,无需返回任何内容。所以 js
设置为 None
,而不是新的 HTML
实例,导致你的下一个回溯。
使用现有的 response.html
对象进行搜索,渲染后:
r.html.render()
item = r.html.find('.MarketInfo_market-num_1lAXs', first=True)
很可能没有这样的 CSS class,因为最后 5 个字符是 生成的在 JSON 数据加载到 AJAX 之后,每个页面呈现。这使得很难使用 CSS 找到有问题的元素。
此外,我发现如果没有睡眠周期,浏览器就没有时间获取AJAX 资源并呈现您想要加载的信息。在复制回 HTML 之前,给它 10 秒的 sleep
做一些工作。如果您看到网络超时,请设置更长的超时时间(默认为 8 秒):
r.html.render(timeout=10, sleep=10)
您也可以将 timeout
设置为 0
,以删除超时并无限期地等待页面加载。
希望a future API update also provides features to wait for network activity to cease.
您可以使用 included parse
library 找到匹配的 CSS classes:
# 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
您上次的回溯表明无法清理 Chromium 用户数据路径。底层 Pyppeteer library 使用临时用户数据路径配置无头 Chromium 浏览器,在您的情况下,该目录包含一些 still-locked 资源。您可以忽略该错误,但稍后您可能想尝试删除 .pyppeteer
文件夹中的所有剩余文件。
我在 python 中编写了一个脚本,以从 javascript 呈现的网页中获取最后一笔交易的价格。如果我选择 selenium
,我可以获得内容。我的目标是不使用像 selenium
之类的任何浏览器模拟器,因为最新版本的 Requests-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)
这是完整的回溯:
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
Traceback (most recent call last):
File "C:\Users\ar\AppData\Local\Programs\Python\Python36-32\experiment.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:\Users\ar\AppData\Local\Programs\Python\Python36-32\lib\shutil.py", line 387, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 5] Access is denied: 'C:\Users\ar\.pyppeteer\.dev_profile\tmp1gng46sw\CrashpadMetrics-active.pma'
我想要的价格在页面顶部可用,可以像这样看到 177.59 EUR Last trade price
。我希望获得 177.59
或任何当前价格。
如果您想通过 运行 Selenium 网页抓取
使用其他方式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 欧元
你需要它通过 Requests-HTML 吗?在您发布的那一天,回购已经 4 天了,在过去的 3 天内,已经有 50 次提交。一段时间内不会完全稳定。
看这里: https://github.com/kennethreitz/requests-html/graphs/commit-activity
OTOH,gdax 有一个 API。
https://docs.gdax.com/#market-data
现在,如果您坚决不使用 Py3,GDAX 网站上列出了一个 python 客户端。预先我会提到它是非官方客户;但是,如果您使用它,您将能够快速轻松地从官方 GDAX api.
获得响应您有几个错误。第一个是 'navigation' 超时,显示页面未完成渲染:
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()
元素 returns None
。它将 HTML 加载到无头 Chromium 浏览器中,将 JavaScript 呈现给该浏览器,然后将页面 HTML 复制回 response.html
数据结构 ,无需返回任何内容。所以 js
设置为 None
,而不是新的 HTML
实例,导致你的下一个回溯。
使用现有的 response.html
对象进行搜索,渲染后:
r.html.render()
item = r.html.find('.MarketInfo_market-num_1lAXs', first=True)
很可能没有这样的 CSS class,因为最后 5 个字符是 生成的在 JSON 数据加载到 AJAX 之后,每个页面呈现。这使得很难使用 CSS 找到有问题的元素。
此外,我发现如果没有睡眠周期,浏览器就没有时间获取AJAX 资源并呈现您想要加载的信息。在复制回 HTML 之前,给它 10 秒的 sleep
做一些工作。如果您看到网络超时,请设置更长的超时时间(默认为 8 秒):
r.html.render(timeout=10, sleep=10)
您也可以将 timeout
设置为 0
,以删除超时并无限期地等待页面加载。
希望a future API update also provides features to wait for network activity to cease.
您可以使用 included parse
library 找到匹配的 CSS classes:
# 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
您上次的回溯表明无法清理 Chromium 用户数据路径。底层 Pyppeteer library 使用临时用户数据路径配置无头 Chromium 浏览器,在您的情况下,该目录包含一些 still-locked 资源。您可以忽略该错误,但稍后您可能想尝试删除 .pyppeteer
文件夹中的所有剩余文件。