mns-common 1.5.2.4__tar.gz → 1.5.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mns-common might be problematic. Click here for more details.
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/PKG-INFO +1 -1
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_stock_a_v2_api.py +103 -7
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_stock_hk_api.py +2 -232
- mns_common-1.5.2.6/mns_common/api/em/real_time/east_money_stock_hk_gtt_api.py +260 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/real_time_quotes_repeat_api.py +68 -1
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/proxies/liu_guan_proxy_api.py +1 -1
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/zt/ths_stock_zt_pool_api.py +8 -4
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/proxies/proxy_common_api.py +6 -2
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common.egg-info/PKG-INFO +1 -1
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common.egg-info/SOURCES.txt +1 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/setup.py +1 -1
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/README.md +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/k_line_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/stock_bid_ask_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/stock_dt_pool.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/stock_zb_pool.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/stock_zt_pool_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/akshare/yjyg_sync_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/concept/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/concept/em_concept_index_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/gd/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/gd/east_money_stock_gdfx_free_top_10_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_debt_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_etf_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_stock_a_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_stock_us_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/hk/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/hk/ths_hk_company_info_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/k_line/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/k_line/stock_k_line_data_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/k_line/stock_minute_data_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/common/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/common/kpl_common_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/common/kpl_common_field_constant.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/concept/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/concept/kpl_concept_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/constant/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/constant/kpl_constant.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/industry/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/industry/kpl_industry_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/selection/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/selection/kpl_selection_plate_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/symbol/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/symbol/kpl_real_time_quotes_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/symbol/kpl_symbol_common_field_constant.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/kpl/symbol/symbol_his_quotes_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/msg/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/msg/push_msg_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/proxies/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/qmt/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/qmt/qmt_minunte_tick_data.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/big_deal/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/big_deal/ths_big_deal_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/company/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/company/company_product_area_industry_index_query.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/company/ths_company_announce_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/company/ths_company_info_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/app/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/app/ths_concept_detail_app.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/app/ths_concept_index_app.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/web/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/web/ths_common_js_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/web/ths_company_info_web.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/web/ths_concept_detail_web.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/concept/web/ths_concept_index_web.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/self_choose/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/self_choose/ths_self_choose_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/wen_cai/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/wen_cai/ths_wen_cai_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/zt/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/ths/zt/ths_stock_zt_pool_v2_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/us/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/us/ths_us_company_info_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/xueqiu/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/xueqiu/xue_qiu_k_line_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/cache/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/cache/cache_service.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/classify/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/classify/symbol_classify_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/classify/symbol_classify_param.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/common_service_fun_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/company/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/company/company_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/company/company_common_service_new_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/concept/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/concept/kpl_concept_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/concept/ths_concept_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/cookie/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/cookie/cookie_enum.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/cookie/cookie_info_service.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/data/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/data/data_init_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/deal/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/deal/deal_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/deal/deal_service_v2_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/deal/terminal_enum.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/em/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/em/em_real_time_quotes_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/em/em_stock_info_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/exception/ExceptionMonitor.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/exception/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/hk/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/hk/company_hk_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/industry/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/industry/ths_industry_index_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/clean/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/clean/k_line_param.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/clean/sh_small_normal_zt_k_line_check_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/common/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/common/k_line_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/patterns/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/patterns/k_line_patterns_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/k_line/patterns/pattern_Enum.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/price/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/price/trade_price_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/proxies/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/qmt/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/qmt/qmt_buy_service.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/real_time/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/real_time/real_time_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/redis_msg/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/redis_msg/redis_msg_publish_service.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/self_choose/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/self_choose/black_list_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/self_choose/self_choose_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/task/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/task/real_time_data_sync_check.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/tfp/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/tfp/stock_tfp_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/trade_date/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/trade_date/trade_date_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/us/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/us/us_stock_etf_info_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/zt/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/component/zt/zt_common_service_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/black_list_classify_enum.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/db_name_constant.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/east_money_stock_api.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/extra_income_db_name.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/price_enum.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/redis_msg_constant.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/self_choose_constant.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/constant/strategy_classify.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/db/MongodbUtil.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/db/MongodbUtilLocal.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/db/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/db/v2/MongodbUtilV2.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/db/v2/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/__init__.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/async_fun.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/cmd_util.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/data_frame_util.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/date_handle_util.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/db_util.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/file_util.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/utils/ip_util.py +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common.egg-info/dependency_links.txt +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common.egg-info/top_level.txt +0 -0
- {mns_common-1.5.2.4 → mns_common-1.5.2.6}/setup.cfg +0 -0
{mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_stock_a_v2_api.py
RENAMED
|
@@ -7,11 +7,21 @@ project_path = file_path[0:end]
|
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
|
|
9
9
|
import requests
|
|
10
|
+
|
|
11
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
10
12
|
import json
|
|
11
|
-
import pandas as pd
|
|
12
|
-
from concurrent.futures import ThreadPoolExecutor
|
|
13
13
|
import datetime
|
|
14
|
+
|
|
15
|
+
import threading
|
|
16
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
17
|
+
import mns_common.component.proxies.proxy_common_api as proxy_common_api
|
|
14
18
|
from loguru import logger
|
|
19
|
+
import concurrent.futures
|
|
20
|
+
import pandas as pd
|
|
21
|
+
import time
|
|
22
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
23
|
+
from threading import Lock
|
|
24
|
+
import mns_common.api.em.real_time.real_time_quotes_repeat_api as real_time_quotes_repeat_api
|
|
15
25
|
|
|
16
26
|
#
|
|
17
27
|
# fields_02 = "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36,f37,f38,f39,f40,f41,f42,f43,f44,f45,f46,f47,f48,f49,f50,f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65,f66,f67,f68,f69,f70,f71,f72,f73,f74,f75,f76,f77,f78,f79,f80,f81,f82,f83,f84,f85,f86,f87,f88,f89,f90,f91,f92,f93,f94,f95,f96,f97,f98,f99,f100,f101,f102,f103,f104,f105,f106,f107,f108" \
|
|
@@ -20,6 +30,8 @@ from loguru import logger
|
|
|
20
30
|
# ",f309,f310,f312,f313,f314,f315,f316,f317,f318,f319,f320,f321,f322,f323,f324,f325,f326,f327,f328,f329,f330,f331,f332,f333,f334,f335,f336,f337,f338,f339,f340,f341,f342,f343,f344,f345,f346,f347,f348,f349,f350,f351,f352,f353,f354,f355,f356,f357,f358,f359,f360,f361,f362,f363,f364,f365,f366,f367,f368,f369,f370,f371,f372,f373,f374,f375,f376,f377,f378,f379,f380,f381,f382,f383,f384,f385,f386,f387,f388,f389,f390,f391,f392,f393,f394,f395,f396,f397,f398,f399,f401"
|
|
21
31
|
|
|
22
32
|
|
|
33
|
+
fs = "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048"
|
|
34
|
+
|
|
23
35
|
fields = ("f2,f3,f5,f6,f8,"
|
|
24
36
|
"f9,f10,f22,f12,f13,"
|
|
25
37
|
"f14,f15,f16,f17,f18,"
|
|
@@ -39,7 +51,7 @@ min_number = 5600
|
|
|
39
51
|
page_number = 100
|
|
40
52
|
|
|
41
53
|
|
|
42
|
-
def get_stock_page_data(pn,
|
|
54
|
+
def get_stock_page_data(pn, proxies, page_number, time_out):
|
|
43
55
|
"""
|
|
44
56
|
获取单页股票数据
|
|
45
57
|
"""
|
|
@@ -53,7 +65,7 @@ def get_stock_page_data(pn, fields, fs, proxies):
|
|
|
53
65
|
params = {
|
|
54
66
|
"cb": "jQuery1124046660442520420653_" + str(current_timestamp_ms),
|
|
55
67
|
"pn": str(pn),
|
|
56
|
-
"pz":
|
|
68
|
+
"pz": str(page_number), # 每页最大200条
|
|
57
69
|
"po": "1",
|
|
58
70
|
"np": "3",
|
|
59
71
|
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
@@ -67,9 +79,9 @@ def get_stock_page_data(pn, fields, fs, proxies):
|
|
|
67
79
|
}
|
|
68
80
|
try:
|
|
69
81
|
if proxies is None:
|
|
70
|
-
r = requests.get(url, params)
|
|
82
|
+
r = requests.get(url, params, timeout=time_out)
|
|
71
83
|
else:
|
|
72
|
-
r = requests.get(url, params, proxies=proxies)
|
|
84
|
+
r = requests.get(url, params, proxies=proxies, timeout=time_out)
|
|
73
85
|
data_text = r.text
|
|
74
86
|
begin_index = data_text.index('[')
|
|
75
87
|
end_index = data_text.index(']')
|
|
@@ -113,7 +125,6 @@ def all_stock_ticker_data_new(fields, fs, proxies) -> pd.DataFrame:
|
|
|
113
125
|
|
|
114
126
|
|
|
115
127
|
def get_all_real_time_quotes(proxies):
|
|
116
|
-
fs = "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048"
|
|
117
128
|
# 获取第一页数据
|
|
118
129
|
page_one_df = get_stock_page_data(1, fields, fs, proxies)
|
|
119
130
|
# 数据接口正常返回5600以上的数量
|
|
@@ -286,6 +297,91 @@ def rename_real_time_quotes_df(temp_df):
|
|
|
286
297
|
return temp_df
|
|
287
298
|
|
|
288
299
|
|
|
300
|
+
def repeated_acquisition_ask_async(time_out, max_number, num_threads, pages_per_thread):
|
|
301
|
+
per_page = page_number
|
|
302
|
+
total_pages = (max_number + per_page - 1) // per_page # 向上取整
|
|
303
|
+
result_df = pd.DataFrame()
|
|
304
|
+
|
|
305
|
+
# 创建线程锁以确保线程安全
|
|
306
|
+
df_lock = Lock()
|
|
307
|
+
|
|
308
|
+
# 计算每个线程处理的页数范围
|
|
309
|
+
def process_page_range(start_page, end_page, thread_id):
|
|
310
|
+
nonlocal result_df
|
|
311
|
+
local_df = pd.DataFrame()
|
|
312
|
+
current_page = start_page
|
|
313
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
314
|
+
|
|
315
|
+
while current_page <= end_page and current_page <= total_pages:
|
|
316
|
+
proxies = {"https": proxy_ip, "http": proxy_ip}
|
|
317
|
+
try:
|
|
318
|
+
page_df = get_stock_page_data(current_page, proxies, page_number, time_out)
|
|
319
|
+
if data_frame_util.is_not_empty(page_df):
|
|
320
|
+
local_df = pd.concat([local_df, page_df])
|
|
321
|
+
logger.info("线程{}获取页面数据成功: {}", thread_id, current_page)
|
|
322
|
+
current_page += 1
|
|
323
|
+
else:
|
|
324
|
+
time.sleep(0.2)
|
|
325
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
326
|
+
logger.info("线程{}获取页面数据失败: {}", thread_id, current_page)
|
|
327
|
+
except BaseException as e:
|
|
328
|
+
time.sleep(1)
|
|
329
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
330
|
+
logger.error("线程{}处理页面{}时发生错误: {}", thread_id, current_page, e)
|
|
331
|
+
|
|
332
|
+
with df_lock:
|
|
333
|
+
result_df = pd.concat([result_df, local_df])
|
|
334
|
+
return len(local_df)
|
|
335
|
+
|
|
336
|
+
# 计算每个线程的页面范围
|
|
337
|
+
page_ranges = []
|
|
338
|
+
for i in range(num_threads):
|
|
339
|
+
start_page = i * pages_per_thread + 1
|
|
340
|
+
end_page = (i + 1) * pages_per_thread
|
|
341
|
+
if start_page > total_pages:
|
|
342
|
+
break
|
|
343
|
+
page_ranges.append((start_page, end_page, i + 1))
|
|
344
|
+
|
|
345
|
+
# 使用线程池执行任务
|
|
346
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
|
|
347
|
+
# 提交所有任务
|
|
348
|
+
futures = [
|
|
349
|
+
executor.submit(process_page_range, start, end, tid)
|
|
350
|
+
for start, end, tid in page_ranges
|
|
351
|
+
]
|
|
352
|
+
|
|
353
|
+
# 等待所有任务完成并获取结果
|
|
354
|
+
results = []
|
|
355
|
+
for future in concurrent.futures.as_completed(futures):
|
|
356
|
+
try:
|
|
357
|
+
result = future.result()
|
|
358
|
+
results.append(result)
|
|
359
|
+
except Exception as e:
|
|
360
|
+
logger.error("线程执行出错: {}", e)
|
|
361
|
+
|
|
362
|
+
return rename_real_time_quotes_df(result_df)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def get_stock_real_time_quotes(time_out, pages_per_thread):
|
|
366
|
+
try_numer = 3
|
|
367
|
+
while try_numer > 0:
|
|
368
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
369
|
+
proxies = {"https": proxy_ip,
|
|
370
|
+
"http": proxy_ip}
|
|
371
|
+
|
|
372
|
+
total_number = real_time_quotes_repeat_api.get_stocks_num(1, proxies, 20, time_out)
|
|
373
|
+
if total_number > 0:
|
|
374
|
+
break
|
|
375
|
+
try_numer = try_numer - 1
|
|
376
|
+
if total_number == 0:
|
|
377
|
+
return pd.DataFrame()
|
|
378
|
+
|
|
379
|
+
total_pages = (max_number + page_number - 1) // page_number # 向上取整
|
|
380
|
+
|
|
381
|
+
num_threads = int((total_pages / pages_per_thread) + 1)
|
|
382
|
+
return repeated_acquisition_ask_async(time_out, max_number, num_threads, pages_per_thread)
|
|
383
|
+
|
|
384
|
+
|
|
289
385
|
# 示例调用
|
|
290
386
|
if __name__ == "__main__":
|
|
291
387
|
number = 1
|
{mns_common-1.5.2.4 → mns_common-1.5.2.6}/mns_common/api/em/real_time/east_money_stock_hk_api.py
RENAMED
|
@@ -230,240 +230,10 @@ def get_hk_real_time_quotes(cookie, proxies):
|
|
|
230
230
|
return page_df
|
|
231
231
|
|
|
232
232
|
|
|
233
|
-
# 获取港股通名单 todo 被封以后替换
|
|
234
|
-
def stock_hk_ggt_components_em(cookie, pn, proxies, page_size, time_out) -> pd.DataFrame:
|
|
235
|
-
"""
|
|
236
|
-
东方财富网-行情中心-港股市场-港股通成份股
|
|
237
|
-
https://quote.eastmoney.com/center/gridlist.html#hk_components
|
|
238
|
-
:return: 港股通成份股
|
|
239
|
-
:rtype: pandas.DataFrame
|
|
240
|
-
"""
|
|
241
|
-
headers = {
|
|
242
|
-
'Cookie': cookie
|
|
243
|
-
}
|
|
244
|
-
url = "https://33.push2.eastmoney.com/api/qt/clist/get"
|
|
245
|
-
params = {
|
|
246
|
-
"pn": str(pn),
|
|
247
|
-
"pz": str(page_size),
|
|
248
|
-
"po": "1",
|
|
249
|
-
"np": "2",
|
|
250
|
-
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
251
|
-
"fltt": "2",
|
|
252
|
-
"fid": "f3",
|
|
253
|
-
"fs": "b:DLMK0146,b:DLMK0144",
|
|
254
|
-
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f23,f24,"
|
|
255
|
-
"f25,f26,f22,f33,f11,f62,f128,f136,f115,f152",
|
|
256
|
-
"_": "1639974456250",
|
|
257
|
-
}
|
|
258
|
-
try:
|
|
259
|
-
if proxies is None:
|
|
260
|
-
r = requests.get(url, params=params, timeout=time_out, headers=headers)
|
|
261
|
-
else:
|
|
262
|
-
r = requests.get(url, params=params, proxies=proxies, timeout=time_out, headers=headers)
|
|
263
|
-
|
|
264
|
-
data_json = r.json()
|
|
265
|
-
temp_df = pd.DataFrame(data_json["data"]["diff"]).T
|
|
266
|
-
temp_df.reset_index(inplace=True)
|
|
267
|
-
temp_df["index"] = temp_df.index + 1
|
|
268
|
-
return temp_df
|
|
269
|
-
except Exception as e:
|
|
270
|
-
logger.error("获取港股通列表:{}", e)
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
def rename_hg_ggt(temp_df):
|
|
274
|
-
temp_df.columns = [
|
|
275
|
-
"序号",
|
|
276
|
-
"-",
|
|
277
|
-
"最新价",
|
|
278
|
-
"涨跌幅",
|
|
279
|
-
"涨跌额",
|
|
280
|
-
"成交量",
|
|
281
|
-
"成交额",
|
|
282
|
-
"-",
|
|
283
|
-
"-",
|
|
284
|
-
"-",
|
|
285
|
-
"-",
|
|
286
|
-
"-",
|
|
287
|
-
"代码",
|
|
288
|
-
"-",
|
|
289
|
-
"名称",
|
|
290
|
-
"最高",
|
|
291
|
-
"最低",
|
|
292
|
-
"今开",
|
|
293
|
-
"昨收",
|
|
294
|
-
"-",
|
|
295
|
-
"-",
|
|
296
|
-
"-",
|
|
297
|
-
"-",
|
|
298
|
-
"-",
|
|
299
|
-
"-",
|
|
300
|
-
"-",
|
|
301
|
-
"-",
|
|
302
|
-
"-",
|
|
303
|
-
"-",
|
|
304
|
-
"-",
|
|
305
|
-
"-",
|
|
306
|
-
"-",
|
|
307
|
-
"-",
|
|
308
|
-
"-",
|
|
309
|
-
"-",
|
|
310
|
-
]
|
|
311
|
-
temp_df = temp_df[
|
|
312
|
-
[
|
|
313
|
-
"序号",
|
|
314
|
-
"代码",
|
|
315
|
-
"名称",
|
|
316
|
-
"最新价",
|
|
317
|
-
"涨跌额",
|
|
318
|
-
"涨跌幅",
|
|
319
|
-
"今开",
|
|
320
|
-
"最高",
|
|
321
|
-
"最低",
|
|
322
|
-
"昨收",
|
|
323
|
-
"成交量",
|
|
324
|
-
"成交额",
|
|
325
|
-
]
|
|
326
|
-
]
|
|
327
|
-
|
|
328
|
-
temp_df = temp_df.rename(columns={
|
|
329
|
-
"序号": "index",
|
|
330
|
-
"代码": "symbol",
|
|
331
|
-
"名称": "name",
|
|
332
|
-
"最新价": "now_price",
|
|
333
|
-
"涨跌额": "range",
|
|
334
|
-
"涨跌幅": "chg",
|
|
335
|
-
"今开": "open",
|
|
336
|
-
"最高": "high",
|
|
337
|
-
"最低": "low",
|
|
338
|
-
"昨收": "yesterday_price",
|
|
339
|
-
"成交额": "amount",
|
|
340
|
-
"成交量": "volume",
|
|
341
|
-
})
|
|
342
|
-
|
|
343
|
-
return temp_df
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
def get_stock_hk_ggt_components_em_count(cookie, pn, proxies, page_size, time_out):
|
|
347
|
-
headers = {
|
|
348
|
-
'Cookie': cookie
|
|
349
|
-
}
|
|
350
|
-
url = "https://33.push2.eastmoney.com/api/qt/clist/get"
|
|
351
|
-
current_timestamp = str(int(round(time.time() * 1000, 0)))
|
|
352
|
-
params = {
|
|
353
|
-
"pn": str(pn),
|
|
354
|
-
"pz": str(page_size),
|
|
355
|
-
"po": "1",
|
|
356
|
-
"np": "2",
|
|
357
|
-
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
358
|
-
"fltt": "2",
|
|
359
|
-
"fid": "f3",
|
|
360
|
-
"fs": "b:DLMK0146,b:DLMK0144",
|
|
361
|
-
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f23,f24,"
|
|
362
|
-
"f25,f26,f22,f33,f11,f62,f128,f136,f115,f152",
|
|
363
|
-
"_": str(current_timestamp),
|
|
364
|
-
}
|
|
365
|
-
try:
|
|
366
|
-
if proxies is None:
|
|
367
|
-
r = requests.get(url, params, timeout=time_out, headers=headers)
|
|
368
|
-
else:
|
|
369
|
-
r = requests.get(url, params, proxies=proxies, timeout=time_out, headers=headers)
|
|
370
|
-
data_json = r.json()
|
|
371
|
-
total_number = int(data_json['data']['total'])
|
|
372
|
-
return total_number
|
|
373
|
-
except Exception as e:
|
|
374
|
-
logger.error("获取港股通列表,实时行情异常:{}", e)
|
|
375
|
-
return 0
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
def repeated_acquisition_ask_hk_gtt_async(em_cookie, time_out, max_number, num_threads, pages_per_thread):
|
|
379
|
-
per_page = page_number
|
|
380
|
-
total_pages = (max_number + per_page - 1) // per_page # 向上取整
|
|
381
|
-
result_df = pd.DataFrame()
|
|
382
|
-
|
|
383
|
-
# 创建线程锁以确保线程安全
|
|
384
|
-
df_lock = Lock()
|
|
385
|
-
|
|
386
|
-
# 计算每个线程处理的页数范围
|
|
387
|
-
def process_page_range(start_page, end_page, thread_id):
|
|
388
|
-
nonlocal result_df
|
|
389
|
-
local_df = pd.DataFrame()
|
|
390
|
-
current_page = start_page
|
|
391
|
-
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
392
|
-
|
|
393
|
-
while current_page <= end_page and current_page <= total_pages:
|
|
394
|
-
proxies = {"https": proxy_ip, "http": proxy_ip}
|
|
395
|
-
try:
|
|
396
|
-
page_df = stock_hk_ggt_components_em(em_cookie, current_page, proxies, page_number, time_out)
|
|
397
|
-
if data_frame_util.is_not_empty(page_df):
|
|
398
|
-
local_df = pd.concat([local_df, page_df])
|
|
399
|
-
logger.info("线程{}获取页面数据成功: {}", thread_id, current_page)
|
|
400
|
-
current_page += 1
|
|
401
|
-
else:
|
|
402
|
-
time.sleep(0.2)
|
|
403
|
-
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
404
|
-
logger.info("线程{}获取页面数据失败: {}", thread_id, current_page)
|
|
405
|
-
except BaseException as e:
|
|
406
|
-
time.sleep(1)
|
|
407
|
-
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
408
|
-
logger.error("线程{}处理页面{}时发生错误: {}", thread_id, current_page, e)
|
|
409
|
-
|
|
410
|
-
with df_lock:
|
|
411
|
-
result_df = pd.concat([result_df, local_df])
|
|
412
|
-
return len(local_df)
|
|
413
|
-
|
|
414
|
-
# 计算每个线程的页面范围
|
|
415
|
-
page_ranges = []
|
|
416
|
-
for i in range(num_threads):
|
|
417
|
-
start_page = i * pages_per_thread + 1
|
|
418
|
-
end_page = (i + 1) * pages_per_thread
|
|
419
|
-
if start_page > total_pages:
|
|
420
|
-
break
|
|
421
|
-
page_ranges.append((start_page, end_page, i + 1))
|
|
422
|
-
|
|
423
|
-
# 使用线程池执行任务
|
|
424
|
-
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
|
|
425
|
-
# 提交所有任务
|
|
426
|
-
futures = [
|
|
427
|
-
executor.submit(process_page_range, start, end, tid)
|
|
428
|
-
for start, end, tid in page_ranges
|
|
429
|
-
]
|
|
430
|
-
|
|
431
|
-
# 等待所有任务完成并获取结果
|
|
432
|
-
results = []
|
|
433
|
-
for future in concurrent.futures.as_completed(futures):
|
|
434
|
-
try:
|
|
435
|
-
result = future.result()
|
|
436
|
-
results.append(result)
|
|
437
|
-
except Exception as e:
|
|
438
|
-
logger.error("线程执行出错: {}", e)
|
|
439
|
-
|
|
440
|
-
return rename_hg_ggt(result_df)
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
# 港股通
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
def get_ggt_real_time_quotes(em_cookie, time_out, pages_per_thread):
|
|
447
|
-
try_numer = 3
|
|
448
|
-
while try_numer > 0:
|
|
449
|
-
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
450
|
-
proxies = {"https": proxy_ip,
|
|
451
|
-
"http": proxy_ip}
|
|
452
|
-
|
|
453
|
-
max_number = get_stock_hk_ggt_components_em_count(em_cookie, 1, proxies, 20, time_out)
|
|
454
|
-
if max_number > 0:
|
|
455
|
-
break
|
|
456
|
-
try_numer = try_numer - 1
|
|
457
|
-
if max_number == 0:
|
|
458
|
-
return pd.DataFrame()
|
|
459
|
-
|
|
460
|
-
total_pages = (max_number + page_number - 1) // page_number # 向上取整
|
|
461
233
|
|
|
462
|
-
num_threads = int((total_pages / pages_per_thread) + 1)
|
|
463
|
-
return repeated_acquisition_ask_hk_gtt_async(em_cookie, time_out, max_number, num_threads, pages_per_thread)
|
|
464
234
|
|
|
465
235
|
|
|
466
236
|
if __name__ == '__main__':
|
|
467
|
-
|
|
468
|
-
test_df = get_ggt_real_time_quotes(
|
|
237
|
+
em_cookie_test = cookie_info_service.get_em_cookie()
|
|
238
|
+
test_df = get_ggt_real_time_quotes(em_cookie_test, 30, 6)
|
|
469
239
|
print(test_df)
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 16
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
|
|
9
|
+
import pandas as pd
|
|
10
|
+
from loguru import logger
|
|
11
|
+
import requests
|
|
12
|
+
import time
|
|
13
|
+
import mns_common.component.proxies.proxy_common_api as proxy_common_api
|
|
14
|
+
import concurrent.futures
|
|
15
|
+
|
|
16
|
+
from threading import Lock
|
|
17
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
18
|
+
|
|
19
|
+
# 分页条数
|
|
20
|
+
page_number = 100
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def rename_hg_ggt(temp_df):
|
|
24
|
+
temp_df.columns = [
|
|
25
|
+
"序号",
|
|
26
|
+
"-",
|
|
27
|
+
"最新价",
|
|
28
|
+
"涨跌幅",
|
|
29
|
+
"涨跌额",
|
|
30
|
+
"成交量",
|
|
31
|
+
"成交额",
|
|
32
|
+
"-",
|
|
33
|
+
"-",
|
|
34
|
+
"-",
|
|
35
|
+
"-",
|
|
36
|
+
"-",
|
|
37
|
+
"代码",
|
|
38
|
+
"-",
|
|
39
|
+
"名称",
|
|
40
|
+
"最高",
|
|
41
|
+
"最低",
|
|
42
|
+
"今开",
|
|
43
|
+
"昨收",
|
|
44
|
+
"-",
|
|
45
|
+
"-",
|
|
46
|
+
"-",
|
|
47
|
+
"-",
|
|
48
|
+
"-",
|
|
49
|
+
"-",
|
|
50
|
+
"-",
|
|
51
|
+
"-",
|
|
52
|
+
"-",
|
|
53
|
+
"-",
|
|
54
|
+
"-",
|
|
55
|
+
"-",
|
|
56
|
+
"-",
|
|
57
|
+
"-",
|
|
58
|
+
"-",
|
|
59
|
+
"-",
|
|
60
|
+
]
|
|
61
|
+
temp_df = temp_df[
|
|
62
|
+
[
|
|
63
|
+
"序号",
|
|
64
|
+
"代码",
|
|
65
|
+
"名称",
|
|
66
|
+
"最新价",
|
|
67
|
+
"涨跌额",
|
|
68
|
+
"涨跌幅",
|
|
69
|
+
"今开",
|
|
70
|
+
"最高",
|
|
71
|
+
"最低",
|
|
72
|
+
"昨收",
|
|
73
|
+
"成交量",
|
|
74
|
+
"成交额",
|
|
75
|
+
]
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
temp_df = temp_df.rename(columns={
|
|
79
|
+
"序号": "index",
|
|
80
|
+
"代码": "symbol",
|
|
81
|
+
"名称": "name",
|
|
82
|
+
"最新价": "now_price",
|
|
83
|
+
"涨跌额": "range",
|
|
84
|
+
"涨跌幅": "chg",
|
|
85
|
+
"今开": "open",
|
|
86
|
+
"最高": "high",
|
|
87
|
+
"最低": "low",
|
|
88
|
+
"昨收": "yesterday_price",
|
|
89
|
+
"成交额": "amount",
|
|
90
|
+
"成交量": "volume",
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
return temp_df
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# 获取港股通个数
|
|
97
|
+
def get_stock_hk_ggt_components_em_count(cookie, pn, proxies, page_size, time_out):
|
|
98
|
+
headers = {
|
|
99
|
+
'Cookie': cookie
|
|
100
|
+
}
|
|
101
|
+
url = "https://33.push2.eastmoney.com/api/qt/clist/get"
|
|
102
|
+
current_timestamp = str(int(round(time.time() * 1000, 0)))
|
|
103
|
+
params = {
|
|
104
|
+
"pn": str(pn),
|
|
105
|
+
"pz": str(page_size),
|
|
106
|
+
"po": "1",
|
|
107
|
+
"np": "2",
|
|
108
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
109
|
+
"fltt": "2",
|
|
110
|
+
"fid": "f3",
|
|
111
|
+
"fs": "b:DLMK0146,b:DLMK0144",
|
|
112
|
+
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f23,f24,"
|
|
113
|
+
"f25,f26,f22,f33,f11,f62,f128,f136,f115,f152",
|
|
114
|
+
"_": str(current_timestamp),
|
|
115
|
+
}
|
|
116
|
+
try:
|
|
117
|
+
if proxies is None:
|
|
118
|
+
r = requests.get(url, params, timeout=time_out, headers=headers)
|
|
119
|
+
else:
|
|
120
|
+
r = requests.get(url, params, proxies=proxies, timeout=time_out, headers=headers)
|
|
121
|
+
data_json = r.json()
|
|
122
|
+
total_number = int(data_json['data']['total'])
|
|
123
|
+
return total_number
|
|
124
|
+
except Exception as e:
|
|
125
|
+
logger.error("获取港股通列表,实时行情异常:{}", e)
|
|
126
|
+
return 0
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# 获取港股通名单 todo 被封以后替换
|
|
130
|
+
def stock_hk_ggt_components_em(cookie, pn, proxies, page_size, time_out) -> pd.DataFrame:
|
|
131
|
+
"""
|
|
132
|
+
东方财富网-行情中心-港股市场-港股通成份股
|
|
133
|
+
https://quote.eastmoney.com/center/gridlist.html#hk_components
|
|
134
|
+
:return: 港股通成份股
|
|
135
|
+
:rtype: pandas.DataFrame
|
|
136
|
+
"""
|
|
137
|
+
headers = {
|
|
138
|
+
'Cookie': cookie
|
|
139
|
+
}
|
|
140
|
+
url = "https://33.push2.eastmoney.com/api/qt/clist/get"
|
|
141
|
+
params = {
|
|
142
|
+
"pn": str(pn),
|
|
143
|
+
"pz": str(page_size),
|
|
144
|
+
"po": "1",
|
|
145
|
+
"np": "2",
|
|
146
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
147
|
+
"fltt": "2",
|
|
148
|
+
"fid": "f3",
|
|
149
|
+
"fs": "b:DLMK0146,b:DLMK0144",
|
|
150
|
+
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f23,f24,"
|
|
151
|
+
"f25,f26,f22,f33,f11,f62,f128,f136,f115,f152",
|
|
152
|
+
"_": "1639974456250",
|
|
153
|
+
}
|
|
154
|
+
try:
|
|
155
|
+
if proxies is None:
|
|
156
|
+
r = requests.get(url, params=params, timeout=time_out, headers=headers)
|
|
157
|
+
else:
|
|
158
|
+
r = requests.get(url, params=params, proxies=proxies, timeout=time_out, headers=headers)
|
|
159
|
+
|
|
160
|
+
data_json = r.json()
|
|
161
|
+
temp_df = pd.DataFrame(data_json["data"]["diff"]).T
|
|
162
|
+
temp_df.reset_index(inplace=True)
|
|
163
|
+
temp_df["index"] = temp_df.index + 1
|
|
164
|
+
return temp_df
|
|
165
|
+
except Exception as e:
|
|
166
|
+
logger.error("获取港股通列表:{}", e)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def repeated_acquisition_ask_hk_gtt_async(em_cookie, time_out, max_number, num_threads, pages_per_thread):
|
|
170
|
+
per_page = page_number
|
|
171
|
+
total_pages = (max_number + per_page - 1) // per_page # 向上取整
|
|
172
|
+
result_df = pd.DataFrame()
|
|
173
|
+
|
|
174
|
+
# 创建线程锁以确保线程安全
|
|
175
|
+
df_lock = Lock()
|
|
176
|
+
|
|
177
|
+
# 计算每个线程处理的页数范围
|
|
178
|
+
def process_page_range(start_page, end_page, thread_id):
|
|
179
|
+
nonlocal result_df
|
|
180
|
+
local_df = pd.DataFrame()
|
|
181
|
+
current_page = start_page
|
|
182
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
183
|
+
|
|
184
|
+
while current_page <= end_page and current_page <= total_pages:
|
|
185
|
+
proxies = {"https": proxy_ip, "http": proxy_ip}
|
|
186
|
+
try:
|
|
187
|
+
page_df = stock_hk_ggt_components_em(em_cookie, current_page, proxies, page_number, time_out)
|
|
188
|
+
if data_frame_util.is_not_empty(page_df):
|
|
189
|
+
local_df = pd.concat([local_df, page_df])
|
|
190
|
+
logger.info("线程{}获取页面数据成功: {}", thread_id, current_page)
|
|
191
|
+
current_page += 1
|
|
192
|
+
else:
|
|
193
|
+
time.sleep(0.2)
|
|
194
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
195
|
+
logger.info("线程{}获取页面数据失败: {}", thread_id, current_page)
|
|
196
|
+
except BaseException as e:
|
|
197
|
+
time.sleep(1)
|
|
198
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
199
|
+
logger.error("线程{}处理页面{}时发生错误: {}", thread_id, current_page, e)
|
|
200
|
+
|
|
201
|
+
with df_lock:
|
|
202
|
+
result_df = pd.concat([result_df, local_df])
|
|
203
|
+
return len(local_df)
|
|
204
|
+
|
|
205
|
+
# 计算每个线程的页面范围
|
|
206
|
+
page_ranges = []
|
|
207
|
+
for i in range(num_threads):
|
|
208
|
+
start_page = i * pages_per_thread + 1
|
|
209
|
+
end_page = (i + 1) * pages_per_thread
|
|
210
|
+
if start_page > total_pages:
|
|
211
|
+
break
|
|
212
|
+
page_ranges.append((start_page, end_page, i + 1))
|
|
213
|
+
|
|
214
|
+
# 使用线程池执行任务
|
|
215
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
|
|
216
|
+
# 提交所有任务
|
|
217
|
+
futures = [
|
|
218
|
+
executor.submit(process_page_range, start, end, tid)
|
|
219
|
+
for start, end, tid in page_ranges
|
|
220
|
+
]
|
|
221
|
+
|
|
222
|
+
# 等待所有任务完成并获取结果
|
|
223
|
+
results = []
|
|
224
|
+
for future in concurrent.futures.as_completed(futures):
|
|
225
|
+
try:
|
|
226
|
+
result = future.result()
|
|
227
|
+
results.append(result)
|
|
228
|
+
except Exception as e:
|
|
229
|
+
logger.error("线程执行出错: {}", e)
|
|
230
|
+
|
|
231
|
+
return rename_hg_ggt(result_df)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
# 港股通实时行情
|
|
235
|
+
def get_ggt_real_time_quotes(em_cookie, time_out, pages_per_thread):
|
|
236
|
+
try_numer = 3
|
|
237
|
+
while try_numer > 0:
|
|
238
|
+
proxy_ip = proxy_common_api.generate_proxy_ip_api(1)
|
|
239
|
+
proxies = {"https": proxy_ip,
|
|
240
|
+
"http": proxy_ip}
|
|
241
|
+
|
|
242
|
+
max_number = get_stock_hk_ggt_components_em_count(em_cookie, 1, proxies, 20, time_out)
|
|
243
|
+
if max_number > 0:
|
|
244
|
+
break
|
|
245
|
+
try_numer = try_numer - 1
|
|
246
|
+
if max_number == 0:
|
|
247
|
+
return pd.DataFrame()
|
|
248
|
+
|
|
249
|
+
total_pages = (max_number + page_number - 1) // page_number # 向上取整
|
|
250
|
+
|
|
251
|
+
num_threads = int((total_pages / pages_per_thread) + 1)
|
|
252
|
+
return repeated_acquisition_ask_hk_gtt_async(em_cookie, time_out, max_number, num_threads, pages_per_thread)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
import mns_common.component.cookie.cookie_info_service as cookie_info_service
|
|
256
|
+
|
|
257
|
+
if __name__ == '__main__':
|
|
258
|
+
em_cookie_test = cookie_info_service.get_em_cookie()
|
|
259
|
+
test_df = get_ggt_real_time_quotes(em_cookie_test, 30, 6)
|
|
260
|
+
print(test_df)
|