Python 实现股票数据的实时抓取

本文介绍了一种利用Python Scrapy框架抓取沪深两市所有股票名称和代码的方法,并通过新浪股票接口获取实时交易数据,最终实现股票价格涨幅排行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  **最近捣鼓股票的东西,想看看股票的实时涨跌信息,又不想去看网上炒股软件现有的信息,所以寻思着自己写了一个Python的股票当前价格抓取工具:**


一、得到沪深两市的所有上市股票数据

        考虑主要在东方财富网站上面抓取所有的沪深两市的股票名字和股票代码信息,很多办法可以爬到这样的数据,我用了一个爬虫框架Scrapy(正好在学习),将得到的数据保存进一个名叫TTJJ.json的文件中,Scrapy新建一个TTJJ工程,然后我添加了一个user-agent文件,防止被服务器ban,(在这儿其实没什么用,因为我访问的频率不高,服务器不会拒绝),工程列表如下:


        爬虫的主要程序如TTJJr所示:

[python]  view plain  copy
  1. from scrapy.spider import Spider  
  2. from scrapy.selector import Selector  
  3. from TTJJ.items import TTjjItem  
  4. import re  
  5. from scrapy import log  
  6. class TTJJi(Spider):  
  7.   
  8.     name = "TTJJ"  
  9.     allowed_domains=['eastmoney.com']  
  10.     start_urls = ["http://quote.eastmoney.com/stocklist.html#sh"]  
  11.   
  12.     def parse(self, response):  
  13.   
  14.         sel = Selector(response)  
  15.         cont=sel.xpath('//div[@class="qox"]/div[@class="quotebody"]/div/ul')[0].extract()  
  16.         item = TTjjItem()  
  17.   
  18.         for ii in re.findall(r'<li>.*?<a.*?target=.*?>(.*?)</a>',cont):  
  19.             item["stockName"]=ii.split("(")[0].encode('utf-8')  
  20.             item["stockCode"]=("sh"+ii.split("(")[1][:-1]).encode('utf-8')  
  21.             log.msg(ii.encode('utf-8'),level="INFO")  
  22.             yield item  
  23.   
  24.         #item["stockCode"]="+------------------------------------------------------------------+"  
  25.         #yield item  
  26.         cont1=sel.xpath('//div[@class="qox"]/div[@class="quotebody"]/div/ul')[1].extract()  
  27.   
  28.         for iii in re.findall(r'<li>.*?<a.*?target=.*?>(.*?)</a>',cont1):  
  29.             item["stockName"]=iii.split("(")[0].encode('utf-8')  
  30.             item["stockCode"]=("sz"+iii.split("(")[1][:-1]).encode('utf-8')  
  31.             #log.msg(iii.encode('utf-8'),level="INFO")  
  32.             yield item  

网上找了一个UserAgentMiddle的代码,只要在settings.py里面声明就可以不适用默认的登陆方式了,代码如下:

[python]  view plain  copy
  1. #-*- coding:utf-8 -*-  
  2. from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware  
  3. import random as rd  
  4. from scrapy import log  
  5.   
  6. class UserAgentMiddle(UserAgentMiddleware):  
  7.   
  8.     def __init__(self, user_agent=''):  
  9.         self.user_agent = user_agent  
  10.   
  11.     def process_request(self, request, spider):  
  12.         ua = rd.choice(self.user_agent_list)  
  13.         if ua:  
  14.             #显示当前使用的useragent  
  15.             print "********Current UserAgent:%s************" %ua  
  16.   
  17.             #记录  
  18.             log.msg('Current UserAgent: '+ua, level='INFO')  
  19.             request.headers.setdefault('User-Agent', ua)  
  20.   
  21.     #the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape  
  22.     #for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php  
  23.     user_agent_list = [\  
  24.         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "  
  25.         "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",  
  26.         "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "  
  27.         "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",  
  28.         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "  
  29.         "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",  
  30.         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "  
  31.         "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",  
  32.         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "  
  33.         "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",  
  34.         "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "  
  35.         "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",  
  36.         "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "  
  37.         "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",  
  38.         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "  
  39.         "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",  
  40.         "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "  
  41.         "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",  
  42.         "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "  
  43.         "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",  
  44.         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "  
  45.         "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",  
  46.         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "  
  47.         "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",  
  48.         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "  
  49.         "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",  
  50.         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "  
  51.         "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",  
  52.         "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "  
  53.         "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",  
  54.         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "  
  55.         "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",  
  56.         "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "  
  57.         "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",  
  58.         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "  
  59.         "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"  
  60.        ]  

        另外,items定义了一些爬虫到的数据的保存格式,以及pipeline里面定义了对数据的处理方式,也就是保存进json文件中,还有一些配置的内容在settings.py里详细代码分别如下:

