博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python爬虫之Scrapy爬取股票信息的示例
阅读量:2338 次
发布时间:2019-05-10

本文共 4732 字,大约阅读时间需要 15 分钟。

python爬虫之Scrapy的使用步骤

  • 首先讲讲教程的例子,还是以百度股票为例子进行讲解
Scrapy的使用步骤
  • 建立工程和Spider模版
  • 编写Spider
  • 编写ITEM Pipelines
前请回顾
  • 首先回顾一下爬取股票数据的相关的知识点和思路
    • 基本思路:从东方财富网获取所有股票的代码,然后在组成新的百度网网页,跳转到对应的列表中爬取对应的信息
    • 先看看,东方财富的网页,筛选的正则表达式:r’[zh|sh]\d{6}’

在这里插入图片描述

  • 再看看单个股票网页的网址,只需要在对应的网页加上对应的股票编码就可以获得

    在这里插入图片描述

  • 最后再看看但个网页的股票的具体的价格信息,分别在对应的dd和tt标签中,名称在属性为“bets—name”的属性中

在这里插入图片描述

具体编写
第一步、建立工程和Spider模版
  • 在控制台输入如下指令
  • 创建对应的scrapy工程: scrapy startproject BaiduStocks
    在这里插入图片描述
  • 切换到创建的工程目录下:cd BaiduStocks
    在这里插入图片描述
  • 创建相关的爬虫:scrapy genspider stocks baidu.com

在这里插入图片描述

第二步、编写对应的Spider工具
  • 配置stocks.py文件,确定你需要爬取的具体的信息
  • 修改对返回页面的处理
  • 修改对新增的URL爬取请求的处理

首先打开如下位置的文件

在这里插入图片描述
分析:
根据功能请求,总共爬取两类网站,所以最基本的得写针对两类网站的爬取代码

  • 部分一:爬取东方财富网的所有股票的信息地址
    • css().extract()是返回对应的所有的标签内部的值,关于css用法,详见 https://www.jianshu.com/p/278a4ca6d0c1 觉得还不错
    • yield生成器,生成的是request对象,专门给downloader进行处理
    • callback指明对应的返回response对象,处理的函数
def parse(self, response):    for href in response.css('a::attr(href)').extract():        # 提取其中所有的a标签,并获取其中href连接        try:            stock = re.findall(r'[s][hz]\d{6}',href)[0]            # 通过正则表达式,获得相关的股票的代码            url = 'https://gupiao.baidu.com/stock/' + stock + '.html'            # 生成百度股票的html网页            yield scrapy.Request(url,callback=self.parse_stock)            # 根据生成的网页在生成相关的request对象,以供downloader进行下载            # callback是指定相应的函数类型        except:            continue
  • 部分二:爬取百度股票网的单个网页的具体的信息
    • 指明当前函数的生成对象,非requests就是item,指明字典类默认就是给ITEM pipeline进行处理了
    • stockInfo = response.css(’.stock-bets’),找到对应的具有stock-bets的属性的标签,返回的是selector对象
    • name = stockInfo.css(’.bet-name’).extract()[0],借用上面的selector对象,然后返回所有的具有bet-name属性的标签的值组成的列表
    • keyList= stockInfo.css(‘dt’).extract()
      valueList = stockInfo.css(‘dd’).extract(),就分别返回的是dt和dd标签的值组成的列表
    • 字典的update函数有些忘记:在这里插入图片描述

代码如下:

