akshare 1.13.46__py3-none-any.whl → 1.17.99__py3-none-any.whl
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.
- akshare/__init__.py +757 -161
- akshare/air/air_hebei.py +79 -53
- akshare/air/air_zhenqi.py +3 -7
- akshare/air/cons.py +1 -0
- akshare/air/crypto.js +1 -1
- akshare/air/outcrypto.js +1 -1
- akshare/air/sunrise_tad.py +32 -17
- akshare/article/cons.py +1 -0
- akshare/article/epu_index.py +4 -3
- akshare/article/ff_factor.py +19 -8
- akshare/article/fred_md.py +4 -1
- akshare/article/risk_rv.py +3 -8
- akshare/bank/bank_cbirc_2020.py +11 -11
- akshare/bank/cons.py +7 -6
- akshare/bond/bond_buy_back_em.py +228 -0
- akshare/bond/bond_cb_sina.py +1 -0
- akshare/bond/bond_cb_ths.py +17 -9
- akshare/bond/bond_cbond.py +19 -14
- akshare/bond/bond_china.py +38 -39
- akshare/bond/bond_china_money.py +75 -48
- akshare/bond/bond_convert.py +10 -9
- akshare/bond/bond_em.py +37 -17
- akshare/bond/bond_info_cm.py +28 -8
- akshare/bond/bond_issue_cninfo.py +73 -30
- akshare/bond/bond_summary.py +38 -37
- akshare/bond/bond_zh_cov.py +31 -40
- akshare/bond/bond_zh_sina.py +61 -51
- akshare/bond/cons.py +14 -11
- akshare/cal/__init__.py +0 -0
- akshare/cal/rv.py +170 -0
- akshare/cost/cost_living.py +7 -5
- akshare/crypto/__init__.py +1 -1
- akshare/crypto/crypto_bitcoin_cme.py +9 -7
- akshare/crypto/crypto_hold.py +4 -2
- akshare/currency/currency.py +1 -0
- akshare/currency/currency_china_bank_sina.py +11 -6
- akshare/currency/currency_safe.py +7 -6
- akshare/data/__init__.py +1 -1
- akshare/data/cninfo.js +1 -1
- akshare/datasets.py +10 -21
- akshare/economic/cons.py +10 -3
- akshare/economic/macro_australia.py +74 -69
- akshare/economic/macro_bank.py +95 -653
- akshare/economic/macro_canada.py +92 -81
- akshare/economic/macro_china.py +163 -117
- akshare/economic/macro_china_hk.py +0 -1
- akshare/economic/macro_china_nbs.py +24 -7
- akshare/economic/macro_euro.py +103 -56
- akshare/economic/macro_finance_ths.py +135 -0
- akshare/economic/macro_germany.py +1 -1
- akshare/economic/macro_info_ws.py +100 -0
- akshare/economic/macro_japan.py +0 -1
- akshare/economic/macro_other.py +1 -6
- akshare/economic/macro_swiss.py +2 -3
- akshare/economic/macro_uk.py +1 -1
- akshare/economic/macro_usa.py +7 -9
- akshare/economic/marco_cnbs.py +11 -6
- akshare/energy/energy_carbon.py +94 -126
- akshare/energy/energy_oil_em.py +1 -2
- akshare/event/cons.py +1 -0
- akshare/event/migration.py +3 -2
- akshare/exceptions.py +43 -0
- akshare/file_fold/calendar.json +245 -2
- akshare/forex/__init__.py +0 -0
- akshare/forex/cons.py +192 -0
- akshare/forex/forex_em.py +149 -0
- akshare/fortune/fortune_500.py +15 -48
- akshare/fortune/fortune_bloomberg.py +6 -3
- akshare/fortune/fortune_forbes_500.py +3 -6
- akshare/fortune/fortune_hurun.py +2 -1
- akshare/fortune/fortune_xincaifu_500.py +17 -14
- akshare/fund/fund_amac.py +38 -15
- akshare/fund/fund_announcement_em.py +145 -0
- akshare/fund/fund_aum_em.py +49 -35
- akshare/fund/fund_em.py +251 -220
- akshare/fund/fund_etf_em.py +44 -35
- akshare/fund/fund_etf_sina.py +76 -27
- akshare/fund/fund_etf_ths.py +95 -0
- akshare/fund/fund_fee_em.py +172 -0
- akshare/fund/fund_fhsp_em.py +42 -32
- akshare/fund/fund_init_em.py +8 -5
- akshare/fund/fund_lof_em.py +12 -19
- akshare/fund/fund_manager.py +25 -11
- akshare/fund/fund_overview_em.py +42 -0
- akshare/fund/fund_portfolio_em.py +78 -66
- akshare/fund/fund_position_lg.py +19 -8
- akshare/fund/fund_rank_em.py +90 -84
- akshare/fund/fund_rating.py +33 -12
- akshare/fund/fund_report_cninfo.py +63 -48
- akshare/fund/fund_scale_em.py +24 -13
- akshare/fund/fund_scale_sina.py +20 -10
- akshare/fund/fund_xq.py +3 -2
- akshare/futures/cons.py +141 -46
- akshare/futures/cot.py +89 -88
- akshare/futures/futures_basis.py +99 -33
- akshare/futures/futures_comex_em.py +1 -0
- akshare/futures/futures_comm_ctp.py +13 -2
- akshare/futures/futures_contract_detail.py +59 -9
- akshare/futures/futures_daily_bar.py +75 -62
- akshare/futures/futures_foreign.py +14 -8
- akshare/futures/futures_hf_em.py +215 -61
- akshare/futures/futures_hist_em.py +191 -0
- akshare/futures/futures_hq_sina.py +79 -61
- akshare/futures/futures_index_ccidx.py +24 -82
- akshare/futures/futures_inventory_99.py +70 -272
- akshare/futures/futures_inventory_em.py +14 -11
- akshare/futures/futures_news_shmet.py +2 -2
- akshare/futures/futures_roll_yield.py +11 -24
- akshare/futures/futures_rule.py +7 -3
- akshare/futures/futures_rule_em.py +38 -0
- akshare/futures/futures_settlement_price_sgx.py +21 -6
- akshare/futures/futures_stock_js.py +1 -2
- akshare/futures/futures_to_spot.py +43 -39
- akshare/futures/futures_warehouse_receipt.py +53 -48
- akshare/futures/futures_zh_sina.py +4 -4
- akshare/futures/receipt.py +298 -165
- akshare/futures/requests_fun.py +16 -3
- akshare/futures/symbol_var.py +32 -13
- akshare/futures_derivative/cons.py +100 -103
- akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
- akshare/futures_derivative/futures_contract_info_czce.py +2 -0
- akshare/futures_derivative/futures_contract_info_dce.py +43 -17
- akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
- akshare/futures_derivative/futures_contract_info_ine.py +43 -34
- akshare/futures_derivative/futures_contract_info_shfe.py +7 -8
- akshare/futures_derivative/futures_cot_sina.py +28 -19
- akshare/futures_derivative/futures_index_sina.py +25 -13
- akshare/fx/cons.py +12 -7
- akshare/fx/currency_investing.py +19 -285
- akshare/fx/fx_c_swap_cm.py +62 -0
- akshare/fx/fx_quote.py +3 -2
- akshare/fx/fx_quote_baidu.py +2 -1
- akshare/hf/__init__.py +1 -1
- akshare/hf/hf_sp500.py +8 -7
- akshare/index/cons.py +132 -28
- akshare/index/index_cflp.py +29 -26
- akshare/index/index_cni.py +89 -91
- akshare/index/index_cons.py +26 -10
- akshare/index/index_csindex.py +68 -0
- akshare/index/index_cx.py +263 -62
- akshare/index/index_drewry.py +17 -16
- akshare/index/index_eri.py +1 -0
- akshare/index/index_global_em.py +167 -0
- akshare/index/index_global_sina.py +82 -0
- akshare/index/index_kq_fz.py +17 -14
- akshare/index/index_kq_ss.py +1 -0
- akshare/index/index_option_qvix.py +351 -16
- akshare/index/index_research_sw.py +38 -38
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +6 -10
- akshare/index/index_stock_us_sina.py +1 -1
- akshare/index/index_stock_zh.py +193 -101
- akshare/index/index_stock_zh_csindex.py +15 -369
- akshare/index/index_sugar.py +18 -4
- akshare/index/index_sw.py +62 -34
- akshare/index/index_yw.py +53 -75
- akshare/index/index_zh_em.py +15 -82
- akshare/interest_rate/interbank_rate_em.py +14 -10
- akshare/movie/artist_yien.py +32 -5
- akshare/movie/jm.js +0 -1
- akshare/movie/movie_yien.py +92 -18
- akshare/movie/video_yien.py +28 -5
- akshare/news/__init__.py +1 -1
- akshare/news/news_baidu.py +395 -220
- akshare/news/news_cctv.py +38 -38
- akshare/news/news_stock.py +49 -13
- akshare/nlp/nlp_interface.py +7 -8
- akshare/option/cons.py +12 -12
- akshare/option/option_comm_qihuo.py +86 -0
- akshare/option/option_commodity.py +355 -211
- akshare/option/option_commodity_sina.py +22 -26
- akshare/option/option_contract_info_ctp.py +63 -0
- akshare/option/option_current_sse.py +61 -0
- akshare/option/option_current_szse.py +84 -0
- akshare/option/option_czce.py +37 -9
- akshare/option/option_daily_stats_sse_szse.py +145 -0
- akshare/option/option_em.py +4 -8
- akshare/option/option_finance.py +60 -12
- akshare/option/option_finance_sina.py +28 -26
- akshare/option/option_lhb_em.py +62 -57
- akshare/option/option_margin.py +62 -0
- akshare/option/option_premium_analysis_em.py +58 -53
- akshare/option/option_risk_analysis_em.py +11 -8
- akshare/option/option_risk_indicator_sse.py +18 -16
- akshare/option/option_value_analysis_em.py +62 -55
- akshare/other/__init__.py +1 -1
- akshare/other/other_car_cpca.py +20 -20
- akshare/pro/__init__.py +0 -1
- akshare/pro/client.py +6 -4
- akshare/pro/cons.py +3 -2
- akshare/pro/data_pro.py +6 -5
- akshare/qdii/__init__.py +0 -0
- akshare/qdii/qdii_jsl.py +233 -0
- akshare/qhkc/__init__.py +1 -6
- akshare/qhkc/qhkc_api.py +64 -22
- akshare/qhkc_web/__init__.py +1 -6
- akshare/qhkc_web/qhkc_fund.py +10 -6
- akshare/qhkc_web/qhkc_index.py +28 -14
- akshare/qhkc_web/qhkc_tool.py +62 -59
- akshare/rate/__init__.py +1 -1
- akshare/rate/repo_rate.py +36 -32
- akshare/reits/__init__.py +1 -1
- akshare/reits/reits_basic.py +149 -13
- akshare/request.py +117 -0
- akshare/spot/__init__.py +1 -1
- akshare/spot/spot_hog_soozhu.py +232 -0
- akshare/spot/spot_price_qh.py +121 -0
- akshare/spot/spot_sge.py +70 -9
- akshare/stock/cons.py +60 -23
- akshare/stock/stock_allotment_cninfo.py +10 -9
- akshare/stock/stock_ask_bid_em.py +3 -78
- akshare/stock/stock_board_concept_em.py +160 -35
- akshare/stock/stock_board_industry_em.py +163 -70
- akshare/stock/stock_cg_equity_mortgage.py +15 -11
- akshare/stock/stock_cg_guarantee.py +41 -51
- akshare/stock/stock_cg_lawsuit.py +36 -35
- akshare/stock/stock_dividend_cninfo.py +36 -16
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +73 -64
- akshare/stock/stock_fund_hold.py +1 -2
- akshare/stock/stock_gsrl_em.py +1 -0
- akshare/stock/stock_hk_comparison_em.py +175 -0
- akshare/stock/stock_hk_famous.py +107 -0
- akshare/stock/stock_hk_fhpx_ths.py +2 -1
- akshare/stock/stock_hk_hot_rank_em.py +1 -0
- akshare/stock/stock_hk_sina.py +91 -42
- akshare/stock/stock_hold_control_cninfo.py +100 -15
- akshare/stock/stock_hold_control_em.py +4 -5
- akshare/stock/stock_hold_num_cninfo.py +18 -12
- akshare/stock/stock_hot_rank_em.py +4 -1
- akshare/stock/stock_hot_search_baidu.py +32 -19
- akshare/stock/stock_hot_up_em.py +4 -1
- akshare/stock/stock_hsgt_em.py +155 -0
- akshare/stock/stock_industry.py +1 -0
- akshare/stock/stock_industry_cninfo.py +25 -20
- akshare/stock/stock_industry_pe_cninfo.py +45 -31
- akshare/stock/stock_industry_sw.py +5 -9
- akshare/stock/stock_info.py +31 -19
- akshare/stock/stock_info_em.py +17 -11
- akshare/stock/stock_intraday_em.py +9 -80
- akshare/stock/stock_intraday_sina.py +2 -2
- akshare/stock/stock_ipo_summary_cninfo.py +25 -10
- akshare/stock/stock_new_cninfo.py +32 -19
- akshare/stock/stock_news_cx.py +39 -0
- akshare/stock/stock_profile_cninfo.py +9 -8
- akshare/stock/stock_profile_em.py +302 -0
- akshare/stock/stock_rank_forecast.py +8 -6
- akshare/stock/stock_repurchase_em.py +7 -2
- akshare/stock/stock_share_changes_cninfo.py +18 -14
- akshare/stock/stock_share_hold.py +24 -20
- akshare/stock/stock_stop.py +6 -6
- akshare/stock/stock_summary.py +153 -417
- akshare/stock/stock_us_famous.py +19 -11
- akshare/stock/stock_us_js.py +3 -2
- akshare/stock/stock_us_pink.py +38 -27
- akshare/stock/stock_us_sina.py +15 -12
- akshare/stock/stock_weibo_nlp.py +18 -20
- akshare/stock/stock_xq.py +36 -9
- akshare/stock/stock_zh_a_sina.py +58 -80
- akshare/stock/stock_zh_a_special.py +240 -243
- akshare/stock/stock_zh_a_tick_tx.py +11 -3
- akshare/stock/stock_zh_ah_tx.py +23 -26
- akshare/stock/stock_zh_b_sina.py +32 -55
- akshare/stock/stock_zh_comparison_em.py +250 -0
- akshare/stock/stock_zh_kcb_report.py +11 -9
- akshare/stock/stock_zh_kcb_sina.py +67 -64
- akshare/stock_a/__init__.py +0 -0
- akshare/stock_a/stock_board_concept_name_em.py +170 -0
- akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
- akshare/stock_a/stock_zh_a_spot.py +212 -0
- akshare/stock_feature/cons.py +1 -0
- akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
- akshare/stock_feature/stock_a_high_low.py +5 -2
- akshare/stock_feature/stock_a_indicator.py +15 -57
- akshare/stock_feature/stock_a_pe_and_pb.py +39 -9
- akshare/stock_feature/stock_account_em.py +0 -1
- akshare/stock_feature/stock_all_pb.py +2 -1
- akshare/stock_feature/stock_analyst_em.py +36 -30
- akshare/stock_feature/stock_board_concept_ths.py +144 -252
- akshare/stock_feature/stock_board_industry_ths.py +137 -401
- akshare/stock_feature/stock_buffett_index_lg.py +10 -8
- akshare/stock_feature/stock_classify_sina.py +3 -6
- akshare/stock_feature/stock_comment_em.py +81 -144
- akshare/stock_feature/stock_concept_futu.py +183 -0
- akshare/stock_feature/stock_congestion_lg.py +2 -1
- akshare/stock_feature/stock_cyq_em.py +5 -11
- akshare/stock_feature/stock_disclosure_cninfo.py +20 -10
- akshare/stock_feature/stock_dxsyl_em.py +121 -74
- akshare/stock_feature/stock_ebs_lg.py +5 -4
- akshare/stock_feature/stock_esg_sina.py +33 -15
- akshare/stock_feature/stock_fhps_em.py +62 -26
- akshare/stock_feature/stock_fhps_ths.py +34 -7
- akshare/stock_feature/stock_fund_flow.py +38 -25
- akshare/stock_feature/stock_gddh_em.py +19 -11
- akshare/stock_feature/stock_gdfx_em.py +226 -113
- akshare/stock_feature/stock_gdhs.py +75 -50
- akshare/stock_feature/stock_gdzjc_em.py +21 -10
- akshare/stock_feature/stock_gpzy_em.py +78 -46
- akshare/stock_feature/stock_gxl_lg.py +3 -2
- akshare/stock_feature/stock_hist_em.py +158 -237
- akshare/stock_feature/stock_hist_tx.py +13 -10
- akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
- akshare/stock_feature/stock_hot_xq.py +4 -6
- akshare/stock_feature/stock_hsgt_em.py +269 -97
- akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
- akshare/stock_feature/stock_hsgt_min_em.py +13 -16
- akshare/stock_feature/stock_info.py +8 -81
- akshare/stock_feature/stock_inner_trade_xq.py +38 -31
- akshare/stock_feature/stock_irm_cninfo.py +32 -9
- akshare/stock_feature/stock_jgdy_em.py +43 -40
- akshare/stock_feature/stock_lh_yybpm.py +36 -37
- akshare/stock_feature/stock_lhb_em.py +165 -35
- akshare/stock_feature/stock_lhb_sina.py +93 -46
- akshare/stock_feature/stock_margin_em.py +101 -0
- akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -17
- akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +7 -7
- akshare/stock_feature/stock_market_legu.py +4 -2
- akshare/stock_feature/stock_pankou_em.py +71 -35
- akshare/stock_feature/stock_qsjy_em.py +13 -4
- akshare/stock_feature/stock_report_em.py +152 -8
- akshare/stock_feature/stock_research_report_em.py +55 -20
- akshare/stock_feature/stock_sns_sseinfo.py +15 -12
- akshare/stock_feature/stock_sy_em.py +20 -15
- akshare/stock_feature/stock_technology_ths.py +152 -120
- akshare/stock_feature/stock_tfp_em.py +37 -14
- akshare/stock_feature/stock_three_report_em.py +120 -78
- akshare/stock_feature/stock_ttm_lyr.py +18 -9
- akshare/stock_feature/stock_value_em.py +83 -0
- akshare/stock_feature/stock_yjbb_em.py +58 -32
- akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
- akshare/stock_feature/stock_yjyg_em.py +1 -1
- akshare/stock_feature/stock_yzxdr_em.py +24 -22
- akshare/stock_feature/stock_zdhtmx_em.py +20 -6
- akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
- akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
- akshare/stock_feature/stock_ztb_em.py +39 -24
- akshare/stock_fundamental/__init__.py +1 -1
- akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
- akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
- akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +203 -59
- akshare/stock_fundamental/stock_finance_ths.py +524 -57
- akshare/stock_fundamental/stock_finance_us_em.py +268 -0
- akshare/stock_fundamental/stock_gbjg_em.py +80 -0
- akshare/stock_fundamental/stock_hold.py +26 -17
- akshare/stock_fundamental/stock_ipo_declare.py +1 -0
- akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
- akshare/stock_fundamental/stock_kcb_sse.py +26 -25
- akshare/stock_fundamental/stock_notice.py +41 -18
- akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
- akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
- akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
- akshare/stock_fundamental/stock_recommend.py +20 -4
- akshare/stock_fundamental/stock_register_em.py +448 -0
- akshare/stock_fundamental/stock_zygc.py +5 -62
- akshare/tool/trade_date_hist.py +1 -1
- akshare/utils/context.py +43 -0
- akshare/utils/demjson.py +2009 -1338
- akshare/utils/func.py +49 -2
- akshare/utils/multi_decrypt.py +53 -0
- akshare/utils/token_process.py +6 -5
- akshare/utils/tqdm.py +13 -3
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/METADATA +56 -86
- akshare-1.17.99.dist-info/RECORD +409 -0
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
- tests/test_func.py +3 -5
- akshare/bond/bond_futures.py +0 -50
- akshare/bond/bond_investing.py +0 -139
- akshare/crypto/crypto_hist_investing.py +0 -249
- akshare/fortune/fortune_it_juzi.py +0 -123
- akshare/fund/fund_announcement.py +0 -56
- akshare/futures/futures_international.py +0 -170
- akshare/futures/futures_news_baidu.py +0 -54
- akshare/futures/inventory_data.py +0 -100
- akshare/futures_derivative/futures_index_price_nh.py +0 -61
- akshare/futures_derivative/futures_index_return_nh.py +0 -47
- akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
- akshare/futures_derivative/futures_other_index_nh.py +0 -145
- akshare/index/index_fear_greed_funddb.py +0 -78
- akshare/index/index_investing.py +0 -232
- akshare/sport/__init__.py +0 -6
- akshare/sport/sport_olympic.py +0 -27
- akshare/sport/sport_olympic_winter.py +0 -39
- akshare/stock_feature/stock_wencai.py +0 -104
- akshare/stock_fundamental/stock_mda_ym.py +0 -40
- akshare/stock_fundamental/stock_register.py +0 -292
- akshare-1.13.46.dist-info/RECORD +0 -380
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
5
|
-
Desc:
|
|
4
|
+
Date: 2025/2/28 13:20
|
|
5
|
+
Desc: 同花顺-板块-同花顺行业
|
|
6
6
|
https://q.10jqka.com.cn/thshy/
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from datetime import datetime
|
|
10
|
+
from functools import lru_cache
|
|
9
11
|
from io import StringIO
|
|
10
12
|
|
|
11
13
|
import pandas as pd
|
|
12
14
|
import requests
|
|
13
15
|
from bs4 import BeautifulSoup
|
|
14
|
-
|
|
15
|
-
from tqdm import tqdm
|
|
16
|
+
import py_mini_racer
|
|
16
17
|
|
|
17
18
|
from akshare.datasets import get_ths_js
|
|
18
19
|
from akshare.utils import demjson
|
|
20
|
+
from akshare.utils.tqdm import get_tqdm
|
|
19
21
|
|
|
20
22
|
|
|
21
23
|
def _get_file_content_ths(file: str = "ths.js") -> str:
|
|
@@ -27,11 +29,42 @@ def _get_file_content_ths(file: str = "ths.js") -> str:
|
|
|
27
29
|
:rtype: str
|
|
28
30
|
"""
|
|
29
31
|
setting_file_path = get_ths_js(file)
|
|
30
|
-
with open(setting_file_path) as f:
|
|
32
|
+
with open(setting_file_path, encoding="utf-8") as f:
|
|
31
33
|
file_data = f.read()
|
|
32
34
|
return file_data
|
|
33
35
|
|
|
34
36
|
|
|
37
|
+
@lru_cache()
|
|
38
|
+
def _get_stock_board_industry_name_ths() -> dict:
|
|
39
|
+
"""
|
|
40
|
+
获取同花顺行业代码和名称字典
|
|
41
|
+
:return: 获取同花顺行业代码和名称字典
|
|
42
|
+
:rtype: dict
|
|
43
|
+
"""
|
|
44
|
+
js_code = py_mini_racer.MiniRacer()
|
|
45
|
+
js_content = _get_file_content_ths("ths.js")
|
|
46
|
+
js_code.eval(js_content)
|
|
47
|
+
v_code = js_code.call("v")
|
|
48
|
+
headers = {
|
|
49
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
50
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
51
|
+
"Cookie": f"v={v_code}",
|
|
52
|
+
}
|
|
53
|
+
url = "https://q.10jqka.com.cn/thshy/detail/code/881272/"
|
|
54
|
+
r = requests.get(url, headers=headers)
|
|
55
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
56
|
+
code_list = [
|
|
57
|
+
item["href"].split("/")[-2]
|
|
58
|
+
for item in soup.find(name="div", attrs={"class": "cate_inner"}).find_all("a")
|
|
59
|
+
]
|
|
60
|
+
name_list = [
|
|
61
|
+
item.text
|
|
62
|
+
for item in soup.find(name="div", attrs={"class": "cate_inner"}).find_all("a")
|
|
63
|
+
]
|
|
64
|
+
name_code_map = dict(zip(name_list, code_list))
|
|
65
|
+
return name_code_map
|
|
66
|
+
|
|
67
|
+
|
|
35
68
|
def stock_board_industry_name_ths() -> pd.DataFrame:
|
|
36
69
|
"""
|
|
37
70
|
同花顺-板块-行业板块-行业
|
|
@@ -39,317 +72,10 @@ def stock_board_industry_name_ths() -> pd.DataFrame:
|
|
|
39
72
|
:return: 所有行业板块的名称和链接
|
|
40
73
|
:rtype: pandas.DataFrame
|
|
41
74
|
"""
|
|
42
|
-
code_name_ths_map =
|
|
43
|
-
"881101": "种植业与林业",
|
|
44
|
-
"881102": "养殖业",
|
|
45
|
-
"881103": "农产品加工",
|
|
46
|
-
"881104": "农业服务",
|
|
47
|
-
"881105": "煤炭开采加工",
|
|
48
|
-
"881107": "油气开采及服务",
|
|
49
|
-
"881108": "化学原料",
|
|
50
|
-
"881109": "化学制品",
|
|
51
|
-
"881110": "化工合成材料",
|
|
52
|
-
"881112": "钢铁",
|
|
53
|
-
"881114": "金属新材料",
|
|
54
|
-
"881115": "建筑材料",
|
|
55
|
-
"881116": "建筑装饰",
|
|
56
|
-
"881117": "通用设备",
|
|
57
|
-
"881118": "专用设备",
|
|
58
|
-
"881119": "仪器仪表",
|
|
59
|
-
"881120": "电力设备",
|
|
60
|
-
"881121": "半导体及元件",
|
|
61
|
-
"881122": "光学光电子",
|
|
62
|
-
"881123": "其他电子",
|
|
63
|
-
"881124": "消费电子",
|
|
64
|
-
"881125": "汽车整车",
|
|
65
|
-
"881126": "汽车零部件",
|
|
66
|
-
"881127": "非汽车交运",
|
|
67
|
-
"881128": "汽车服务",
|
|
68
|
-
"881129": "通信设备",
|
|
69
|
-
"881130": "计算机设备",
|
|
70
|
-
"881131": "白色家电",
|
|
71
|
-
"881132": "黑色家电",
|
|
72
|
-
"881133": "饮料制造",
|
|
73
|
-
"881134": "食品加工制造",
|
|
74
|
-
"881135": "纺织制造",
|
|
75
|
-
"881136": "服装家纺",
|
|
76
|
-
"881137": "造纸",
|
|
77
|
-
"881138": "包装印刷",
|
|
78
|
-
"881139": "家用轻工",
|
|
79
|
-
"881140": "化学制药",
|
|
80
|
-
"881141": "中药",
|
|
81
|
-
"881142": "生物制品",
|
|
82
|
-
"881143": "医药商业",
|
|
83
|
-
"881144": "医疗器械",
|
|
84
|
-
"881145": "电力",
|
|
85
|
-
"881146": "燃气",
|
|
86
|
-
"881148": "港口航运",
|
|
87
|
-
"881149": "公路铁路运输",
|
|
88
|
-
"881151": "机场航运",
|
|
89
|
-
"881152": "物流",
|
|
90
|
-
"881153": "房地产开发",
|
|
91
|
-
"881155": "银行",
|
|
92
|
-
"881156": "保险及其他",
|
|
93
|
-
"881157": "证券",
|
|
94
|
-
"881158": "零售",
|
|
95
|
-
"881159": "贸易",
|
|
96
|
-
"881160": "景点及旅游",
|
|
97
|
-
"881161": "酒店及餐饮",
|
|
98
|
-
"881162": "通信服务",
|
|
99
|
-
"881163": "计算机应用",
|
|
100
|
-
"881164": "传媒",
|
|
101
|
-
"881165": "综合",
|
|
102
|
-
"881166": "国防军工",
|
|
103
|
-
"881167": "非金属材料",
|
|
104
|
-
"881168": "工业金属",
|
|
105
|
-
"881169": "贵金属",
|
|
106
|
-
"881170": "小金属",
|
|
107
|
-
"881171": "自动化设备",
|
|
108
|
-
"881172": "电子化学品",
|
|
109
|
-
"881173": "小家电",
|
|
110
|
-
"881174": "厨卫电器",
|
|
111
|
-
"881175": "医疗服务",
|
|
112
|
-
"881176": "房地产服务",
|
|
113
|
-
"881177": "互联网电商",
|
|
114
|
-
"881178": "教育",
|
|
115
|
-
"881179": "其他社会服务",
|
|
116
|
-
"881180": "石油加工贸易",
|
|
117
|
-
"881181": "环保",
|
|
118
|
-
"881182": "美容护理",
|
|
119
|
-
"884001": "种子生产",
|
|
120
|
-
"884002": "粮食种植",
|
|
121
|
-
"884003": "其他种植业",
|
|
122
|
-
"884004": "林业",
|
|
123
|
-
"884005": "海洋捕捞",
|
|
124
|
-
"884006": "水产养殖",
|
|
125
|
-
"884007": "畜禽养殖",
|
|
126
|
-
"884008": "饲料",
|
|
127
|
-
"884009": "果蔬加工",
|
|
128
|
-
"884010": "粮油加工",
|
|
129
|
-
"884011": "其他农产品加工",
|
|
130
|
-
"884012": "农业综合",
|
|
131
|
-
"884013": "动物保健",
|
|
132
|
-
"884014": "煤炭开采",
|
|
133
|
-
"884015": "焦炭加工",
|
|
134
|
-
"884016": "油气开采",
|
|
135
|
-
"884018": "油服工程",
|
|
136
|
-
"884020": "石油加工",
|
|
137
|
-
"884021": "油品石化贸易",
|
|
138
|
-
"884022": "纯碱",
|
|
139
|
-
"884023": "氯碱",
|
|
140
|
-
"884024": "无机盐",
|
|
141
|
-
"884025": "其他化学原料",
|
|
142
|
-
"884026": "氮肥",
|
|
143
|
-
"884027": "磷肥及磷化工",
|
|
144
|
-
"884028": "农药",
|
|
145
|
-
"884030": "涂料油墨",
|
|
146
|
-
"884031": "钾肥",
|
|
147
|
-
"884032": "民爆用品",
|
|
148
|
-
"884033": "纺织化学用品",
|
|
149
|
-
"884034": "其他化学制品",
|
|
150
|
-
"884035": "复合肥",
|
|
151
|
-
"884036": "氟化工",
|
|
152
|
-
"884039": "聚氨酯",
|
|
153
|
-
"884041": "涤纶",
|
|
154
|
-
"884043": "粘胶",
|
|
155
|
-
"884044": "其他纤维",
|
|
156
|
-
"884045": "氨纶",
|
|
157
|
-
"884046": "其他塑料制品",
|
|
158
|
-
"884048": "改性塑料",
|
|
159
|
-
"884050": "其他橡胶制品",
|
|
160
|
-
"884051": "炭黑",
|
|
161
|
-
"884052": "普钢",
|
|
162
|
-
"884053": "铝",
|
|
163
|
-
"884054": "铜",
|
|
164
|
-
"884055": "铅锌",
|
|
165
|
-
"884056": "其他金属新材料",
|
|
166
|
-
"884057": "磁性材料",
|
|
167
|
-
"884058": "非金属材料Ⅲ",
|
|
168
|
-
"884059": "玻璃玻纤",
|
|
169
|
-
"884060": "水泥",
|
|
170
|
-
"884062": "其他建材",
|
|
171
|
-
"884063": "耐火材料",
|
|
172
|
-
"884064": "管材",
|
|
173
|
-
"884065": "装饰园林",
|
|
174
|
-
"884066": "房屋建设",
|
|
175
|
-
"884067": "基础建设",
|
|
176
|
-
"884068": "专业工程",
|
|
177
|
-
"884069": "机床工具",
|
|
178
|
-
"884071": "磨具磨料",
|
|
179
|
-
"884073": "制冷空调设备",
|
|
180
|
-
"884074": "其他通用设备",
|
|
181
|
-
"884075": "金属制品",
|
|
182
|
-
"884076": "纺织服装设备",
|
|
183
|
-
"884077": "工程机械",
|
|
184
|
-
"884078": "农用机械",
|
|
185
|
-
"884080": "能源及重型设备",
|
|
186
|
-
"884081": "印刷包装机械",
|
|
187
|
-
"884082": "其他专用设备",
|
|
188
|
-
"884083": "楼宇设备",
|
|
189
|
-
"884084": "环保设备",
|
|
190
|
-
"884085": "电机",
|
|
191
|
-
"884086": "电气自控设备",
|
|
192
|
-
"884088": "输变电设备",
|
|
193
|
-
"884089": "线缆部件及其他",
|
|
194
|
-
"884090": "分立器件",
|
|
195
|
-
"884091": "半导体材料",
|
|
196
|
-
"884092": "印制电路板",
|
|
197
|
-
"884093": "被动元件",
|
|
198
|
-
"884094": "面板",
|
|
199
|
-
"884095": "LED",
|
|
200
|
-
"884096": "光学元件",
|
|
201
|
-
"884098": "消费电子零部件及组装",
|
|
202
|
-
"884099": "乘用车",
|
|
203
|
-
"884100": "商用载货车",
|
|
204
|
-
"884101": "商用载客车",
|
|
205
|
-
"884105": "轨交设备",
|
|
206
|
-
"884106": "其他交运设备",
|
|
207
|
-
"884107": "汽车服务Ⅲ",
|
|
208
|
-
"884112": "冰洗",
|
|
209
|
-
"884113": "空调",
|
|
210
|
-
"884115": "小家电Ⅲ",
|
|
211
|
-
"884116": "其他白色家电",
|
|
212
|
-
"884117": "彩电",
|
|
213
|
-
"884118": "其他黑色家电",
|
|
214
|
-
"884119": "其他酒类",
|
|
215
|
-
"884120": "软饮料",
|
|
216
|
-
"884123": "肉制品",
|
|
217
|
-
"884124": "调味发酵品",
|
|
218
|
-
"884125": "乳品",
|
|
219
|
-
"884126": "其他食品",
|
|
220
|
-
"884128": "棉纺",
|
|
221
|
-
"884130": "印染",
|
|
222
|
-
"884131": "辅料",
|
|
223
|
-
"884132": "其他纺织",
|
|
224
|
-
"884136": "鞋帽及其他",
|
|
225
|
-
"884137": "家纺",
|
|
226
|
-
"884139": "家具",
|
|
227
|
-
"884140": "其他家用轻工",
|
|
228
|
-
"884141": "饰品",
|
|
229
|
-
"884142": "文娱用品",
|
|
230
|
-
"884143": "原料药",
|
|
231
|
-
"884144": "化学制剂",
|
|
232
|
-
"884145": "医疗设备",
|
|
233
|
-
"884146": "火电",
|
|
234
|
-
"884147": "水电",
|
|
235
|
-
"884149": "热力",
|
|
236
|
-
"884150": "新能源发电",
|
|
237
|
-
"884152": "燃气Ⅲ",
|
|
238
|
-
"884153": "港口",
|
|
239
|
-
"884154": "高速公路",
|
|
240
|
-
"884155": "铁路运输",
|
|
241
|
-
"884156": "机场",
|
|
242
|
-
"884157": "航空运输",
|
|
243
|
-
"884158": "多元金融",
|
|
244
|
-
"884159": "保险",
|
|
245
|
-
"884160": "百货零售",
|
|
246
|
-
"884161": "专业连锁",
|
|
247
|
-
"884162": "商业物业经营",
|
|
248
|
-
"884163": "人工景点",
|
|
249
|
-
"884164": "自然景点",
|
|
250
|
-
"884165": "旅游综合",
|
|
251
|
-
"884167": "酒店",
|
|
252
|
-
"884168": "餐饮",
|
|
253
|
-
"884172": "有线电视网络",
|
|
254
|
-
"884173": "通信服务Ⅲ",
|
|
255
|
-
"884174": "软件开发",
|
|
256
|
-
"884176": "出版",
|
|
257
|
-
"884177": "影视院线",
|
|
258
|
-
"884178": "广告营销",
|
|
259
|
-
"884179": "其他传媒",
|
|
260
|
-
"884180": "航天装备",
|
|
261
|
-
"884181": "航空装备",
|
|
262
|
-
"884182": "地面兵装",
|
|
263
|
-
"884183": "航海装备",
|
|
264
|
-
"884184": "特钢",
|
|
265
|
-
"884185": "贵金属Ⅲ",
|
|
266
|
-
"884186": "其他小金属",
|
|
267
|
-
"884188": "白酒",
|
|
268
|
-
"884189": "啤酒",
|
|
269
|
-
"884191": "航运",
|
|
270
|
-
"884192": "仪器仪表Ⅲ",
|
|
271
|
-
"884193": "其他电子Ⅲ",
|
|
272
|
-
"884194": "汽车零部件Ⅲ",
|
|
273
|
-
"884195": "造纸Ⅲ",
|
|
274
|
-
"884197": "中药Ⅲ",
|
|
275
|
-
"884199": "医药商业Ⅲ",
|
|
276
|
-
"884200": "公交",
|
|
277
|
-
"884201": "物流Ⅲ",
|
|
278
|
-
"884202": "住宅开发",
|
|
279
|
-
"884203": "产业地产",
|
|
280
|
-
"884205": "证券Ⅲ",
|
|
281
|
-
"884206": "贸易Ⅲ",
|
|
282
|
-
"884207": "计算机设备Ⅲ",
|
|
283
|
-
"884208": "综合Ⅲ",
|
|
284
|
-
"884209": "钛白粉",
|
|
285
|
-
"884210": "食品及饲料添加剂",
|
|
286
|
-
"884211": "有机硅",
|
|
287
|
-
"884212": "合成树脂",
|
|
288
|
-
"884213": "膜材料",
|
|
289
|
-
"884214": "冶钢原料",
|
|
290
|
-
"884215": "稀土",
|
|
291
|
-
"884216": "能源金属",
|
|
292
|
-
"884217": "工程咨询服务",
|
|
293
|
-
"884218": "机器人",
|
|
294
|
-
"884219": "工控设备",
|
|
295
|
-
"884220": "激光设备",
|
|
296
|
-
"884221": "其他自动化设备",
|
|
297
|
-
"884222": "光伏设备",
|
|
298
|
-
"884223": "风电设备",
|
|
299
|
-
"884224": "电池",
|
|
300
|
-
"884225": "其他电源设备",
|
|
301
|
-
"884226": "集成电路设计",
|
|
302
|
-
"884227": "集成电路制造",
|
|
303
|
-
"884228": "集成电路封测",
|
|
304
|
-
"884229": "半导体设备",
|
|
305
|
-
"884230": "品牌消费电子",
|
|
306
|
-
"884231": "电子化学品Ⅲ",
|
|
307
|
-
"884232": "厨卫电器Ⅲ",
|
|
308
|
-
"884233": "休闲食品",
|
|
309
|
-
"884234": "服装",
|
|
310
|
-
"884235": "印刷",
|
|
311
|
-
"884236": "包装",
|
|
312
|
-
"884237": "瓷砖地板",
|
|
313
|
-
"884238": "血液制品",
|
|
314
|
-
"884239": "疫苗",
|
|
315
|
-
"884240": "其他生物制品",
|
|
316
|
-
"884242": "医疗耗材",
|
|
317
|
-
"884243": "体外诊断",
|
|
318
|
-
"884244": "医疗研发外包",
|
|
319
|
-
"884245": "其他医疗服务",
|
|
320
|
-
"884246": "电能综合服务",
|
|
321
|
-
"884247": "商业地产",
|
|
322
|
-
"884248": "房地产服务Ⅲ",
|
|
323
|
-
"884249": "国有大型银行",
|
|
324
|
-
"884250": "股份制银行",
|
|
325
|
-
"884251": "城商行",
|
|
326
|
-
"884252": "农商行",
|
|
327
|
-
"884253": "其他银行",
|
|
328
|
-
"884254": "旅游零售",
|
|
329
|
-
"884255": "互联网电商Ⅲ",
|
|
330
|
-
"884256": "教育Ⅲ",
|
|
331
|
-
"884257": "专业服务",
|
|
332
|
-
"884258": "体育",
|
|
333
|
-
"884259": "其他社会服务Ⅲ",
|
|
334
|
-
"884260": "游戏",
|
|
335
|
-
"884261": "数字媒体",
|
|
336
|
-
"884262": "通信网络设备及器件",
|
|
337
|
-
"884263": "通信线缆及配套",
|
|
338
|
-
"884264": "通信终端及配件",
|
|
339
|
-
"884265": "其他通信设备",
|
|
340
|
-
"884266": "军工电子",
|
|
341
|
-
"884267": "大气治理",
|
|
342
|
-
"884268": "水务及水治理",
|
|
343
|
-
"884269": "固废治理",
|
|
344
|
-
"884270": "综合环境治理",
|
|
345
|
-
"884271": "个护用品",
|
|
346
|
-
"884272": "化妆品",
|
|
347
|
-
"884273": "医疗美容",
|
|
348
|
-
"884274": "IT服务",
|
|
349
|
-
}
|
|
75
|
+
code_name_ths_map = _get_stock_board_industry_name_ths()
|
|
350
76
|
temp_df = pd.DataFrame.from_dict(code_name_ths_map, orient="index")
|
|
351
77
|
temp_df.reset_index(inplace=True)
|
|
352
|
-
temp_df.columns = ["
|
|
78
|
+
temp_df.columns = ["name", "code"]
|
|
353
79
|
temp_df = temp_df[
|
|
354
80
|
[
|
|
355
81
|
"name",
|
|
@@ -359,62 +85,7 @@ def stock_board_industry_name_ths() -> pd.DataFrame:
|
|
|
359
85
|
return temp_df
|
|
360
86
|
|
|
361
87
|
|
|
362
|
-
def
|
|
363
|
-
"""
|
|
364
|
-
同花顺-板块-行业板块-成份股
|
|
365
|
-
https://q.10jqka.com.cn/thshy/detail/code/881121/
|
|
366
|
-
:param symbol: 板块名称
|
|
367
|
-
:type symbol: str
|
|
368
|
-
:return: 成份股
|
|
369
|
-
:rtype: pandas.DataFrame
|
|
370
|
-
"""
|
|
371
|
-
stock_board_ths_map_df = stock_board_industry_name_ths()
|
|
372
|
-
symbol = stock_board_ths_map_df[stock_board_ths_map_df["name"] == symbol][
|
|
373
|
-
"code"
|
|
374
|
-
].values[0]
|
|
375
|
-
js_code = py_mini_racer.MiniRacer()
|
|
376
|
-
js_content = _get_file_content_ths("ths.js")
|
|
377
|
-
js_code.eval(js_content)
|
|
378
|
-
v_code = js_code.call("v")
|
|
379
|
-
headers = {
|
|
380
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
|
|
381
|
-
"Cookie": f"v={v_code}",
|
|
382
|
-
}
|
|
383
|
-
url = f"http://q.10jqka.com.cn/thshy/detail/field/199112/order/desc/page/1/ajax/1/code/{symbol}"
|
|
384
|
-
r = requests.get(url, headers=headers)
|
|
385
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
386
|
-
try:
|
|
387
|
-
page_num = int(soup.find_all("a", attrs={"class": "changePage"})[-1]["page"])
|
|
388
|
-
except IndexError as e:
|
|
389
|
-
page_num = 1
|
|
390
|
-
big_df = pd.DataFrame()
|
|
391
|
-
for page in tqdm(range(1, page_num + 1), leave=False):
|
|
392
|
-
v_code = js_code.call("v")
|
|
393
|
-
headers = {
|
|
394
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
|
|
395
|
-
"Cookie": f"v={v_code}",
|
|
396
|
-
}
|
|
397
|
-
url = f"http://q.10jqka.com.cn/thshy/detail/field/199112/order/desc/page/{page}/ajax/1/code/{symbol}"
|
|
398
|
-
r = requests.get(url, headers=headers)
|
|
399
|
-
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
400
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
401
|
-
|
|
402
|
-
big_df.rename(
|
|
403
|
-
{
|
|
404
|
-
"涨跌幅(%)": "涨跌幅",
|
|
405
|
-
"涨速(%)": "涨速",
|
|
406
|
-
"换手(%)": "换手",
|
|
407
|
-
"振幅(%)": "振幅",
|
|
408
|
-
},
|
|
409
|
-
inplace=True,
|
|
410
|
-
axis=1,
|
|
411
|
-
)
|
|
412
|
-
del big_df["加自选"]
|
|
413
|
-
big_df["代码"] = big_df["代码"].astype(str).str.zfill(6)
|
|
414
|
-
return big_df
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
def stock_board_industry_info_ths(symbol: str = "半导体及元件") -> pd.DataFrame:
|
|
88
|
+
def stock_board_industry_info_ths(symbol: str = "半导体") -> pd.DataFrame:
|
|
418
89
|
"""
|
|
419
90
|
同花顺-板块-行业板块-板块简介
|
|
420
91
|
http://q.10jqka.com.cn/gn/detail/code/301558/
|
|
@@ -429,17 +100,18 @@ def stock_board_industry_info_ths(symbol: str = "半导体及元件") -> pd.Data
|
|
|
429
100
|
].values[0]
|
|
430
101
|
url = f"http://q.10jqka.com.cn/thshy/detail/code/{symbol_code}/"
|
|
431
102
|
headers = {
|
|
432
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
103
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
104
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
433
105
|
}
|
|
434
106
|
r = requests.get(url, headers=headers)
|
|
435
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
107
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
436
108
|
name_list = [
|
|
437
109
|
item.text.strip()
|
|
438
|
-
for item in soup.find("div", attrs={"class": "board-infos"}).find_all("dt")
|
|
110
|
+
for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dt")
|
|
439
111
|
]
|
|
440
112
|
value_list = [
|
|
441
113
|
item.text.strip().replace("\n", "/")
|
|
442
|
-
for item in soup.find("div", attrs={"class": "board-infos"}).find_all("dd")
|
|
114
|
+
for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dd")
|
|
443
115
|
]
|
|
444
116
|
temp_df = pd.DataFrame([name_list, value_list]).T
|
|
445
117
|
temp_df.columns = ["项目", "值"]
|
|
@@ -447,13 +119,13 @@ def stock_board_industry_info_ths(symbol: str = "半导体及元件") -> pd.Data
|
|
|
447
119
|
|
|
448
120
|
|
|
449
121
|
def stock_board_industry_index_ths(
|
|
450
|
-
symbol: str = "
|
|
122
|
+
symbol: str = "元件",
|
|
451
123
|
start_date: str = "20200101",
|
|
452
124
|
end_date: str = "20240108",
|
|
453
125
|
) -> pd.DataFrame:
|
|
454
126
|
"""
|
|
455
127
|
同花顺-板块-行业板块-指数数据
|
|
456
|
-
https://q.10jqka.com.cn/
|
|
128
|
+
https://q.10jqka.com.cn/thshy/detail/code/881270/
|
|
457
129
|
:param start_date: 开始时间
|
|
458
130
|
:type start_date: str
|
|
459
131
|
:param end_date: 结束时间
|
|
@@ -463,24 +135,31 @@ def stock_board_industry_index_ths(
|
|
|
463
135
|
:return: 指数数据
|
|
464
136
|
:rtype: pandas.DataFrame
|
|
465
137
|
"""
|
|
466
|
-
code_map =
|
|
467
|
-
code_map = dict(zip(code_map["name"].values, code_map["code"].values))
|
|
138
|
+
code_map = _get_stock_board_industry_name_ths()
|
|
468
139
|
symbol_code = code_map[symbol]
|
|
469
140
|
big_df = pd.DataFrame()
|
|
470
141
|
current_year = datetime.now().year
|
|
471
142
|
begin_year = int(start_date[:4])
|
|
143
|
+
tqdm = get_tqdm()
|
|
144
|
+
js_code = py_mini_racer.MiniRacer()
|
|
145
|
+
js_content = _get_file_content_ths("ths.js")
|
|
146
|
+
js_code.eval(js_content)
|
|
147
|
+
v_code = js_code.call("v")
|
|
472
148
|
for year in tqdm(range(begin_year, current_year + 1), leave=False):
|
|
473
|
-
url = f"
|
|
149
|
+
url = f"https://d.10jqka.com.cn/v4/line/bk_{symbol_code}/01/{year}.js"
|
|
474
150
|
headers = {
|
|
475
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
151
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
152
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
476
153
|
"Referer": "http://q.10jqka.com.cn",
|
|
477
154
|
"Host": "d.10jqka.com.cn",
|
|
155
|
+
"Cookie": f"v={v_code}",
|
|
478
156
|
}
|
|
479
157
|
r = requests.get(url, headers=headers)
|
|
480
158
|
data_text = r.text
|
|
159
|
+
|
|
481
160
|
try:
|
|
482
161
|
demjson.decode(data_text[data_text.find("{") : -1])
|
|
483
|
-
except:
|
|
162
|
+
except: # noqa: E722
|
|
484
163
|
continue
|
|
485
164
|
temp_df = demjson.decode(data_text[data_text.find("{") : -1])
|
|
486
165
|
temp_df = pd.DataFrame(temp_df["data"].split(";"))
|
|
@@ -540,6 +219,58 @@ def stock_board_industry_index_ths(
|
|
|
540
219
|
return big_df
|
|
541
220
|
|
|
542
221
|
|
|
222
|
+
def stock_xgsr_ths() -> pd.DataFrame:
|
|
223
|
+
"""
|
|
224
|
+
同花顺-数据中心-新股数据-新股上市首日
|
|
225
|
+
https://data.10jqka.com.cn/ipo/xgsr/
|
|
226
|
+
:return: 新股上市首日
|
|
227
|
+
:rtype: pandas.DataFrame
|
|
228
|
+
"""
|
|
229
|
+
js_code = py_mini_racer.MiniRacer()
|
|
230
|
+
js_content = _get_file_content_ths("ths.js")
|
|
231
|
+
js_code.eval(js_content)
|
|
232
|
+
v_code = js_code.call("v")
|
|
233
|
+
headers = {
|
|
234
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
235
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
236
|
+
"Cookie": f"v={v_code}",
|
|
237
|
+
"hexin-v": v_code,
|
|
238
|
+
}
|
|
239
|
+
url = "https://data.10jqka.com.cn/ipo/xgsr/field/SSRQ/order/desc/page/1/ajax/1/free/1/"
|
|
240
|
+
r = requests.get(url, headers=headers)
|
|
241
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
242
|
+
page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
|
|
243
|
+
big_df = pd.DataFrame()
|
|
244
|
+
tqdm = get_tqdm()
|
|
245
|
+
for page in tqdm(range(1, int(page_num) + 1), leave=False):
|
|
246
|
+
url = f"https://data.10jqka.com.cn/ipo/xgsr/field/SSRQ/order/desc/page/{page}/ajax/1/free/1/"
|
|
247
|
+
v_code = js_code.call("v")
|
|
248
|
+
headers = {
|
|
249
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
250
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
251
|
+
"Cookie": f"v={v_code}",
|
|
252
|
+
"hexin-v": v_code,
|
|
253
|
+
}
|
|
254
|
+
r = requests.get(url, headers=headers)
|
|
255
|
+
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
256
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
257
|
+
|
|
258
|
+
big_df.rename(columns={"发行价(元)": "发行价"}, inplace=True)
|
|
259
|
+
big_df["序号"] = pd.to_numeric(big_df["序号"], errors="coerce")
|
|
260
|
+
big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
|
|
261
|
+
big_df["发行价"] = pd.to_numeric(big_df["发行价"], errors="coerce")
|
|
262
|
+
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
|
|
263
|
+
big_df["首日开盘价"] = pd.to_numeric(big_df["首日开盘价"], errors="coerce")
|
|
264
|
+
big_df["首日收盘价"] = pd.to_numeric(big_df["首日收盘价"], errors="coerce")
|
|
265
|
+
big_df["首日最高价"] = pd.to_numeric(big_df["首日最高价"], errors="coerce")
|
|
266
|
+
big_df["首日最低价"] = pd.to_numeric(big_df["首日最低价"], errors="coerce")
|
|
267
|
+
big_df["首日涨跌幅"] = (
|
|
268
|
+
pd.to_numeric(big_df["首日涨跌幅"].str.strip("%"), errors="coerce") / 100
|
|
269
|
+
)
|
|
270
|
+
big_df["上市日期"] = pd.to_datetime(big_df["上市日期"], errors="coerce").dt.date
|
|
271
|
+
return big_df
|
|
272
|
+
|
|
273
|
+
|
|
543
274
|
def stock_ipo_benefit_ths() -> pd.DataFrame:
|
|
544
275
|
"""
|
|
545
276
|
同花顺-数据中心-新股数据-IPO受益股
|
|
@@ -552,26 +283,29 @@ def stock_ipo_benefit_ths() -> pd.DataFrame:
|
|
|
552
283
|
js_code.eval(js_content)
|
|
553
284
|
v_code = js_code.call("v")
|
|
554
285
|
headers = {
|
|
555
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
286
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
287
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
556
288
|
"Cookie": f"v={v_code}",
|
|
557
289
|
"hexin-v": v_code,
|
|
558
290
|
}
|
|
559
|
-
url =
|
|
291
|
+
url = "https://data.10jqka.com.cn/ipo/syg/field/invest/order/desc/page/1/ajax/1/free/1/"
|
|
560
292
|
r = requests.get(url, headers=headers)
|
|
561
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
562
|
-
page_num = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
|
|
293
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
294
|
+
page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
|
|
563
295
|
big_df = pd.DataFrame()
|
|
296
|
+
tqdm = get_tqdm()
|
|
564
297
|
for page in tqdm(range(1, int(page_num) + 1), leave=False):
|
|
565
|
-
url = f"
|
|
298
|
+
url = f"https://data.10jqka.com.cn/ipo/syg/field/invest/order/desc/page/{page}/ajax/1/free/1/"
|
|
566
299
|
v_code = js_code.call("v")
|
|
567
300
|
headers = {
|
|
568
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
301
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
302
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
569
303
|
"Cookie": f"v={v_code}",
|
|
570
304
|
"hexin-v": v_code,
|
|
571
305
|
}
|
|
572
306
|
r = requests.get(url, headers=headers)
|
|
573
307
|
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
574
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
308
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
575
309
|
|
|
576
310
|
big_df.columns = [
|
|
577
311
|
"序号",
|
|
@@ -606,19 +340,21 @@ def stock_board_industry_summary_ths() -> pd.DataFrame:
|
|
|
606
340
|
js_code.eval(js_content)
|
|
607
341
|
v_code = js_code.call("v")
|
|
608
342
|
headers = {
|
|
609
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
343
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
344
|
+
"Chrome/89.0.4389.90 Safari/537.36",
|
|
610
345
|
"Cookie": f"v={v_code}",
|
|
611
346
|
}
|
|
612
|
-
url =
|
|
347
|
+
url = "http://q.10jqka.com.cn/thshy/index/field/199112/order/desc/page/1/ajax/1/"
|
|
613
348
|
r = requests.get(url, headers=headers)
|
|
614
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
615
|
-
page_num = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
|
|
349
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
350
|
+
page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
|
|
616
351
|
big_df = pd.DataFrame()
|
|
352
|
+
tqdm = get_tqdm()
|
|
617
353
|
for page in tqdm(range(1, int(page_num) + 1), leave=False):
|
|
618
354
|
url = f"http://q.10jqka.com.cn/thshy/index/field/199112/order/desc/page/{page}/ajax/1/"
|
|
619
355
|
r = requests.get(url, headers=headers)
|
|
620
356
|
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
621
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
357
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
622
358
|
|
|
623
359
|
big_df.columns = [
|
|
624
360
|
"序号",
|
|
@@ -650,20 +386,14 @@ if __name__ == "__main__":
|
|
|
650
386
|
stock_board_industry_name_ths_df = stock_board_industry_name_ths()
|
|
651
387
|
print(stock_board_industry_name_ths_df)
|
|
652
388
|
|
|
653
|
-
|
|
654
|
-
print(stock_board_industry_cons_ths_df)
|
|
655
|
-
|
|
656
|
-
stock_board_industry_info_ths_df = stock_board_industry_info_ths(symbol="小家电")
|
|
389
|
+
stock_board_industry_info_ths_df = stock_board_industry_info_ths(symbol="橡胶制品")
|
|
657
390
|
print(stock_board_industry_info_ths_df)
|
|
658
391
|
|
|
659
392
|
stock_board_industry_index_ths_df = stock_board_industry_index_ths(
|
|
660
|
-
symbol="
|
|
393
|
+
symbol="消费电子", start_date="20240101", end_date="20240724"
|
|
661
394
|
)
|
|
662
395
|
print(stock_board_industry_index_ths_df)
|
|
663
396
|
|
|
664
|
-
stock_ipo_benefit_ths_df = stock_ipo_benefit_ths()
|
|
665
|
-
print(stock_ipo_benefit_ths_df)
|
|
666
|
-
|
|
667
397
|
stock_board_industry_summary_ths_df = stock_board_industry_summary_ths()
|
|
668
398
|
print(stock_board_industry_summary_ths_df)
|
|
669
399
|
|
|
@@ -671,3 +401,9 @@ if __name__ == "__main__":
|
|
|
671
401
|
print(stock)
|
|
672
402
|
stock_board_industry_index_ths_df = stock_board_industry_index_ths(symbol=stock)
|
|
673
403
|
print(stock_board_industry_index_ths_df)
|
|
404
|
+
|
|
405
|
+
stock_xgsr_ths_df = stock_xgsr_ths()
|
|
406
|
+
print(stock_xgsr_ths_df)
|
|
407
|
+
|
|
408
|
+
stock_ipo_benefit_ths_df = stock_ipo_benefit_ths()
|
|
409
|
+
print(stock_ipo_benefit_ths_df)
|