tkfy920 / qstock

qstock由“Python金融量化”公众号开发,试图打造成个人量化投研分析包,目前包括数据获取(data)、可视化(plot)、选股(stock)和量化回测(策略backtest)模块。 qstock将为用户提供简洁的数据接口和规整化后的金融市场数据。可视化模块为用户提供基于web的交互图形的简单接口; 选股模块提供了同花顺的选股数据和自定义选股,包括RPS、MM趋势、财务指标、资金流模型等; 回测模块为大家提供向量化(基于pandas)和基于事件驱动的基本框架和模型。 关注“Python金融量化“微信公众号,获取更多应用信息。
MIT License
829 stars 228 forks source link

爬取数据不完整问题--附解决方式 #7

Open libeiheng opened 1 year ago

libeiheng commented 1 year ago

1.使用现象: 使用时如果遇到概念分类抓取不完整,以及某类概念成员股抓取不完整,可能是因为多页数据,只抓取了一页引起的.行业分类也有此类情况.

2.分析说明: 以industry.py中ths_concept_member为例.该方法主要是抓取同花顺概念股成员.比如'证金持股'有200多支股票,'熊去胆氧酸'有20多支股票.但原文只能抓取首页信息.不能翻页抓取其他页信息.

3.尝试改进: 将URL中的{page}放到for循环内,实现翻页功能.代码更新如下.其中#部分是原文,

def ths_concept_member(code= "阿里巴巴概念"): """ 同花顺-板块-概念板块-成份股 http://q.10jqka.com.cn/gn/detail/code/301558/ code: 板块名称或代码 """ if code.isdigit(): symbol=code else: symbol=ths_concept_code()[code] page=1

url = f"http://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/{page}/ajax/1/code/{symbol}"

#res = requests.get(url, headers=ths_header())
#soup = BeautifulSoup(res.text, "lxml")
try:
    page_num = int(
        soup.find_all("a", attrs={"class": "changePage"})[-1]["page"]
    )
except:
    page_num = 1
df = pd.DataFrame()
# for page in tqdm(range(1, page_num + 1), leave=False):
#     r = requests.get(url, headers=ths_header())
#     temp_df = pd.read_html(r.text)[0]
#     df = pd.concat([df, temp_df], ignore_index=True)
for page in tqdm(range(1, page_num + 1), leave=False):
    url = f"http://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/{page}/ajax/1/code/{symbol}"
    res = requests.get(url, headers=ths_header())
    soup = BeautifulSoup(res.text, "lxml")
    r = requests.get(url, headers=ths_header())
    temp_df = pd.read_html(r.text)[0]
    df = pd.concat([df, temp_df], ignore_index=True)
df.rename({"涨跌幅(%)": "涨跌幅","涨速(%)": "涨速",
        "换手(%)": "换手","振幅(%)": "振幅",'成交额':'成交额(亿)',
        '流通股':'流通股(亿)','流通市值':'流通市值(亿)',
        },inplace=True,axis=1,)
del df["加自选"]
del df['序号']
del df['涨跌']
df["代码"] = df["代码"].astype(str).str.zfill(6)
df[['成交额(亿)','流通股(亿)','流通市值(亿)']]=df[['成交额(亿)','流通股(亿)',
                    '流通市值(亿)']].apply(lambda s:s.str.strip('亿'))
ignore_cols = ['代码', '名称']
df = trans_num(df, ignore_cols)
return df.drop_duplicates()

4.感谢作者,感谢团队.感谢大家指正.谢谢.

genliu777 commented 1 year ago

url = f"http://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/{page}/ajax/1/code/{symbol}"。

这个url,除了code和symbol可以中循环中填入,url中其他部分是从哪儿得到的?毕竟翻页的时候浏览器中的url始终是http://q.10jqka.com.cn/gn/detail/code/301558/