Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AKShare 接口问题报告 currency_hist #2878

Closed
h2y opened this issue Aug 18, 2022 · 6 comments
Closed

AKShare 接口问题报告 currency_hist #2878

h2y opened this issue Aug 18, 2022 · 6 comments
Labels
bug Something isn't working

Comments

@h2y
Copy link

h2y commented Aug 18, 2022

描述遇到的问题

  1. 操作系统版本
  2. Python 版本
  3. AKShare 版本
    8-18 最新版
  4. 接口的名称和代码 currency_hist
  5. 接口报错的截图或代码

这是 文档里面的示例,跑不通:T.T

ak.currency_hist(symbol="usd-jpy", period="每日", start_date="20050101", end_date="20220808")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/akshare/fx/currency_investing.py", line 85, in currency_hist
    code = currency_hist_area_index_name_code(symbol)
  File "/usr/local/lib/python3.9/site-packages/akshare/fx/currency_investing.py", line 56, in currency_hist_area_index_name_code
    data_text = soup.find("script", attrs={"id": "__NEXT_DATA__"}).text
AttributeError: 'NoneType' object has no attribute 'text'
  1. 期望获得的正确结果
@h2y h2y added the bug Something isn't working label Aug 18, 2022
@csfreebird
Copy link

csfreebird commented Aug 18, 2022

这个bug我已经报了3次了,每次都被维护者飞快的close掉。连让我回复确认的机会都不给。
最后我自己重新实现了代码。

贴上我自己的代码

import cfscrape
import pandas as pd
from bs4 import BeautifulSoup


def 补0(str):
    if int(str) < 10:
        return '0' + str
    else:
        return str


def 日期格式补0(str):
    a = str.split('-')
    r = []
    for e in a:
        e2 = 补0(e)
        r.append(e2)
    return '-'.join(r)


def 下载美元人民币离岸汇率():
    """
    日期: 字符串类型, yyyy-MM-dd格式
    返回: dataframe, 五个字段: 日期,收盘价,开盘价,最高价,最低价
    """
    url = "https://cn.investing.com/currencies/usd-cnh-historical-data"
    scraper = cfscrape.create_scraper(delay=10)
    r = scraper.get(url)
    soup = BeautifulSoup(r.text, 'html5lib')

    table = soup.find('table', class_="datatable_table__2Qbdw datatable_table--border__1hROx datatable_table--mobile-basic__2Up9u datatable_table--freeze-column__2e8u1")

    trs = table.tbody.find_all('tr')
    cols = ['日期', '收盘价', '开盘价', '最高价', '最低价', '成交量', '涨跌幅']
    df = pd.DataFrame(columns=cols)
    for tr in trs:
        tds = tr.find_all('td')
        row = []
        for td in tds:
            row.append(str(td.text))
        df.loc[len(df)] = row
    df['日期'] = df['日期'].map(lambda e: 日期格式补0(e))
    df['收盘价'] = df['收盘价'].apply(float)
    df['开盘价'] = df['开盘价'].apply(float)
    df['最高价'] = df['最高价'].apply(float)
    df['最低价'] = df['最低价'].apply(float)
    return df[['日期', '收盘价', '开盘价', '最高价', '最低价']]


df = 下载美元人民币离岸汇率()
print(df)

@Weikoi
Copy link

Weikoi commented Aug 18, 2022

示例代码:
import akshare as ak
import pandas as pd

pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)

if name == 'main':

stock_hot_rank_wc_df = ak.stock_hot_rank_wc(date="20210928")
print(stock_hot_rank_wc_df)

错误栈:

