1.使用scrapy框架爬取股票数据
使用scrapy框架爬取股票数据
@概述本例将手把手带大家实现一个使用scrapy框架爬取股票数据的源码例子
我们将同花顺中融资融券中的几只个股的历史数据爬下来,并保存为csv文件(csv格式是源码数据分析最友好的格式)
本例使用到了pileline和中间件middleware
scrapy的安装请参见我博客的其它相关文章
@爬取标的
我们对融资融券对应的相关个股的前三页历史数据爬下来,如图所示:
@创建工程
scrapy startproject mystockspider
@工程结构简介
mystocks/ 工程根目录
mystocks/mystocks/ 工程代码存放目录
scrapy.cfg 部署文件
mystocks/mystocks/spiders/ 爬虫源文件存放目录
mystocks/mystocks/items.py 数据模型模块
mystocks/mystocks/pipelines.py 数据模型处理模块
mystocks/mystocks/middlewares.py 下载中间件模块
mystocks/mystocks/settings.py 设置模块
@在items.py中创建数据模型
#?源码个股数据模型class?StockItem(scrapy.Item):#?股票名称name?=?scrapy.Field()#?股票详细信息data?=?scrapy.Field()@在spiders/目录下创建爬虫源代码my_stock_spider.py
源文件名称和类名称都是任意的
name属性所定义的爬虫名称,将来启动爬虫的源码seetaface源码命令会使用到
start_urls是爬虫开始工作的起始页
#?定义爬虫类class?MyStockSpider(scrapy.Spider):#?定义爬虫名称(命令行启动爬虫要用)name?=?'mystockspider'#?定义起始?urlstart_urls?=?['/']@定义起始页响应的处理函数parse
这里的parse函数的名称和参数都是固定的写法,不可改变,源码可以在IDE中直接通过插入覆写方法实现
#?源码风之谷手游源码响应处理函数#?response为start_url所返回的响应对象def?parse(self,?response):@首页响应函数的具体实现
这里要做的事情就是从页面超链接中提取出个股名称和详情页超链接
xpath规则请参见:/market/rzrqgg/code/'+response.meta['id']+'/order/desc/page/'?+?str(response.meta['page'])?+?'/ajax/1/'print("url_str?=?",?url_str)#?稍事休息后,爬取下一页数据,源码仍交由当前函数处理time.sleep(1)yield?源码scrapy.Request(url=url_str,callback=self.handle_detail,meta={ 'page':?response.meta['page'],?'url_base':?url_str,?'name':?response.meta['name'],'id':response.meta['id']})
@在pipelines.py中定义数据模型处理类
这里的主要处理逻辑在process_item覆写方法中,
这里的源码处理逻辑很简单,就是源码把数据模型中的数据写入对应的文件
结尾处return了数据模型item,return给谁呢,源码答案是源码下一个pipeliine,如果有的源码自动捕鱼指标源码话
#?处理spider返回的item对象class?StockSavingPipeline(object):#?初始化方法def?__init__(self):print("\n"*5,"StockSavingPipeline?__init__")#?处理spider返回的item对象#?item?=?爬虫提交过来的数据模型#?spider?=?提交item的爬虫实例def?process_item(self,?item,?spider):print("\n"?*?5,?"StockSavingPipeline?process_item")#?提取数据data?=?item['data']file_name?=?"./files/"+item['name']+".csv"#?向文件中写入数据with?open(file_name,"a")?as?file:file.write(data)#?如果有多个pipeline,继续向下一个pipeline传递#?源码不返回则传递终止#?这里主要体现一个分工、分批处理的源码思想return?item#?对象被销毁时调用def?__del__(self):print("\n"?*?5,?"StockSavingPipeline?__del__")@告诉框架爬虫提交的数据对象由谁处理,这里有两种设置方式
方式1:设置在settings.py中
这里设置了多个pipeline处理类,为啥要买溯源码所有爬虫类提交的所有item都会经过所有这些pipeline类
这些pipeline的处理顺序是从小到大的,即的会先处理,的拼多多买源码后处理,其取值范围是0-
ITEM_PIPELINES?=?{ 'myspider.pipelines.WbtcPipeline':?,'myspider.pipelines.WbtcPipeline_2':?,'myspider.pipelines.StockSavingPipeline':?,}方式2:设置在爬虫类中,本例即MyStockSpider类中
直接设置在爬虫类中,其优先级要高于设置在settings.py中
这个规则对于后面对于下载中间件的配置也同样适用
#?声明使用哪些pipelines和下载中间件#?这里设置的优先级要高于settings.py文件custom_settings?=?{ 'ITEM_PIPELINES':{ 'myspider.pipelines.StockSavingPipeline':},}@配置下载中间件
下载中间件的作用是对请求和响应进行预处理
比如对所有请求添加随机的User-Agent
比如对所有请求随机配置代理IP
其配置同样有两种方式:配置在settings.py中或配置在爬虫类中,后者的优先级要高于前者
settings.py中的配置如下:
#?配置下载中间件DOWNLOADER_MIDDLEWARES?=?{ ?#?'myspider.middlewares.MyCustomDownloaderMiddleware':?,?'myspider.middlewares.ProxyMiddleware':?,}爬虫类中的配置如下:
#?声明使用哪些pipelines和下载中间件#?这里设置的优先级要高于settings.py文件custom_settings?=?{ ?'ITEM_PIPELINES':{ 'myspider.pipelines.StockSavingPipeline':},?'DOWNLOADER_MIDDLEWARES':{ 'myspider.middlewares.ProxyMiddleware':?},}@实现下载中间件
这里实现对所有请求添加随机请求头和IP代理
由于中间件同样也是可以配置多个,串联成链式结构的,所以return的标的下一个中间件
#?定义爬虫类class?MyStockSpider(scrapy.Spider):#?定义爬虫名称(命令行启动爬虫要用)name?=?'mystockspider'#?定义起始?urlstart_urls?=?['/']0@命令行中跑起来,爬虫就会源源不断地开始爬了
这里要提前cd到爬虫工程的根目录
如果在linux环境下,可以在前面加sudo,可以避免一些没必要的稀奇古怪的错误
#?定义爬虫类class?MyStockSpider(scrapy.Spider):#?定义爬虫名称(命令行启动爬虫要用)name?=?'mystockspider'#?定义起始?urlstart_urls?=?['/']1原文:/post/