0.股票数据Scrapy爬虫实例介绍
(0)功能描述
目标:获取上交所和深交所所有股票的名称和交易信息
输出:保存到文件中
技术路线:scrapy
(1)数据网站的确定
获取股票列表:
东方财富网:http://quote.eastmoney.com/stocklist.html
获取个股信息:
百度股票:https://gupiao.baidu.com/stock/
单个股票:https://gupiao.baidu.com/stock/sz002439.html
编写spider处理链接爬取和页面解析,编写pipelines处理信息存储。
1.股票数据Scrapy爬虫实例编写
(1)建立工程和Spider模板
\>scrapy startproject BaiduStocks
\>cd BaiduStocks
\>scrapy genspider stocks baidu.com
进一步修改spiders/stocks.py文件
(2)编写Spider
配置stocks.py文件
修改对返回页面的处理
修改对新增URL爬取请求的处理
A.修改前
# -*- coding: utf-8 -*-
import scrapy
class StocksSpider(scrapy.Spider):
name = 'stocks'
allowed_domains = ['baidu.com']
start_urls = ['http://baidu.com/']
def parse(self, response):
pass
B.修改中
C.修改后
# -*- coding: utf-8 -*-
import scrapy
class StocksSpider(scrapy.Spider):
name = 'stocks'
allowed_domains = ['baidu.com']
#start_urls = ['http://baidu.com/']
start_urls={'http://quote.eastmoney.com/stocklist.html'}
def parse(self, response):
for href in response.css('a::attr(href)').extract():
try:
stock=re.findall(r"[s][hz]\d{6}",href)[0]
url='http://gupiao.baidu.com/stock/'+stock+'.html'
yield scrapy.Request(url,callback=self.parse_stock)
except:
continue
def parse_stock(self,reponse):
infoDict={}
stockInfo=response.css('.bets-name').extract()[0]
keyList=stockInfo.css('dt').extract()
valueList=stockInfo.css('dd').extract()
for i in range(len(keyList)):
key=re.findall(r'>.*</dt>',keyList[i])[0][1:-5]
try:
val=re.findall(r'\d+\.?.*</dd>',valueList[i])[0][0:-5]
except:
val='--'
infoDict[key]=val
infoDict.update(
{'股票名称':refindall('\s.*\(',name)[0].split()[0]+\
re.findall('\>.*\<',name)[0][1:-1]})
yield infoDict
(3)编写Pipelines
配置pipelines.py文件
定义对爬取项(Scraped Item)的处理类
配置ITEM_PIPELINES选项
A.修改前
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
class BaidustocksPipeline(object):
def process_item(self, item, spider):
return item
B.修改后
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
class BaidustocksPipeline(object):
def process_item(self, item, spider):
return item
class BaidustocksInfoPipeline(object):
def open_spider(self,spider):
self.f=open('BaiduStockInfo.txt','w')
def close_spider(self,spider):
self.f.close()
def process_item(self,item,spider):
try:
line=str(dict(item))+"\n"
self.f.write(line)
except:
pass
return item
去掉settings.py文件中的ITEM_PIPELINES的这几行的开头的注释符#(如下)。
上面的全部程序实现:从东方财富网获取股票列表由每一个股票生成对应百度股票的连接得以爬取股票信息,从spider提取的成字典以item类后被item pipelines数据处理。
--------------------------------------------------
执行程序:在CMD输入\>scrapy crawl stocks
--------------------------------------------------
2.股票数据Scrapy爬虫实例优化(提高爬取速度)
配置并发连接选项
settings.py文件
3.单元小结
(1)技术路线展望
(2)Scrapy地位与展望
Scrapy是Python语言最好的爬虫框架,具备企业级专业爬虫的扩展性(7x24高可靠性),千万级URL爬取管理与部署。简单说:Scrapy足以支撑一般商业服务所需的爬虫能力:持续爬取、商业服务、高可靠性。
普通价值:基于Linux,7x24,稳定爬取输出,商业级部署和应用 (scrapyd‐*),千万规模内URL爬取、内容分析和存储。
高阶价值(只有Scrapy还不够):基于docker,虚拟化部署,中间件扩展,增加调度和监控,各种反爬取对抗技术。