一、爬取个股列表目标页面:http://quote.eastmoney.com/stocklist.html,爬取个股名称和代码 相关信息位于li标签中的a标签中,可以通过正则表达式或beautifulsoup获取,以下皆采用正则的方式。个股的代码以0或3或6开头然后把信息写入csv中: from fake_useragent import UserAgent r = requests.get(url,headers={ 'User-Agent': UserAgent().random, r.encoding = r.apparent_encoding stockUrl = 'http://quote.eastmoney.com/stocklist.html' PATTERN_STOCK = '<li><a.*>(\w*)\((\d{6})\)</a></li>' if __name__ == '__main__': reslist = re.findall(PATTERN_STOCK,html) #数据清洗:去掉非个股,个股以6(沪市),0(深市),3(创业板)开头 if not (str(res[1]).startswith('6') or str(res[1]).startswith('3') or str(res[1]).startswith('0')): f =open('D:/Py/stock.csv','w+',encoding='utf-8',newline='') writer.writerow(('名称', '代码')) writer.writerow((data[0],data[1]))
注意在数据清洗时拷贝了一份列表,因为如果对同一个列表进行遍历并且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设置并发线程数量 import urllib.request as r f = open('D:/Py/stock.csv','r',encoding='utf-8') def downloadFile(url,filepath): r.urlretrieve(url,filepath) print(filepath,'is downloaded') sem = threading.Semaphore(100) def downloadFileSem(url,filepath): downloadFile(url,filepath) urlStart = 'http://quotes.money.163.com/service/chddata.html?code=' urlEnd = '&end=20190218&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER' if __name__ == '__main__': stockList = getStockList() url = urlStart + ('0' if scode.startswith('6') else '1') + scode + urlEnd filepath ='D:/Py/StocksInfo1/' + (str(s[0])+'_'+scode) + '.csv' threading.Thread(target=downloadFileSem,args=(url,filepath)).start()
一共是3617个csv 三、爬取基金数据目标页面:http://quote.stockstar.com/fund/stock_3_1_X.html ,X表示页数 具体数据位于一个表格中 一共有37页,采用正则截取的方式,最后也是写入csv from GetStockList import getHtml def getFundsInfo(baseUrl): reslist = re.findall('<tbody[\s\S]*</tbody>',html) reslist = re.findall('>(\S+?)</',tbody) for i in range(0,len(reslist),8): rowList.append(reslist[i+j]) if __name__ == '__main__': f = open('D:/Py/StockFunds.csv', 'w', encoding='utf-8', newline='') writer.writerow(('基金代码', '基金名称', '单位净值', '累计净值', '日增长额', '日增长率', '申购', '赎回')) baseUrl = 'http://quote.stockstar.com/fund/stock_3_1_{}.html'.format(page) threading.Thread(target=getFundsInfo,args=(baseUrl,)).start()
注意第一个正则中,因为是html代码所以存在换行符,. 表示任何不包括换行符的字符,所以用[\S\s],\s匹配\t\n\r\f\v中的一个 然后就可以进行数据分析了
|