python 簡(jiǎn)單的股票基金爬蟲
項(xiàng)目地址
https://github.com/aliyoge/fund_crawler_py
所用到的技術(shù)
- IP代理池
- 多線程
- 爬蟲
- sql
開始編寫爬蟲
1.首先,開始分析天天基金網(wǎng)的一些數(shù)據(jù)。經(jīng)過抓包分析,可知: ./fundcode_search.js包含所有基金代碼的數(shù)據(jù)。
2.根據(jù)基金代碼,訪問地址: fundgz.1234567.com.cn/js/ + 基金代碼 + .js可以獲取基金實(shí)時(shí)凈值和估值信息。
3.根據(jù)基金代碼,訪問地址: fundf10.eastmoney.com/FundArchivesDatas.aspx?type=jjcc&code= + 基金代碼 + &topline=10&year=2021&month=3可以獲取第一季度該基金所持倉的股票。
4.由于這些地址具有反爬機(jī)制,多次訪問將會(huì)失敗的情況。所以需要搭建IP代理池,用于反爬。搭建很簡(jiǎn)單,只需要將proxy_pool這個(gè)項(xiàng)目跑起來就行了。
# 通過這個(gè)方法就能獲取代理
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
5.搭建完IP代理池后,我們開始著手多線程爬取數(shù)據(jù)的工作。使用多線程,需要考慮到數(shù)據(jù)的讀寫順序問題。這里使用python中的隊(duì)列queue存儲(chǔ)基金代碼,不同線程分別從這個(gè)queue中獲取基金代碼,并訪問指定基金的數(shù)據(jù)。因?yàn)閝ueue的讀取和寫入是阻塞的,所以可確保該過程不會(huì)出現(xiàn)讀取重復(fù)和讀取丟失基金代碼的情況。
# 獲取所有基金代碼
fund_code_list = get_fund_code()
fund_len = len(fund_code_list)
# 創(chuàng)建一個(gè)隊(duì)列
fund_code_queue = queue.Queue(fund_len)
# 寫入基金代碼數(shù)據(jù)到隊(duì)列
for i in range(fund_len):
# fund_code_list[i]也是list類型,其中該list中的第0個(gè)元素存放基金代碼
fund_code_queue.put(fund_code_list[i][0])
6.現(xiàn)在開始編寫獲取所有基金的代碼。
# 獲取所有基金代碼
def get_fund_code():
...
# 訪問網(wǎng)頁接口
req = requests.get("http://fund.eastmoney.com/js/fundcode_search.js",
timeout=5,
headers=header)
# 解析出基金代碼存入list中
...
return fund_code_list
7.接下來是從隊(duì)列中取出基金代碼,同時(shí)獲取基金詳情和基金持倉的股票。
# 當(dāng)隊(duì)列不為空時(shí)
while not fund_code_queue.empty():
# 從隊(duì)列讀取一個(gè)基金代碼
# 讀取是阻塞操作
fund_code = fund_code_queue.get()
...
try:
# 使用該基金代碼進(jìn)行基金詳情和股票持倉請(qǐng)求
...
8.獲取基金詳情
# 使用代理訪問
req = requests.get(
"http://fundgz.1234567.com.cn/js/" + str(fund_code) + ".js",
proxies={"http": "http://{}".format(proxy)},
timeout=3,
headers=header,
)
# 解析返回?cái)?shù)據(jù)
...
9.獲取持倉股票信息
# 獲取股票投資明細(xì)
req = requests.get(
"http://fundf10.eastmoney.com/FundArchivesDatas.aspx?type=jjcc&code="
+ str(fund_code) + "&topline=10&year=2021&month=3",
proxies={"http": "http://{}".format(proxy)},
timeout=3,
headers=header,
)
# 解析返回?cái)?shù)據(jù)
...
10.準(zhǔn)備一個(gè)數(shù)據(jù)庫,用于存儲(chǔ)數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行篩選分析。這里推薦一個(gè)方便的云數(shù)據(jù)庫,一鍵創(chuàng)建,一鍵查詢,十分方便,而且是免費(fèi)的哦。前往MemFireDB注冊(cè)一個(gè)賬號(hào)就能使用。注冊(cè)邀請(qǐng)碼:6mxJl6、6mYjGY;

