Python爬蟲抓取股票信息
介於我們小組的項目需求是需要在網上抓取股票信息,然后做成可視化界面。最開始的想法是利用Java抓取,但是由於Java代碼有點冗余,決定使用Python。項目開始,遇到了極大的問題,由於小組成員對於Python的了解認知都有限,我們決定先開始自學,然后寫一個簡單的爬蟲。
但是在最開始的時候就產生了問題,我們最初設想是抓取東方財富網上的股票信息。在我爬到了網頁的信息以后,我發現,所有的股票信息都是在頁面加載以后才能加載出來,這使初學Python的我產生了極大的困惑,但是介於時間有限,我也沒有進行系統的學習。於是,我只能另找方法,在網上尋求幫助。最終,我發現,我可以通過先爬取東方財富網的股票代碼信息然后將股票代碼放在百度股市通里面查詢,百度股市通的股票信息是頁面加載的時候就直接加載到頁面上的。找到了解決問題的方法,我開始完成了我的代碼。
1 # Author:Kevin Sun 2 # 上海股票信息 3 4 import requests 5 from bs4 import BeautifulSoup 6 import traceback 7 import re 8 import time 9 10 11 def getHTMLText(url): #獲得所需的網頁源代碼 12 try: 13 user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' 14 headers = {'User-Agent': user_agent} 15 r = requests.get(url, headers=headers, timeout=30) 16 r.raise_for_status() 17 r.encoding = r.apparent_encoding 18 return r.text 19 except: 20 return "" 21 22 def getFileName(): 23 dirname = time.strftime('%Y%m%d',time.localtime(time.time())) 24 dirname+='sh' 25 return dirname 26 27 28 29 def getStockList(lst, stock_list_url): # 獲得東方財富網上面上海股票的全部代碼 30 html = getHTMLText(stock_list_url) 31 soup = BeautifulSoup(html, 'html.parser') 32 a = soup.find_all('a') # 用find_all方法遍歷所有'a'標簽,然后在'a'標簽里面提取出href部分信息 33 for i in a: 34 try: 35 href = i.attrs['href'] 36 lst.append(re.findall(r"sh6\d{5}", href)[0]) # 用正則表達式匹配所需的信息,“sh\d{6}” 37 #print(lst) 38 except: 39 continue 40 41 42 def getStockInfo(lst, stock_info_url, fpath): 43 ndate = time.strftime('%Y%m%d',time.localtime(time.time())) 44 for stock in lst: 45 url = stock_info_url + stock + '.html' # 拼接url 46 html = getHTMLText(url) 47 try: 48 if html == "": 49 continue 50 infoDict = {} 51 soup = BeautifulSoup(html, 'html.parser') 52 stockInfo = soup.find('div', attrs={'class': 'stock-bets'}) 53 if stockInfo == None: # 判斷為空,返回 54 continue 55 # print(stockInfo) 56 # name = stockInfo.find_all(attrs={'class': 'bets-name'})[0] 57 # print(name) 58 #infoDict.update({'股票編碼':stock}) 59 #inp=name.text.split()[0]+":" 60 keyList = stockInfo.find_all('dt') 61 valueList = stockInfo.find_all('dd') 62 inp=stock+ndate+","+stock+","+ndate+"," 63 for i in range(len(keyList)): 64 key = keyList[i].text 65 val = valueList[i].text 66 infoDict[key] = val 67 #print(inp) 68 inp+=infoDict['最高']+","+infoDict['換手率']+","+infoDict['成交量']+","+infoDict['成交額']+"\n" 69 print(inp) 70 with open(fpath, 'a', encoding='utf-8') as f: 71 72 #f.write(str(infoDict) + '\n') 73 f.write(inp) 74 except: 75 traceback.print_exc() 76 continue 77 78 79 80 def main(): # 主方法調用上面的函數 81 stock_list_url = 'http://quote.eastmoney.com/stocklist.html' 82 stock_info_url = 'http://gupiao.baidu.com/stock/' 83 output_file = './'+getFileName()+'.txt' 84 slist = [] 85 getStockList(slist, stock_list_url) 86 getStockInfo(slist, stock_info_url, output_file) 87 88 89 main()
代碼中用到了Python中的非常方便的beautifulsoup庫(這個庫我在這里就不多做解釋,我是參考了一個大牛的理解,鏈接:http://cuiqingcai.com/1319.html),爬蟲使用的是谷歌瀏覽器。代碼中我也給了一些注釋,由於是Python初學者,有些地方難免有錯誤,之后在項目結束后會繼續學習Python完善。
