教你用 Python 快速獲取行業(yè)板塊股,輔助價值投資!

#?1.?行業(yè)板塊
行業(yè)板塊與概念股在定義上還是有很大區(qū)別的。
一般來說,概念板塊的風(fēng)險更大,基于某個消息被短期炒作,很不穩(wěn)定,因此風(fēng)險更大
行業(yè)板塊是按股票行業(yè)進(jìn)行分類,往往注重于長期,穩(wěn)定性更高。
在實際投資上,短期可以根據(jù)按「 市場熱點?」從概念股進(jìn)行選股投資,中長期還是建議按「?行業(yè)板塊?」選股進(jìn)行投資。
#?2. 爬取相關(guān)板塊及個股列表
目標(biāo)對象:
aHR0cDovL3N1bW1hcnkuanJqLmNvbS5jbi9oeWJrLw==

2-1??板塊列表
首先,我們使用 「 Toggle JavaScript 」插件發(fā)現(xiàn)頁面中的行業(yè)板塊數(shù)據(jù)來源于下面的請求結(jié)果
http://**/?q=cn|bk|17&n=hqa&c=l&o=pl,d&p=1020&_dc=1650680429759

其中,參數(shù)為 p 和?_dc 為可變參數(shù),p 代表頁碼數(shù)(從 1 開始),_dc 代表 13 位的時間戳,其他查詢參數(shù)都是固定內(nèi)容
然后,我們編寫代碼獲取響應(yīng)數(shù)據(jù),使用正則表達(dá)式匹配出行業(yè)列表的數(shù)據(jù)
...
self.ps_url?=?'http://**/?q=cn|bk|17&n=hqa&c=l&o=pl,d&p={}050&_dc={}'
....
????def?__get_timestramp(self):
????????"""
????????獲取13位的時間戳
????????:return:
????????"""
????????return?int(round(time.time()?*?1000))
...
????def?get_plates_list(self,?plate_keyword):
????????"""
????????獲取所有板塊
????????:return:
????????"""
????????plates?=?[]
????????index?=?0
????????while?True:
????????????url?=?self.ps_url.format(index?+?1,?self.__get_timestramp())
????????????#?解析數(shù)據(jù)
????????????resp?=?self.session.get(url,?headers=self.headers).text
????????????match?=?re.compile(r'HqData:(.*?)};',?re.S)
????????????result?=?json.loads(re.findall(match,?resp)[0].strip().replace("\n",?""))
????????????if?not?result:
????????????????break
????????????#?根據(jù)關(guān)鍵字,過濾有效板塊
????????????temp_plate_list?=?[item?for?item?in?result?if?plate_keyword?in?item[2]]
????????????index?+=?1
????????????for?item?in?temp_plate_list:
????????????????print(item)
????????????????plates.append({
????????????????????"name":?item[2],
????????????????????"plate_path":?item[1],
????????????????????"up_or_down":?str(item[10])?+?"%",
????????????????????"top_stock":?item[-6]
????????????????})
????????return?plates
...
最后,根據(jù)關(guān)鍵字對板塊進(jìn)行一次篩選,通過板塊名、板塊路徑 PATH、板塊漲跌幅、最大貢獻(xiàn)股票名稱重新組裝成一個列表
注意:通過分析頁面發(fā)現(xiàn),根據(jù)板塊路徑 PATH 可以組裝成行業(yè)板塊個股列表頁面 URL
比如,行業(yè)板塊 PATH 為 400128925,那么行業(yè)板塊對應(yīng)個股列表的頁面 URL 為
http://summary.**/hybk/400128925.shtml
2-2??行業(yè)個股列表
爬取行業(yè)個股列表和上一步數(shù)據(jù)展示邏輯一樣,個股列表數(shù)據(jù)同樣來源于下面請求的結(jié)果
http://**/?q=cn|s|bk{}&c=m&n=hqa&o=pl,d&p={}020&_dc={}
其中,bk 后面對應(yīng)行業(yè)板塊 PATH,p 代表頁碼數(shù),_dc 代表 13 位的時間戳
...
#?個股
self.stock_url?=?'http://**/?q=cn|s|bk{}&c=m&n=hqa&o=pl,d&p={}020&_dc={}'
....
????def?get_stock_list(self,?plate_path):
????????"""
????????獲取某一個板塊下所有的個股信息
????????包含:股票名稱、最新價格、漲跌幅、市盈率
????????:param?plate_info:
????????:return:
????????"""
????????index?=?0
????????stocks?=?[]
????????while?True:
????????????url?=?self.stock_url.format(plate_path,?index?+?1,?self.__get_timestramp())
????????????resp?=?self.session.get(url,?headers=self.headers).text
????????????match?=?re.compile(r'HqData:(.*?)};',?re.S)
????????????result?=?json.loads(re.findall(match,?resp)[0].strip().replace("\n",?""))
????????????if?not?result:
????????????????break
????????????index?+=?1
????????????for?item?in?result:
????????????????if?item[-1]?0:
????????????????????continue
????????????????stocks.append({
????????????????????"stock_name":?item[2],
????????????????????"pe":?item[-1],
????????????????????"price":?item[8],
????????????????????"up_or_down":?str(item[12])?+?"%"
????????????????})
????????#?按pe降序排列
????????stocks.sort(key=lambda?x:?x["pe"])
????????return?stocks通過正則表達(dá)式對響應(yīng)結(jié)果進(jìn)行匹配后,獲取個股的名稱、PE 市盈率、價格、漲跌幅 4 個關(guān)鍵數(shù)據(jù)
最后,對個股列表按 PE 進(jìn)行升序排列后直接返回
# 3. 服務(wù)化
當(dāng)然,我們可以將這部分邏輯服務(wù)化供前端使用,以此提升用戶的體驗性
比如,使用 FastAPI 可以快速創(chuàng)建兩個服務(wù):根據(jù)關(guān)鍵字獲取行業(yè)板塊列表、根據(jù)板塊路徑獲取個股列表
from?pydantic?import?BaseModel
#?板塊
class?Plate(BaseModel):
????content:?str??#?關(guān)鍵字
#?板塊下的個股
class?PlateStock(BaseModel):
????plate_path:?str??#?板塊路徑
#===========================================================
...
#?獲取板塊列表
@app.post("/xag/plate_list")
async?def?get_plate_list(plate:?Plate):
????pstock?=?PStock()
????try:
????????result?=?pstock.get_plates_list(plate.content)
????????return?success(data=result,?message="查詢成功!")
????except?Exception?as?e:
????????return?fail()
????finally:
????????pstock.teardown()
#?獲取某一個板塊下的所有股票列表
@app.post("/xag/plate_stock_list")
async?def?get_plate_list(plateStock:?PlateStock):
????pstock?=?PStock()
????try:
????????result?=?pstock.get_stock_list(plateStock.plate_path)
????????return?success(data=result,?message="查詢成功!")
????except?Exception?as?e:
????????return?fail()
????finally:
????????pstock.teardown()
...
前端以 Uniapp 為例,使用 uni-table 組件展示行業(yè)板塊列表及個股列表
部分代碼如下:
//個股列表?platestock.vue
...
class="box">
????????????????ref="baseForm"?:modelValue="baseFormData"?:rules="rules">
????????????????????"關(guān)鍵字"?required?name="content">
????????????????????????"baseFormData.content"?placeholder="板塊關(guān)鍵字"?/>
????????????????????
????????????????
????????????????
????????????????
????????????????class="result"?v-show="result.length>0">
????????????????????ref="table"?border?stripe?emptyText="暫無數(shù)據(jù)">
????????????????????????class="uni-item">
????????????????????????????"center"?class="uni-th"?width="100%">板塊
????????????????????????????"center"?class="uni-th"?width="100%">漲跌幅
????????????????????????????"center"?class="uni-th"?width="100%">強(qiáng)勢股
????????????????????????
????????????????????????class="uni-item"?v-for="(item,?index)?in?result"?:key="index"?@row-click="rowclick(item)">
????????????????????????????class="uni-th"?align="center">{{?item.name?}}
????????????????????????????"center"?class="uni-th">{{?item.up_or_down?}}
????????????????????????????"center"?class="uni-th">{{?item.top_stock?}}
????????????????????????
????????????????????
????????????????
????????????
...
methods:?{
????????????//表單提交數(shù)據(jù)
????????????submit(ref)?{
????????????????this.$refs[ref].validate().then(res?=>?{
????????????????????this.$http('xag/plate_list',?this.baseFormData,?{
????????????????????????hideLoading:?false,
????????????????????????hideMsg:?false,
????????????????????????method:?'POST'
????????????????????}).then(res?=>?{
????????????????????????console.log("內(nèi)容:",?res.data)
????????????????????????if?(res.data?&&?res.data.length?>?0)?{
????????????????????????????this.$tip.success("查詢成功!")
????????????????????????????this.result?=?res.data
????????????????????????}?else?{
????????????????????????????this.$tip.success("查詢結(jié)果為空,請換一個關(guān)鍵字查詢!")
????????????????????????}
????????????????????}).catch(err?=>?{
????????????????????????console.log("產(chǎn)生異常,異常信息:",?err)
????????????????????})
????????????????}).catch(err?=>?{
????????????????????console.log('err',?err);
????????????????})
????????????}
...最后部署完項目后,在前端頁面就能根據(jù)板塊名選擇合適的個股進(jìn)行投資了

# 4. 總結(jié)一下
由于行業(yè)板塊更適用于中長期投資,我們只需要根據(jù)某一個關(guān)鍵字篩選出一個板塊,然后在板塊下的個股列表中可以非常直觀地看出市盈率較低的個股進(jìn)行投資即可。
需要源碼的同學(xué),請在后臺輸入:小助手,找他領(lǐng)取(暗號:行業(yè)板塊)
這是我開發(fā)的機(jī)器人公眾號小號,目前增加了天氣查詢,955公司名單,關(guān)注時間查詢;后面還會增加圖片功能和每日送書抽獎送書活動,以及調(diào)戲功能,歡迎來體驗,捧場。
全新機(jī)器人公眾號上線啦,歡迎調(diào)戲!
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個月的Python??|?實戰(zhàn)項目?|學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會做詩的機(jī)器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r機(jī)票提示器!?|60行代碼做了一個語音壁紙切換器天天看小姐姐!|
年度爆款文案
6).30個Python奇淫技巧集?
點閱讀原文,看B站我的視頻!

