""" 代码的板块网页接口 """ import json import logging import urllib import requests from utils import tool __tdx_session_data = {} def get_tdx_blocks(code): """ 通达信板块:https://wenda.tdx.com.cn/site/wenda/stock_index.html?message=%E4%B8%9C%E6%96%B9%E9%80%9A%E4%BF%A1%E6%89%80%E5%B1%9E%E6%A6%82%E5%BF%B5 @param code: @return: """ if not __tdx_session_data.get("session"): __tdx_session_data["session"] = requests.Session() __tdx_session_data["session"].get( "https://wenda.tdx.com.cn/TOUCH?Device=Browser&Ip=0.0.0.0&Mac=00-00-00-00-00-00-00-00&Build=WEB&Type=41&Ver=1.0.0&EP=0") session = __tdx_session_data.get("session") try: headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 " "Safari/537.36", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" # "Cookie": f"LST=10; ASPSessionID=" } session.headers.update(headers) data = [{"message": f"{code}的所属概念", "TDXID": "", "wdbk": "", "RANG": "AG", "forward": "1"}] response = session.post("https://wenda.tdx.com.cn/TQL?Entry=NLPSE.StockSelect&RI=", data=json.dumps(data)) response_headers = response.headers if response.status_code == 200: text = response.text result = json.loads(text) # print(result) data = [ {"nlpse_id": result[3][0], "POS": 0, "COUNT": 30, "order_field": "", "dynamic_order": "", "order_flag": "", "timestamps": 0, "op_flag": 1, "screen_type": 1, "RANG": "AG", "forward": "1"}] response = session.post(f"https://wenda.tdx.com.cn/TQL?Entry=NLPSE.NLPQuery&RI={result[0][3]}", data=json.dumps(data)) response.encoding = 'utf-8' if response.status_code == 200: text = response.text print(text) result = json.loads(text) fset = set() if len(result) > 3 and len(result[3]) > 8: fset |= set([x[2:-2] for x in result[3][8].split(";")]) data = [{"sec_code": code, "RANG": "AG"}] response = session.post(f"https://wenda.tdx.com.cn/TQL?Entry=NLPSE.SSTheme&RI=", data=json.dumps(data)) response.encoding = 'utf-8' if response.status_code == 200: text = response.text arr = json.loads(text) if len(arr) > 3: for i in range(3, len(arr)): fset.add(arr[i][2][1:-1]) return fset else: raise Exception(response.text) else: raise Exception(response.text) finally: pass from playwright.sync_api import sync_playwright class THSBlocksApi: __ths_session_data = {} __ths_hexin_v = "AwY2VNcinP6Nq0ia5LnmR52uV_eIZ0ohHKt-hfAv8ikE86itWPeaMew7zofD" def get_ths_blocks(self, code): """ 同花顺板块 @param code: @return: """ if not self.__ths_session_data.get("session"): self.__ths_session_data["session"] = requests.Session() self.__ths_session_data["session"].headers.update({ "content-type": "application/json", "sec-ch-ua": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Google Chrome\";v=\"128\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/128.0.0.0 Safari/537.36 ", "cookie": "other_uid=Ths_iwencai_Xuangu_lqs6bw1f7wshz8rx2c6zrag86ie1r401; ta_random_userid=vtmc00tyg9; " "cid=f35cdfcfd72e8bb1c8e6dbd66fd5df9d1726938491; v=" + self.__ths_hexin_v + "; " "cid" "=f35cdfcfd72e8bb1c8e6dbd66fd5df9d1726938491; ComputerID=f35cdfcfd72e8bb1c8e6dbd66fd5df9d1726938491; WafStatus=0; PHPSESSID=5766f6a83a4ade56ae767161ee9c2990 " }) session = self.__ths_session_data["session"] params = {"source": "Ths_iwencai_Xuangu", "version": "2.0", "query_area": "", "block_list": "", "add_info": "{\"urp" "\":{" "\"scene\":1,\"company\":1,\"business\":1},\"contentType\":\"json\",\"searchInfo\":true}", "question": f"{code}所属板块", "perpage": 50, "page": 1, "secondary_intent": "stock", "log_info": "{\"input_type\":\"typewrite\"}", "rsh": "null"} url = "https://www.iwencai.com/customized/chart/get-robot-data" print(url) response = session.post(url, data=json.dumps(params)) text = response.text index = text.find("\"所属概念\":") if index >= 0: start = text.rfind("{", 0, index) end = text.find("}", index) text = text[start:end + 1] result = json.loads(text) return set(result["所属概念"].split(";")) raise Exception("没有获取到内容:" + text) @classmethod def load_hexin_v(cls): with sync_playwright() as p: # 启动浏览器 browser = p.chromium.launch(headless=True, args=['--disable-blink-features=AutomationControlled']) context = browser.new_context( bypass_csp=True, # 绕过内容安全策略 accept_downloads=True, # 接受下载 ignore_https_errors=True, user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/129.0.0.0 Safari/537.38", viewport={"width": 2000, "height": 720} ) page = context.new_page() page.set_extra_http_headers({ "Accept-Language": "zh-CN,zh;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng," "*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" }) def intercept(route, request): route.continue_() headers = request.headers cookie = headers.get("cookie") if cookie: params = {v.split("=")[0].strip(): v.split("=")[1].strip() for v in cookie.split(";")} try: cls.__ths_hexin_v = params.get("v") print("获取到hexin_v:", cls.__ths_hexin_v) except Exception as e: logging.exception(e) page.route("**/block-detail*", intercept) # 打开网页 page.goto( "https://www.iwencai.com/unifiedwap/result?w=%E7%BE%8E%E7%9A%84%E9%9B%86%E5%9B%A2%E6%89%80%E5%B1%9E%E6%A6%82%E5%BF%B5&querytype=stock") page.wait_for_timeout(4000) # 关闭浏览器 browser.close() # input() pass def get_eastmoney_block(code): """ 获取东方财富板块 @param code: @return: """ params = { "type": "RPT_F10_CORETHEME_BOARDTYPE", "sty": "BOARD_CODE,BOARD_NAME,IS_PRECISE,BOARD_RANK,BOARD_TYPE", "filter": f"(SECUCODE=\"{code}.{'SH' if tool.is_sh_code(code) else 'SZ'}\")", "p": "1", "ps": "", "sr": "1", "st": "BOARD_RANK", "source": "HSF10", "client": "PC", "v": "0734332486357663" } list = [] for k in params: list.append(f"{k}={urllib.parse.quote(params[k])}") url = "https://datacenter.eastmoney.com/securities/api/data/get?" + "&".join(list) response = requests.get(url) if response.status_code == 200: text = response.text print(text) data = json.loads(text) if data["success"]: blocks = [] for x in data["result"]["data"]: # if x["IS_PRECISE"] == "1": blocks.append(x["BOARD_NAME"]) return blocks return None if __name__ == "__main__": pass