日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python爬蟲:股票數(shù)據(jù)爬取

 傑克h7x 2019-08-28

一、爬取個(gè)股列表

目標(biāo)頁面:http://quote.eastmoney.com/stocklist.html,爬取個(gè)股名稱和代碼

相關(guān)信息位于li標(biāo)簽中的a標(biāo)簽中,可以通過正則表達(dá)式或beautifulsoup獲取,以下皆采用正則的方式。個(gè)股的代碼以0或3或6開頭然后把信息寫入csv中:

  1. import requests
  2. from fake_useragent import UserAgent
  3. import re
  4. import csv
  5. def getHtml(url):
  6. r = requests.get(url,headers={
  7. 'User-Agent': UserAgent().random,
  8. })
  9. r.encoding = r.apparent_encoding
  10. return r.text
  11. stockUrl = 'http://quote.eastmoney.com/stocklist.html'
  12. PATTERN_STOCK = '<li><a.*>(\w*)\((\d{6})\)</a></li>'
  13. if __name__ == '__main__':
  14. html = getHtml(stockUrl)
  15. reslist = re.findall(PATTERN_STOCK,html)
  16. #數(shù)據(jù)清洗:去掉非個(gè)股,個(gè)股以6(滬市),0(深市),3(創(chuàng)業(yè)板)開頭
  17. datalist = reslist[:]
  18. for res in reslist:
  19. if not (str(res[1]).startswith('6') or str(res[1]).startswith('3') or str(res[1]).startswith('0')):
  20. datalist.remove(res)
  21. f =open('D:/Py/stock.csv','w+',encoding='utf-8',newline='')
  22. writer = csv.writer(f)
  23. writer.writerow(('名稱', '代碼'))
  24. for data in datalist:
  25. writer.writerow((data[0],data[1]))
  26. f.close()

注意在數(shù)據(jù)清洗時(shí)拷貝了一份列表,因?yàn)槿绻麑?duì)同一個(gè)列表進(jìn)行遍歷并且remove操作時(shí),下標(biāo)可能會(huì)紊亂引發(fā)錯(cuò)誤

一共獲取到3617支個(gè)股

二、下載個(gè)股歷史數(shù)據(jù)

通過網(wǎng)易財(cái)經(jīng)接口可以獲取股票和指數(shù)的歷史數(shù)據(jù),下載地址如:http://quotes.money.163.com/service/chddata.html?code=0000001&end=20190218&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER

code以一共有7位,后6位表示股票代碼,第一位為0表示是滬市,1為深市;end表示截止日期之前的所有數(shù)據(jù);fields選項(xiàng)中,分別表示當(dāng)日的收盤,最高,最低,開盤價(jià),昨日收盤價(jià),漲跌額,漲跌幅,成交量,成交金額。

通過此鏈接可以下載到相關(guān)個(gè)股的csv文件

注意同時(shí)開啟3000多個(gè)線程可能會(huì)有些下載失敗,可以通過semaphore設(shè)置并發(fā)線程數(shù)量

  1. import csv
  2. import urllib.request as r
  3. import threading
  4. #讀取之前獲取的個(gè)股csv丟入到一個(gè)列表中
  5. def getStockList():
  6. stockList = []
  7. f = open('D:/Py/stock.csv','r',encoding='utf-8')
  8. f.seek(0)
  9. reader = csv.reader(f)
  10. for item in reader:
  11. stockList.append(item)
  12. f.close()
  13. return stockList
  14. def downloadFile(url,filepath):
  15. try:
  16. r.urlretrieve(url,filepath)
  17. except Exception as e:
  18. print(e)
  19. print(filepath,'is downloaded')
  20. pass
  21. #設(shè)置信號(hào)量,控制線程并發(fā)數(shù)
  22. sem = threading.Semaphore(100)
  23. def downloadFileSem(url,filepath):
  24. with sem:
  25. downloadFile(url,filepath)
  26. urlStart = 'http://quotes.money.163.com/service/chddata.html?code='
  27. urlEnd = '&end=20190218&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER'
  28. if __name__ == '__main__':
  29. stockList = getStockList()
  30. stockList.pop(0)
  31. for s in stockList:
  32. scode = str(s[1])
  33. #0:滬市;1:深市
  34. url = urlStart + ('0' if scode.startswith('6') else '1') + scode + urlEnd
  35. filepath ='D:/Py/StocksInfo1/' + (str(s[0])+'_'+scode) + '.csv'
  36. threading.Thread(target=downloadFileSem,args=(url,filepath)).start()

一共是3617個(gè)csv

 

三、爬取基金數(shù)據(jù)

目標(biāo)頁面:http://quote.stockstar.com/fund/stock_3_1_X.html ,X表示頁數(shù)

具體數(shù)據(jù)位于一個(gè)表格中

一共有37頁,采用正則截取的方式,最后也是寫入csv

  1. from GetStockList import getHtml
  2. import re
  3. import csv
  4. import threading
  5. def getFundsInfo(baseUrl):
  6. html = getHtml(baseUrl)
  7. reslist = re.findall('<tbody[\s\S]*</tbody>',html)
  8. tbody = reslist[0]
  9. reslist = re.findall('>(\S+?)</',tbody)
  10. for i in range(0,len(reslist),8):
  11. rowList = []
  12. for j in range(8):
  13. rowList.append(reslist[i+j])
  14. writer.writerow(rowList)
  15. if __name__ == '__main__':
  16. f = open('D:/Py/StockFunds.csv', 'w', encoding='utf-8', newline='')
  17. writer = csv.writer(f)
  18. writer.writerow(('基金代碼', '基金名稱', '單位凈值', '累計(jì)凈值', '日增長額', '日增長率', '申購', '贖回'))
  19. for page in range(1,38):
  20. baseUrl = 'http://quote.stockstar.com/fund/stock_3_1_{}.html'.format(page)
  21. threading.Thread(target=getFundsInfo,args=(baseUrl,)).start()

注意第一個(gè)正則中,因?yàn)槭莌tml代碼所以存在換行符,. 表示任何不包括換行符的字符,所以用[\S\s],\s匹配\t\n\r\f\v中的一個(gè)

然后就可以進(jìn)行數(shù)據(jù)分析了

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多