11.創(chuàng)建好數(shù)據(jù)庫后,點(diǎn)擊連接信息填入代碼中,用于連接數(shù)據(jù)庫。

# 初始化數(shù)據(jù)庫連接: engine = create_engine( 'postgresql+psycopg2://username:password@ip:5433/dbname')
12.將數(shù)據(jù)寫入數(shù)據(jù)庫中。
with get_session() as s:
# create fund
...
if (create):
s.add(fund)
s.commit()
13.到這里,大部分工作已經(jīng)完成了,我們?cè)趍ain函數(shù)中開啟線程,開始爬取。
# 在一定范圍內(nèi),線程數(shù)越多,速度越快
for i in range(50):
t = threading.Thread(target=get_fund_data, name="LoopThread" + str(i))
t.start()
14.等到爬蟲運(yùn)行完成之后,我們打開MemFireDB,點(diǎn)擊對(duì)應(yīng)數(shù)據(jù)庫的SQL查詢按鈕,就可以查看我們爬取的數(shù)據(jù)。哇!我們獲取到了6432條數(shù)據(jù)。

15.接下來讓我們來看看這些基金最喜歡買哪些股票吧。輸入SQL語句select poscode, posname, count(*) as count, cast(sum(poscost) as int) from fund group by poscode, posname order by count desc limit 10;

它就是茅臺(tái)!
以上就是python 簡(jiǎn)單的股票基金爬蟲的詳細(xì)內(nèi)容,更多關(guān)于python 股票基金爬蟲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python3導(dǎo)入CSV文件的實(shí)例(跟Python2有些許的不同)
今天小編就為大家分享一篇Python3導(dǎo)入CSV文件的實(shí)例(跟Python2有些許的不同),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
python數(shù)據(jù)挖掘Apriori算法實(shí)現(xiàn)關(guān)聯(lián)分析
這篇文章主要為大家介紹了python數(shù)據(jù)挖掘Apriori算法實(shí)現(xiàn)關(guān)聯(lián)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python使用tkinter實(shí)現(xiàn)透明窗體
一直在思索實(shí)現(xiàn)一個(gè)透明的窗體,然后可以基于這個(gè)窗體可以開發(fā)出各種好玩的應(yīng)用(如桌面運(yùn)動(dòng)的小人、運(yùn)動(dòng)的小球、截圖、錄制GIF等等),今天無意間居然讓我把其中一個(gè)最核心的技術(shù)難關(guān)突破了,我非常高興,也借這個(gè)機(jī)會(huì)跟大家分享一下。2021-05-05
AI生成圖片Stable?Diffusion環(huán)境搭建與運(yùn)行方法
Stable?Diffusion是一種基于擴(kuò)散過程的生成模型,由Ge?et?al.在2021年提出,該模型利用了隨機(jī)變量的穩(wěn)定分布,通過遞歸地應(yīng)用擴(kuò)散過程來生成高質(zhì)量的圖像,這篇文章主要介紹了AI圖片生成Stable?Diffusion環(huán)境搭建與運(yùn)行,需要的朋友可以參考下2023-05-05
Python項(xiàng)目打包并部署到Docker詳細(xì)步驟
這篇文章主要介紹了如何使用Docker將Python項(xiàng)目打包成鏡像并部署為容器,包括準(zhǔn)備工作、Python項(xiàng)目結(jié)構(gòu)、編寫Dockerfile、構(gòu)建Docker鏡像、運(yùn)行容器、優(yōu)化鏡像大小、自動(dòng)化部署以及總結(jié),需要的朋友可以參考下2025-03-03
python解析HTML并提取span標(biāo)簽中的文本
在網(wǎng)頁開發(fā)和數(shù)據(jù)抓取過程中,我們經(jīng)常需要從HTML頁面中提取信息,尤其是span元素中的文本,span標(biāo)簽是一個(gè)行內(nèi)元素,通常用于包裝一小段文本或其他元素,在Python中,我們可以通過使用BeautifulSoup或lxml等庫來解析HTML并提取span標(biāo)簽中的文本2024-12-12

