经典爬虫:用Scrapy爬取百度股票

前言

今天我们编写一个用 Scrapy 框架来爬取百度股票的代码,之前写过一篇爬取百度股票的文章(点我),代码的逻辑和这篇文章的逻辑是一样的,用到的解析器不同罢了。

Scrapy 爬虫框架

Scrapy 爬虫框架是由 7+2 的结构构成: 引擎(Scrapy Engine)调度器(Schedule)下载器(Downloader)爬虫(Spider)项目通道(Item Pipeline)下载中间器(Downloader Middlewares)爬虫中间器(Spider Middlewares)


Scrapy 中的数据流(Data flow)由执行引擎控制,如下所示:

  1. 引擎Spider 中获得需要爬取初始的 Requests 。
  2. 引擎调度器 中调度 Requests 并询问下一个需要爬取的 Requests 。
  3. 调度器引擎 返回下一个要爬取的 Requests。
  4. 引擎 通过 下载中间器 把这个 Requests 传递给 下载器
  5. 一旦页面下载完毕,下载器 生成一个 Response (包含那个页面),并通过 下载中间件 把它传递给引擎。
  6. 引擎下载器 中接收 Response ,通过 爬虫中间件 的处理传递给 Spider
  7. Spider 处理完 Response 后,通过 爬虫中间件引擎 返回生成的 items 和新的 Requests (如果有的话)。
  8. 引擎 把 items 传递给 Item Pipelines ,并把处理过的 Requests 传递给 调度器 ,询问新的 requests。
  9. 程序从步骤 1 开始重复,直到 调度器 中不再有更多的请求为止。

更多 Scrapy 信息参考官方文档:

URL:https://scrapy.org/

创建 Scrapy 项目

在电脑配置好 Scrapy 后,

D 盘 创建名为 pycodes 的文件夹。


打开 cmd 命令窗口,进入 D 盘 根目录后键入:

  1. cd d:pycodes 进入目录。
  2. scrapy startproject BaiduStocks 创建名为 BaiduStocks 的目录。
  3. cd BaiduStocks 进入项目目录。
  4. scrapy genspider stocks baidu.com 创建一个名为 stocks 的 .py 文件,爬虫的初始 URL 为 baidu.com 。
  5. BaiduStocks 文件夹下找到 stocks.py 文件后用 IDE 打开,下面我们来编写代码。



stocks.py

import scrapyimport reclass stocksSpider(scrapy.Spider):
 name = 'stocks'
 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('[s][zh]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, response):
 infoDict = {}
 stockInfo = response.css('.stock-bets') #只搜索'.stock-bets'标签下的'dt'和'dd'标签
 stockname = stockInfo.css('.bets-name').extract()
 keyList = stockInfo.css('dt').extract()
 valueList = stockInfo.css('dd').extract()
 for i in range(len(keyList)):
 key = re.findall('<dt.*?>(.*?)</dt>', keyList)[0]
 try:
 value = re.findall('<dd.*?>(.*?)</dd>', valueList)[0]
 except:
 value = '--'
 infoDict[key] = value
 infoDict.update({'股票名称': re.findall('<a.*?">(.*?)(<span.*?)', stockname)})
 yield infoDict
复制代码
  • parse 函数用到关键字 yield ,由于 parse 函数生成的股票 URL 超过 4500 个,如果以列表形式传递给 parse_stocks , 给内存造成的负担会更大。
  • 在文件夹 BaiduStocks 下找到 pipelines.py ,用 IDE 打开。

pipelines.py

# -*- coding: utf-8 -*-# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlclass BaidustocksPipeline(object):
 def open_item(self, spider):
 self.f = open('baiduStockInfo.txt', 'w')
 def close_item(self, spider):
 self.f.close()
 def process_item(self, item, spider):
 try:
 line = str(dict(item)) + '
'
 self.f.write(line)
 except:
 pass
 return item
复制代码

类 BaiduStocksPipeline 有三个函数: open_item 、 close_item 、 process_item 。

至此,代码编写完成,运行程序,结果会保存在一个名为 baiduStockInfo 的 txt 文件中


转载于:https://juejin.im/post/5be6e0f0e51d450aa46c8746

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值