python爬虫抓取股票信息

时间:2022-01-23 08:22:12

 

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