tkfy920 / qstock

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

libeiheng opened this issue · comments

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.感谢作者,感谢团队.感谢大家指正.谢谢.

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/