码迷,mamicode.com
首页 > 编程语言 > 详细

自学python之爬虫3股票数据爬虫

时间:2017-09-09 15:17:19      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:rom   原则   logs   源代码   lte   image   表达   append   update   

目标:获取股票上交所和深交所所有股票的名称和交易信息,保存在文件中

使用到的技术:requests+bs4+re

网站的选择(选取原则:股票信息静态存在HTML页面,非js代码生成没哟robot协议限制)

  1. 获取股票列表:http://quote.eastmoney.com/stocklist.html (因为东方财富网站的有全部股票信息的列表,百度股票网站只要个股信息)

  2. 获取个股信息:

    百度股票:https://gupiao.baidu.com/stock/

    单个股票:https://gupiao.baidu.com/stock/sz002939.html

程序的设计结构:

  步骤1:从东方财富获取股票列表

  步骤2:根据股票列表逐个到百度股票获取个股信息

  步骤3:将结果存储到文件

【步骤1】

通过发送请求获取到东方财富网站股票列表信息,查看页面源代码,如下:

技术分享

发现股票代码存储在<a>的href属性中,且上交和深交的股票代码前分别为“sh”和"sz",接下来可以利用这个规律进行解析和匹配。

首先使用BeautifulSoup4获取所有<a>:

  soup = BeautifulSoup(html, ‘html.parser‘)
  a = soup.find_all(‘a‘)

然后配合正则表达式提取的股票代码,并存储在lst列表中:

for i in a:
  try:
    href = i.attrs[‘href‘]
    lst.append(re.findall(r"[s][hz]\d{6}", href)[0])
  except:
    continue

此时列表 lst = [‘sh201000‘ , ‘sh201001‘ , ‘sh201002‘ ...]

【步骤2】

接下来根据获取的股票代码列表,逐个在百度股票获取个股信息。

百度股票个股信息的url:https://gupiao.baidu.com/stock/sz002939.html

因此,先进行url的拼接,然后发送请求获取页面

  for stock in lst:  

    url = ‘https://gupiao.baidu.com/stock/‘ + stock + ".html"

    html = getHTMLText(url)

然后进行页面解析,查看源代码

技术分享

发现所有的股票信息都存在的<dt><dd>中,然后使用BeautifulSoup进行一步一步的解析

soup = BeautifulSoup(html, ‘html.parser‘)

stockInfo = soup.find(‘div‘,attrs={‘class‘:‘stock-bets‘})

if stockInfo:
  name = stockInfo.find_all(attrs={‘class‘:‘bets-name‘})[0]
  infoDict.update({‘股票名称‘: name.text.split()[0]})

else:
  print(‘stockInfo is null‘)
  break
keyList = stockInfo.find_all(‘dt‘)
valueList = stockInfo.find_all(‘dd‘)

for i in range(len(keyList)):
  key = keyList[i].text
  val = valueList[i].text
  infoDict[key] = val

此时,infoDict = {"成交量":"31.07万手" , "最高":"9.89", "涨停":"10.86" ...}

【步骤3】

最后,把结果输出到文件中:

  with open(fpath, ‘a‘, encoding=‘utf-8‘) as f:
    f.write( str(infoDict) + ‘\n‘ )

 

完整代码如下:

#CrawBaiduStocksA.py
import requests
from bs4 import BeautifulSoup
import traceback
import re
 
#获取页面的公共方法
def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "get fail"

#获取股票代码列表
def getStockList(lst, stockURL):
    html = getHTMLText(stockURL)
    soup = BeautifulSoup(html, html.parser) 
    a = soup.find_all(a)
    for i in a:
        try:
            href = i.attrs[href]
            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])           
        except:
            continue
 
#获取个股信息并输出到文件中
def getStockInfo(lst, stockURL, fpath):
    for stock in lst:
        url = stockURL + stock + ".html"
        html = getHTMLText(url)
        try:
            if html=="":
                continue
            infoDict = {}
            soup = BeautifulSoup(html, html.parser)
            stockInfo = soup.find(div,attrs={class:stock-bets})
            if stockInfo:
                name = stockInfo.find_all(attrs={class:bets-name})[0]
                infoDict.update({股票名称: name.text.split()[0]})
            else:
                print(stockInfo is null)
                break
            keyList = stockInfo.find_all(dt)
            valueList = stockInfo.find_all(dd)
            for i in range(len(keyList)):
                key = keyList[i].text
                val = valueList[i].text
                infoDict[key] = val
             
            with open(fpath, a, encoding=utf-8) as f:
                f.write( str(infoDict) + \n )
        except:
            traceback.print_exc()
            continue
 
def main():
    stock_list_url = http://quote.eastmoney.com/stocklist.html #东放财富股票列表
    stock_info_url = https://gupiao.baidu.com/stock/ #百度股票信息
    output_file = D:/BaiduStockInfo.txt #结果存储的文件
    slist=[]
    getStockList(slist, stock_list_url)
    getStockInfo(slist, stock_info_url, output_file)
 
main()

 

自学python之爬虫3股票数据爬虫

标签:rom   原则   logs   源代码   lte   image   表达   append   update   

原文地址:http://www.cnblogs.com/wyfighting/p/7497985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!