# 定义指定的处理的信息def parse_stock(self,response):    infoDict = {
} # 返回的信息是交给itempipeline进行处理的,所以用字典的信息进行存储 stockInfo = response.css('.stock-bets') name = stockInfo.css('.bet-name').extract()[0] keyList= stockInfo.css('dt').extract() valueList = stockInfo.css('dd').extract() for i in range(len(keyList)): key = re.findall(r'>.*',valueList[i])[0] except: val = '--' infoDict[key] = val # 一个字典条目,增加一个股票名称 infoDict['股票名称'] = re.findall('\s.*\(',name)[0].split()[0] + re.findall('\>.*\<',name)[0] yield infoDict # 将生成的item给itemPipeLine进行处理
总的代码
import scrapyimport reclass StocksSpider(scrapy.Spider):    name = 'stocks'    start_urls = ['http://quote.eastmoney.com/stocklist.html']    # 是先从东方财富网获得每个股票的代码,然后生成和百度股票相关的url连接    def parse(self, response):        for href in response.css('a::attr(href)').extract():            # 提取其中所有的a标签,并获取其中href连接            try:                stock = re.findall(r'[s][hz]\d{6}',href)[0]                # 通过正则表达式,获得相关的股票的代码                url = 'https://gupiao.baidu.com/stock/' + stock + '.html'                # 生成百度股票的html网页                yield scrapy.Request(url,callback=self.parse_stock)                # 根据生成的网页在生成相关的request对象,以供downloader进行下载                # callback是指定相应的函数类型            except:                continue    # 定义指定的处理的信息    def parse_stock(self,response):        infoDict = {
} # 返回的信息是交给itempipeline进行处理的,所以用字典的信息进行存储 stockInfo = response.css('.stock-bets') name = stockInfo.css('.bet-name').extract()[0] keyList= stockInfo.css('dt').extract() valueList = stockInfo.css('dd').extract() for i in range(len(keyList)): key = re.findall(r'>.*',valueList[i])[0] except: val = '--' infoDict[key] = val # 更新股票的名称 infoDict.update({
'股票名称':re.findall('\s.*\(',name)[0].split()[0] + \ re.findall('\>.*\<',name)[0] }) yield infoDict # 将生成的item给itemPipeLine进行处理
第三步、编写ITEM pipelines
  • 配置匹配pipelines.py文件
  • 定义对爬取项的处理类
  • 在settings中配置相关的ITEM_PIPELINES选项,确保scrapy可以自动找到对应的item处理类

代码如下:

  • 主要有三个方法,传入相关的爬虫时,自动打开对应的写入的文件,结束爬虫时,自动关闭文件,以及对文件的具体写入
  • 分别是open_spider,close_spider和process_item
# -*- 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# 下面的每一个类都是对一个item类进行处理的过程class BaidustocksPipeline:    def process_item(self, item, spider):        return item# 定义一个专门用来处理的infoDict的方法class BaidustocksInfoPipeline(object):    def open_spider(self,spider):        self.f = open('BaiduStocksInfo.txt','w')    def close_spider(self,spider):        self.f.close()    # 最核心的,对每一个item的处理方法    def process_item(self,item,spider):        try:            line = str(dict(item)) + '\n'            self.f.write(line)        except:            pass        return item        # 如果需要别的函数也可以操作对应的item,就需要返回item对象

这一步千万别忘记,要给系统看的说明书中加上你写的pipeline类

在这里插入图片描述

在这里插入图片描述

总结
  • 虽然很想继续做下去,学下去,但是,真的很烦,作业好多,又要开始复习了
  • 这个教程应该没有将scrapy框架作为重点,我应该再继续学习对应的框架内容,好在以后的内容中用于实战

转载地址:http://kggpb.baihongyu.com/

你可能感兴趣的文章
MacBook Pro 外接显示器设置竖屏
查看>>
X264的参考帧设置
查看>>
三种帧的说明
查看>>
感知视频编码
查看>>
深度学习 vs 机器学习 vs 模式识别
查看>>
Tone mapping进化论
查看>>
XAVC
查看>>
详解HDR的三个标准——HLG/HDR10/Dolby Vision
查看>>
流言终结者 1080P全高清都等于高画质?
查看>>
PSNR指标值
查看>>
灰度图像-图像增强 中值滤波
查看>>
两种HDR格式(HLG, HDR10)的理解
查看>>
视频主观质量对比工具(Visual comparision tool based on ffplay)
查看>>
HDMI 接口及CEC信号
查看>>
H.264专利介绍
查看>>
YUV格式小结
查看>>
log4j2.xml实用例子
查看>>
Dockerfile中的CMD和ENTRYPOINT有什么区别?
查看>>
jQuery提示和技巧
查看>>
是否可以在Python中将长行分成多行[重复]
查看>>