分享

Python爬虫:股票数据爬取

 傑克h7x 2019-08-28

一、爬取个股列表

目标页面:http://quote.eastmoney.com/stocklist.html,爬取个股名称和代码

相关信息位于li标签中的a标签中,可以通过正则表达式或beautifulsoup获取,以下皆采用正则的方式。个股的代码以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. #数据清洗:去掉非个股,个股以6(沪市),0(深市),3(创业板)开头
  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()

注意在数据清洗时拷贝了一份列表,因为如果对同一个列表进行遍历并且remove操作时,下标可能会紊乱引发错误

一共获取到3617支个股

二、下载个股历史数据

通过网易财经接口可以获取股票和指数的历史数据,下载地址如: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表示截止日期之前的所有数据;fields选项中,分别表示当日的收盘,最高,最低,开盘价,昨日收盘价,涨跌额,涨跌幅,成交量,成交金额。

通过此链接可以下载到相关个股的csv文件

注意同时开启3000多个线程可能会有些下载失败,可以通过semaphore设置并发线程数量

  1. import csv
  2. import urllib.request as r
  3. import threading
  4. #读取之前获取的个股csv丢入到一个列表中
  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. #设置信号量,控制线程并发数
  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个csv

 

三、爬取基金数据

目标页面:http://quote.stockstar.com/fund/stock_3_1_X.html ,X表示页数

具体数据位于一个表格中

一共有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(('基金代码', '基金名称', '单位净值', '累计净值', '日增长额', '日增长率', '申购', '赎回'))
  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()

注意第一个正则中,因为是html代码所以存在换行符,. 表示任何不包括换行符的字符,所以用[\S\s],\s匹配\t\n\r\f\v中的一个

然后就可以进行数据分析了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多