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完善。