教你用 Python 快速獲取相關(guān)概念股,輔助價(jià)值投資!

下面以「?市盈率?」為例,講解使用 Python 獲取相關(guān)概念股的完整流程
#?1. 市盈率 PE
股票市盈率,簡(jiǎn)稱 PE,是股票價(jià)格除以每股盈利的值,是價(jià)值投資中一個(gè)非常重要的財(cái)務(wù)指標(biāo)
一般來說,市盈率越低,投資風(fēng)險(xiǎn)越小,投資價(jià)值越高
市盈率也分為 3 種
市盈利 - 靜
市盈率 - 動(dòng)
市盈率 - 滾動(dòng) TTM
其中
市盈率(靜)的值為總市值除以去年一年的總凈利潤(rùn)
市盈率(動(dòng))的值為總市值除以預(yù)估今年全年的總凈利潤(rùn)
市盈率(滾動(dòng))TTM 的值為總市值除以最近 4 個(gè)季度的總凈利潤(rùn)
總體來說,市盈率 TTM 相比前兩者,數(shù)據(jù)值更具體參考性
#?2. 爬取相關(guān)概念列表
目標(biāo)對(duì)象:
aHR0cDovL3N0b2NrLmpyai5jb20uY24vY29uY2VwdC9jb25jZXB0cGFnZS5zaHRtbD90bz1wYw==
首先,利用 requests + lxml 獲取網(wǎng)頁(yè)元素進(jìn)行解析

接著,利用正則過濾出關(guān)鍵數(shù)據(jù),包含:相關(guān)概念名稱、鏈接地址、相關(guān)概念 ID
import?requests
from?lxml?import?etree
import?re
...
?def?__get_concept_stocks_info(self):
????????"""
????????獲取概念股信息
????????:return:
????????"""
????????html_element?=?etree.HTML(self.session.get(self.home_url).text)
????????a_elements?=?html_element.xpath('//p[@class="jrj-clear"]//a')
????????result?=?[]
????????for?a_element?in?a_elements:
????????????a_element_text?=?a_element.xpath('./text()')[0].replace('概念股',?'')
????????????a_element_href?=?a_element.xpath('./@href')[0]
????????????if?self.keyword?in?a_element_text:
????????????????a_element_tag?=?re.findall(r'^.*_(.*).shtml$',?a_element_href)[-1]
????????????????result.append({
????????????????????"cs":?a_element_text,
????????????????????"href":?a_element_href,
????????????????????"tag":?a_element_tag
????????????????})
????????return?result
...#?3. 爬取概念個(gè)股
分析個(gè)股列表頁(yè)面后,發(fā)現(xiàn)列表數(shù)據(jù)來源于 JS 文件,URL 中的變量為上面的概念 ID

遍歷相關(guān)概念列表,就可以獲取到所有個(gè)股數(shù)據(jù)
PS:這里僅獲取股票名稱及編號(hào)
...
????def?__get_concept_stocks(self,?concept_stocks_info):
????????"""
????????獲取相關(guān)概念股列表
????????:param?concept_stocks_info:
????????:return:
????????"""
????????url?=?f'http://**/concept/conceptdetail/conceptStock_{concept_stocks_info.get("tag")}.js'
????????headers?=?{'User-Agent':?UserAgent().random}
????????#?去掉換行符,轉(zhuǎn)為中文
????????resp?=?self.session.get(url,?headers=headers).text.replace('\n',?'').encode('utf-8').decode(
????????????'unicode_escape')
????????#?正則匹配,獲取對(duì)應(yīng)股票
????????stocks_list?=?json.loads(re.findall(r'^.*"stockData":(.*)};$',?resp,?re.IGNORECASE)[0].replace("\'",?"\""))
????????return?[(item[1],?item[0])?for?item?in?stocks_list]
...
????????#?2、獲取相關(guān)概念列表
????????for?concept_stocks_info?in?concept_stocks_infos:
????????????concept_stocks?=?self.__get_concept_stocks(concept_stocks_info)
????????????# print('概念個(gè)股列表如下:')
????????????#?print(concept_stocks)
...# 4. 個(gè)股詳情及排序
分析個(gè)股詳情頁(yè)面后,發(fā)現(xiàn) URL 由時(shí)間戳及股票 ID 組成

我們只需要請(qǐng)求接口,利用正則進(jìn)行匹配獲取個(gè)股中需要的數(shù)據(jù)參數(shù)即可
...
????????def?__get_stock_info(self,?concept_stock):
????????"""
????????獲取個(gè)股的基本信息
????????:return:
????????"""
????????stock_name?=?concept_stock[0]??#?股票名稱
????????stock_tag?=?concept_stock[1]??#?股票編號(hào)
????????url?=?self.stock_home.format(stock_tag)
????????#?編碼問題
????????headers?=?{'User-Agent':?UserAgent().random}
????????resp?=?self.session.get(self.stock_url.format(stock_tag,?self.__get_time()),
????????????????????????????????headers=headers).text.replace('\n',?'')
????????#?解析關(guān)鍵數(shù)據(jù)
????????resp_data?=?json.loads(re.findall(r'^.*HqData:(.*)};$',?resp,?re.IGNORECASE)[0])[0]
????????#?print(resp_data)
????????#?獲取股票關(guān)鍵信息
????????stock_price?=?resp_data[11]??#?實(shí)時(shí)價(jià)格
????????#?print(stock_price)
????????#?獲取漲跌
????????stock_up_or_down?=?str(resp_data[19])?+?"%"??#?漲跌幅
????????# print("漲跌幅:", stock_up_or_down)
????????stock_num_ratio?=?resp_data[22]??#?量比
????????#?print(stock_num_ratio)
????????stock_change_ratio?=?str(resp_data[24])?+?"%"??#?換手率
????????#?print(stock_change_ratio)
????????stock_pe?=?resp_data[-1]??#?市盈率
????????#?print(stock_pe)
????????return?{
????????????"name":?stock_name,
????????????"no":?stock_tag,
????????????"url":?url,
????????????"price":?stock_price,
????????????"up_or_down":?stock_up_or_down,
????????????"num_ratio":?stock_num_ratio,
????????????"change_ratio":?stock_change_ratio,
????????????"pe":?stock_pe
????????}
...
最后,我們按照市盈率進(jìn)行升序排列
...
??#?4、按照市盈利排序(升序)
??stocks.sort(key=lambda?x:?x["pe"])
??#?5、打印
??print(json.dumps(stocks))
...
# 5. 總結(jié)一下
在使用的時(shí)候,我們只需要傳入「?相關(guān)概念關(guān)鍵字參數(shù)?」,就可以按市盈率升序排列后,返回相關(guān)概念股列表
當(dāng)然,你也可以利用個(gè)股中的其他數(shù)據(jù)參數(shù)進(jìn)行組合排序,獲取適合自己的投資策略
我已將文中所有源碼上傳到下方公眾號(hào)后臺(tái),關(guān)注公眾號(hào)「?煎蛋搞錢?」后回復(fù)關(guān)鍵字「 220110?」即可以獲取
如果你覺得文章還不錯(cuò),請(qǐng)大家?點(diǎn)贊、分享、留言?下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!

