Python中使用Scrapy框架爬取股票代码的方法

个人博客: https://mypython.me

源码地址: https://github.com/geeeeeeeek/scrapy_stock

抓取工具:scrapy

scrapy 介绍

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取 API 所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

安装 scrapy

pip install Scrapy

抓取步骤

选择一个网站 --> 定义数据 --> 编写 spider

首先使用 scrapy 创建一个项目

scrapy startproject tutorial

1.选择一个网站

这里我们选择的是东方财富网的股票代码页面: http://quote.eastmoney.com/stocklist.html

2.定义要抓取的数据

我们需要抓取股票的代码 id,因此只需要定义 stock_id

class StockItem(scrapy.Item):
    stock_id = scrapy.Field()

3.编写 spider

class StockSpider(scrapy.Spider):
    name = 'stock'
def start_requests(self):
    url = 'http://quote.eastmoney.com/stocklist.html'
    yield Request(url)

def parse(self, response):
    item = StockItem()
    print "===============上海================"
    stocks_sh = response.css('div#quotesearch ul li a[href*="http://quote.eastmoney.com/sh"]::text')
    for stock in stocks_sh:
        item['stock_id'] = 's_sh' + re.findall('\((.*?)\)', stock.extract())[0]
        yield item

    print "===============深圳================"
    stocks_sz = response.css('div#quotesearch ul li a[href*="http://quote.eastmoney.com/sz"]::text')
    for stock in stocks_sz:
        item['stock_id'] = 's_sz' + re.findall('\((.*?)\)', stock.extract())[0]
        yield item

玄机尽在response.css('div#quotesearch ul li a[href*="http://quote.eastmoney.com/sh"]::text ’),使用了 css 来过滤自己需要的数据。

运行程序

scrapy crawl stock -o stock.csv

即可生成 stock.csv 文件

预览如下:

stock_id
s_sh201000
s_sh201001
s_sh201002
s_sh201003
s_sh201004
s_sh201005
s_sh201008
s_sh201009
s_sh201010
s_sh202001
s_sh202003
s_sh202007
s_sh203007
s_sh203008
s_sh203009
…

如果要查询单个股票的股票行情,可以使用新浪的股票接口:

http://hq.sinajs.cn

例如

http://hq.sinajs.cn/list=s_sh600756

即可得到浪潮软件的股票行情

var hq_str_s_sh600756="浪潮软件,19.790,1.140,6.11,365843,70869";

Python中使用Scrapy框架爬取股票代码的方法

6 回复

挺好的,加个 gitignore 文件把 pyc 文件都删掉


Python中使用Scrapy框架爬取股票代码的方法

用Scrapy爬股票代码,核心是解析目标网站的结构。这里以爬取东方财富网的沪深A股列表为例,直接上代码。

1. 创建项目

scrapy startproject stock_spider
cd stock_spider
scrapy genspider eastmoney quote.eastmoney.com

2. 编写爬虫(spiders/eastmoney.py)

import scrapy
import json

class EastmoneySpider(scrapy.Spider):
    name = 'eastmoney'
    allowed_domains = ['quote.eastmoney.com']
    
    # 东方财富沪深A股API接口(实际分析网站获得)
    start_urls = [
        'http://quote.eastmoney.com/center/api/sidemenu.json'
    ]
    
    def parse(self, response):
        # 解析接口返回的JSON数据
        data = json.loads(response.text)
        
        # 提取股票列表数据(具体路径根据实际API结构调整)
        stock_list = []
        for category in data['data']:
            if category['title'] == '沪深京A股':
                for stock in category['children']:
                    stock_list.append({
                        'code': stock['code'],      # 股票代码
                        'name': stock['name'],      # 股票名称
                        'pinyin': stock['pinyin']   # 拼音缩写
                    })
        
        # 输出结果
        for stock in stock_list:
            yield stock
            
        # 如果需要分页,可以在这里构造下一页请求
        # yield scrapy.Request(next_page_url, callback=self.parse)

3. 修改设置(settings.py

# 添加以下配置
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 16
DOWNLOAD_DELAY = 1  # 礼貌性延迟
FEED_EXPORT_ENCODING = 'utf-8'

4. 运行爬虫

# 输出为JSON文件
scrapy crawl eastmoney -o stocks.json

# 或者输出为CSV
scrapy crawl eastmoney -o stocks.csv

关键点说明:

  1. 目标分析:先用浏览器开发者工具查看股票列表的加载方式,发现东方财富用的是JSON接口
  2. 数据提取:直接解析JSON比用XPath/CSS选择器更简单
  3. 反爬处理:设置合理的User-Agent和下载延迟
  4. 数据存储:Scrapy支持JSON、CSV等多种格式,也可以写Pipeline存数据库

如果网站结构不同:比如是HTML页面,就用XPath提取:

# 示例:从HTML表格提取
def parse(self, response):
    rows = response.xpath('//table[@class="table"]/tr')
    for row in rows:
        yield {
            'code': row.xpath('./td[1]/text()').get(),
            'name': row.xpath('./td[2]/text()').get()
        }

总结:先分析网站数据加载方式,再选择合适的解析方法。

可以试试 tushare

老哥你好,最近在学 scrapy-splash,我的 splash 似乎没有起到渲染的作用,不知道是 splash 的问题还是网页的问题。
具体来说,是爬取一个表格,表头存在,表内容由 JS 函数填充。
网页: https://www.aqistudy.cn/historydata/daydata.php?city=%E6%AD%A6%E6%B1%89&month=201312
splash 版本:3.3.1
OS 版本:Windows 10 专业版

wait 多等几秒试试

scrapy-splash 用于处理动态请求,需要等待 js 加载完

回到顶部