[python]  view plain  copy
  1. # -*- coding: utf-8 -*-  
  2. # Define here the models for your scraped items  
  3. #  
  4. # See documentation in:  
  5. # http://doc.scrapy.org/en/latest/topics/items.html  
  6.   
  7. import scrapy  
  8.   
  9. class TTjjItem(scrapy.Item):  
  10.     stockCode = scrapy.Field()  
  11.     stockName = scrapy.Field()  
  12.      
[python]  view plain  copy
  1. # -*- coding: utf-8 -*-  
  2. # Define your item pipelines here  
  3. #  
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting  
  5. # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html  
  6.   
  7. import codecs  
  8. import json  
  9.   
  10. class TtjjPipeline(object):  
  11.   
  12.     def __init__(self):  
  13.   
  14.         self.file=codecs.open("TTJJ.json",mode="wb",encoding='utf-8')  
  15.         self.file.write('{"hah"'+':[')  
  16.   
  17.   
  18.     def process_item(self, item, spider):  
  19.         line = json.dumps(dict(item))+","  
  20.         self.file.write(line.decode("unicode_escape"))  
  21.   
  22.         return item  

[python]  view plain  copy
  1. # -*- coding: utf-8 -*-  
  2.   
  3. # Scrapy settings for TTJJ project  
  4. #  
  5. # For simplicity, this file contains only the most important settings by  
  6. # default. All the other settings are documented here:  
  7. #  
  8. #     http://doc.scrapy.org/en/latest/topics/settings.html  
  9. #  
  10.   
  11. BOT_NAME = 'TTJJ'  
  12.   
  13. SPIDER_MODULES = ['TTJJ.spiders']  
  14. NEWSPIDER_MODULE = 'TTJJ.spiders'  
  15. download_delay=1  
  16. ITEM_PIPELINES={'TTJJ.pipelines.TtjjPipeline':300}  
  17. COOKIES_ENABLED=False  
  18. # Crawl responsibly by identifying yourself (and your website) on the user-agent  
  19. #USER_AGENT = 'TTJJ (+http://www.yourdomain.com)'  
  20. #取消默认的useragent,使用新的useragent  
  21. DOWNLOADER_MIDDLEWARES = {  
  22.         'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,  
  23.         'TTJJ.spiders.UserAgentMiddle.UserAgentMiddle':400  
  24.     }  

运行结果,如下图所示,得到了股票的名字和股票代码信息:



二、得到股票的实时交易数据信息

         从新浪提供的股票接口http://hq.sinajs.cn/list= (放股票代码)拿数据,每天的开盘时间到收盘时间才会有数据的更新,其他时间拿到的数据是当天收盘的数据。我没有做太复杂的处理,就是简单计算了一个当前涨幅最高的10只股票,打印出来,主要的代码如下:

