一、爬取個(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中: 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) #數(shù)據(jù)清洗:去掉非個(gè)股,個(gè)股以6(滬市),0(深市),3(創(chuàng)業(yè)板)開頭 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]))
注意在數(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ù)量 import urllib.request as r #讀取之前獲取的個(gè)股csv丟入到一個(gè)列表中 f = open('D:/Py/stock.csv','r',encoding='utf-8') def downloadFile(url,filepath): r.urlretrieve(url,filepath) print(filepath,'is downloaded') #設(shè)置信號(hào)量,控制線程并發(fā)數(shù) 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個(gè)csv 

三、爬取基金數(shù)據(jù)目標(biāo)頁面:http://quote.stockstar.com/fund/stock_3_1_X.html ,X表示頁數(shù) 具體數(shù)據(jù)位于一個(gè)表格中 
一共有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(('基金代碼', '基金名稱', '單位凈值', '累計(jì)凈值', '日增長額', '日增長率', '申購', '贖回')) baseUrl = 'http://quote.stockstar.com/fund/stock_3_1_{}.html'.format(page) threading.Thread(target=getFundsInfo,args=(baseUrl,)).start()
注意第一個(gè)正則中,因?yàn)槭莌tml代碼所以存在換行符,. 表示任何不包括換行符的字符,所以用[\S\s],\s匹配\t\n\r\f\v中的一個(gè) 然后就可以進(jìn)行數(shù)據(jù)分析了
|