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

本文介绍如何使用Scrapy框架爬取百度股票信息。首先,概述了Scrapy的组件和数据流过程,接着详细说明了创建Scrapy项目、编写`stocks.py`和`pipelines.py`文件的步骤。最后,代码运行后,结果将保存在txt文件中。
摘要由CSDN通过智能技术生成

关键字: Scrapy CSS选择器 爬虫

GitHub:https://github.com/utopianist/ScrapyBaiduStocks

课程url:http://www.icourse163.org/course/BIT-1001870001


前言

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

Scrapy爬虫框架

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

scrapy_architecture.png

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 的文件夹。

pycodes.png

打开 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 打开,下面我们来编写代码。

cmd_2018-11-05_12-03-57.png

stocks.py

import scrapy
import re

class 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.html

class 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)) + '\n'
            self.f.write(line)
        except:
            pass
        return item

BaiduStocksPipeline 有三个函数: open_itemclose_itemprocess_item

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值