[python]  view plain  copy
  1. # -*- coding:utf-8 -*-  
  2.         #bb[0]:股票名  bb[1]:今日开盘价    bb[2]:昨日收盘价    bb[3]:当前价格   bb[4]:今日最高价    bb[5]:今日最低价  
  3.         #bb[6]:买一报价 bb[7]:卖一报价     bb[8]:成交股票数/100 bb[9]:成交金额/w bb[10]:买一申请股数 bb[11]:买一报价  
  4.         #bb[12]:买二股数 bb[13]:买二报价   bb[14]:买三股数      bb[15]:买三报价  bb[16]:买四申请股数 bb[17]:买四报价  
  5.         #bb[18]:买五股数 bb[19]:买五报价   bb[20]:卖一股数      bb[21]:卖一报价  bb[22]:卖二申请股数 bb[23]:卖二报价  
  6.         #bb[24]:卖三股数 bb[25]:卖三报价   bb[26]:卖四股数      bb[27]:卖四报价  bb[28]:卖五股数     bb[29]:卖五报价  
  7.         #bb[30]:日期     bb[31]:时间     bb[8]:不知道  
  8.   
  9. import urllib2  
  10. import time  
  11. from stockSort import stocksort  
  12. stockDict={}  
  13. stockTimeList=[]  
  14.   
  15. class updateData(object):  
  16.     def __init__(self):  
  17.         self.url = 'http://hq.sinajs.cn/list='  
  18.   
  19.     def getData(self,stockID):  
  20.         dataList={}  
  21.         try:  
  22.             request = urllib2.Request(self.url+str(stockID))  
  23.             response = urllib2.urlopen(request)  
  24.             contents = response.read()  
  25.   
  26.             for content in str(contents).splitlines():  
  27.                 temp=(content).split(",")  
  28.                 if float(temp[1])!=0:  
  29.                     hehe=str((float(temp[3])-float(temp[2]))/float(temp[1])*100)  
  30.                     dataList[str(temp[0][11:19])]=[hehe,temp[31]]  
  31.                 else:  
  32.                     dataList[str(temp[0][11:19])]=[0,temp[31]]  
  33.             return dataList  
  34.   
  35.         except urllib2.URLError, e:  
  36.             print "BadxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBad"  
  37.   
  38.     def getPart(self,stockID):  
  39.   
  40.         bb=self.getData(stockID)  
  41.         #print bb  
  42.   
  43.         #print 'a'+str(len(bb))  
  44.         if len(bb)>0:  
  45.             for key in bb:  
  46.                 stockDict[key].append(bb[key][0])  
  47.   
  48.             stockTimeList.append(bb[key][1])  
  49.   
  50. if __name__=='__main__':  
  51.   
  52.     ttjj=updateData()  
  53.     ff=open("stockCodeList.txt","r")  
  54.     #print ff.readline().split(",")  
  55.   
  56.     nameA=""  
  57.     count=0  
  58.     dataTemp=ff.readline().strip(",").split(",")  
  59.     ff.close()  
  60.     for  stockI in dataTemp:  
  61.         stockDict[stockI]=[]  
  62.         count+=1  
  63.         if count<800:  
  64.             nameA+=stockI+","  
  65.         else:  
  66.             ttjj.getPart(nameA.strip(","))  
  67.             nameA=""  
  68.             count=0  
  69.     ttjj.getPart(nameA.strip(","))  
  70.   
  71.     print stockDict  
  72.     while(True):  
  73.         time.sleep(1)  
  74.         nameA=""  
  75.         count=0  
  76.         for  stockI in dataTemp:  
  77.             count+=1  
  78.             if count<800:  
  79.                 nameA+=stockI+","  
  80.             else:  
  81.                 ttjj.getPart(nameA.strip(","))  
  82.                 nameA=""  
  83.                 count=0  
  84.         ttjj.getPart(nameA.strip(","))  
  85.   
  86.         #print stockDict  
  87.         xx=stocksort(stockDict)  
  88.         print xx.getSort()[0:10]  
[python]  view plain  copy
  1. class stocksort(object):  
  2.     def __init__(self,stockDict):  
  3.         self.stockDict=stockDict  
  4.   
  5.     def getSort(self):  
  6.         sortList={}  
  7.   
  8.         for key in self.stockDict:  
  9.             if len(self.stockDict[key])!=0:  
  10.                 sortList[key]=self.stockDict[key][-1]  
  11.   
  12.         return sorted(sortList.items(), lambda x, y: cmp(x[1], y[1]),reverse=True)  
        程序的运行结果如图所示:


由于我现在访问的时间是收盘之后了,所以每行看到的值是一样的(数据没更新了),一行表示的是10只涨的最高的股票,sz002703表示股票代码,后面数值9.99...是涨幅。主要就实现了这些,记录一下学习爬虫的经历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值