Traceback (most recent call last):
File "D:/Work/PycharmProjects/Alpha/src/crawler/demo.py", line 3, in
import akshare as ak
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\akshare_init_.py", line 2834, in
from akshare.index.index_kq_fz import index_kq_fz
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\akshare\index\index_kq_fz.py", line 11, in
from akshare.utils.ak_session import session
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\akshare\utils\ak_session.py", line 8, in
from requests_cache import CachedSession
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache_init_.py", line 7, in
from .backends import *
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\backends_init_.py", line 7, in
from .base import BaseCache, BaseStorage, DictStorage
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\backends\base.py", line 18, in
from ..serializers import init_serializer
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\serializers_init_.py", line 6, in
from .preconf import (
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\serializers\preconf.py", line 104, in
[bson_preconf_stage, Stage(bson, **_get_bson_functions())],
File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\serializers\pipeline.py", line 27, in init
self.dumps = getattr(obj, dumps) if isinstance(dumps, str) else dumps
AttributeError: module 'bson' has no attribute 'encode'

Process finished with exit code 1

@albertandking
Copy link
Collaborator

https://cn.investing.com/currencies/usd-cnh-historical-data

  1. 开启代理后访问该接口
  2. 暂未发现有该问题

@albertandking
Copy link
Collaborator

这个bug我已经报了3次了,每次都被维护者飞快的close掉。连让我回复确认的机会都不给。 最后我自己重新实现了代码。

贴上我自己的代码

import cfscrape
import pandas as pd
from bs4 import BeautifulSoup


def 补0(str):
    if int(str) < 10:
        return '0' + str
    else:
        return str


def 日期格式补0(str):
    a = str.split('-')
    r = []
    for e in a:
        e2 = 补0(e)
        r.append(e2)
    return '-'.join(r)


def 下载美元人民币离岸汇率():
    """
    日期: 字符串类型, yyyy-MM-dd格式
    返回: dataframe, 五个字段: 日期,收盘价,开盘价,最高价,最低价
    """
    url = "https://cn.investing.com/currencies/usd-cnh-historical-data"
    scraper = cfscrape.create_scraper(delay=10)
    r = scraper.get(url)
    soup = BeautifulSoup(r.text, 'html5lib')

    table = soup.find('table', class_="datatable_table__2Qbdw datatable_table--border__1hROx datatable_table--mobile-basic__2Up9u datatable_table--freeze-column__2e8u1")

    trs = table.tbody.find_all('tr')
    cols = ['日期', '收盘价', '开盘价', '最高价', '最低价', '成交量', '涨跌幅']
    df = pd.DataFrame(columns=cols)
    for tr in trs:
        tds = tr.find_all('td')
        row = []
        for td in tds:
            row.append(str(td.text))
        df.loc[len(df)] = row
    df['日期'] = df['日期'].map(lambda e: 日期格式补0(e))
    df['收盘价'] = df['收盘价'].apply(float)
    df['开盘价'] = df['开盘价'].apply(float)
    df['最高价'] = df['最高价'].apply(float)
    df['最低价'] = df['最低价'].apply(float)
    return df[['日期', '收盘价', '开盘价', '最高价', '最低价']]


df = 下载美元人民币离岸汇率()
print(df)
  1. 未能复现所说的问题;
  2. 在 Win10 和 Mac OS 都已经尝试,在开启代理情况下都可以访问
  3. 英为财情已经对原接口调用方式进行更新,此段代码不能获取历史数据

@albertandking
Copy link
Collaborator

这个bug我已经报了3次了,每次都被维护者飞快的close掉。连让我回复确认的机会都不给。 最后我自己重新实现了代码。

贴上我自己的代码

import cfscrape
import pandas as pd
from bs4 import BeautifulSoup


def 补0(str):
    if int(str) < 10:
        return '0' + str
    else:
        return str


def 日期格式补0(str):
    a = str.split('-')
    r = []
    for e in a:
        e2 = 补0(e)
        r.append(e2)
    return '-'.join(r)


def 下载美元人民币离岸汇率():
    """
    日期: 字符串类型, yyyy-MM-dd格式
    返回: dataframe, 五个字段: 日期,收盘价,开盘价,最高价,最低价
    """
    url = "https://cn.investing.com/currencies/usd-cnh-historical-data"
    scraper = cfscrape.create_scraper(delay=10)
    r = scraper.get(url)
    soup = BeautifulSoup(r.text, 'html5lib')

    table = soup.find('table', class_="datatable_table__2Qbdw datatable_table--border__1hROx datatable_table--mobile-basic__2Up9u datatable_table--freeze-column__2e8u1")

    trs = table.tbody.find_all('tr')
    cols = ['日期', '收盘价', '开盘价', '最高价', '最低价', '成交量', '涨跌幅']
    df = pd.DataFrame(columns=cols)
    for tr in trs:
        tds = tr.find_all('td')
        row = []
        for td in tds:
            row.append(str(td.text))
        df.loc[len(df)] = row
    df['日期'] = df['日期'].map(lambda e: 日期格式补0(e))
    df['收盘价'] = df['收盘价'].apply(float)
    df['开盘价'] = df['开盘价'].apply(float)
    df['最高价'] = df['最高价'].apply(float)
    df['最低价'] = df['最低价'].apply(float)
    return df[['日期', '收盘价', '开盘价', '最高价', '最低价']]


df = 下载美元人民币离岸汇率()
print(df)
  1. 未能复现所说的问题;
  2. 在 Win10 和 Mac OS 都已经尝试,在开启代理情况下都可以访问
  3. 英为财情已经对原接口调用方式进行更新,此段代码不能获取历史数据

示例代码: import akshare as ak import pandas as pd

pd.set_option('display.max_rows',500) pd.set_option('display.max_columns',500) pd.set_option('display.width',1000)

if name == 'main':

stock_hot_rank_wc_df = ak.stock_hot_rank_wc(date="20210928")
print(stock_hot_rank_wc_df)

错误栈:

Traceback (most recent call last): File "D:/Work/PycharmProjects/Alpha/src/crawler/demo.py", line 3, in import akshare as ak File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\akshare__init__.py", line 2834, in from akshare.index.index_kq_fz import index_kq_fz File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\akshare\index\index_kq_fz.py", line 11, in from akshare.utils.ak_session import session File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\akshare\utils\ak_session.py", line 8, in from requests_cache import CachedSession File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache__init__.py", line 7, in from .backends import * File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\backends__init__.py", line 7, in from .base import BaseCache, BaseStorage, DictStorage File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\backends\base.py", line 18, in from ..serializers import init_serializer File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\serializers__init__.py", line 6, in from .preconf import ( File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\serializers\preconf.py", line 104, in [bson_preconf_stage, Stage(bson, **_get_bson_functions())], File "D:\Programs\Anaconda\envs\alpha\lib\site-packages\requests_cache\serializers\pipeline.py", line 27, in init self.dumps = getattr(obj, dumps) if isinstance(dumps, str) else dumps AttributeError: module 'bson' has no attribute 'encode'

Process finished with exit code 1

  1. 接口可以正常访问;
  2. 注意访问的频次,可能会被目标网站屏蔽

@h2y
Copy link
Author

h2y commented Aug 24, 2022

  1. 未能复现所说的问题;
  2. 在 Win10 和 Mac OS 都已经尝试,在开启代理情况下都可以访问
  3. 英为财情已经对原接口调用方式进行更新,此段代码不能获取历史数据
  1. 不存在代理问题,我这里全程墙外网络环境。网页可以打开但接口报错。
  2. 这段代码不再能获取历史数据,建议修改文档中接口定义哈

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants