Scrapy实战案例--抓取股票数据并存入SQL数据库(JS逆向)

2023-11-07

目标网址:http://webapi.cninfo.com.cn/#/marketDataZhishu

之前在这篇文章里面对该网站的JS进行了一个逆向的解析:JS逆向解析案例

接下来我们来创建一个Scrapy项目来爬取某潮的数据并保存在数据库中

过程:

1、创建一个Scrapy项目

2、将之前用于解析的JS文件放入项目中

3、修改items.py文件,添加要爬取的数据表

4、配置参数,修改setting.py

5、补充spiders文件夹下的核心文件

6、进入自己的数据库、创建数据表

7、写入管道文件pipelines.py,用于保存数据到SQL中

效果截图:

一、创建一个Scrapy项目:

1、打开cmd,用cd命令移动到需要创建项目的位置,

2、输入 :scrapy startproject 项目名。来创建项目

3、cd到创建好的项目目录下

      cmd下输入:scrapy genspider 爬虫名 爬取网站的域名

即scrapy genspider 爬虫名 cninfo.com.cn

域名不知道怎么查的可以在这cninfo.com.cn的Whois信息 - 站长工具点击whois然后复制网址过去就能得到该网站的域名

 二、将之前用于解析的JS文件放入项目中

新建一个JS文件夹,将解析用的js文件放入文件夹中。

js代码(这部分具体怎么来的可以看一下我的上一篇文章JS逆向解析-巨潮):

/* 通过这个函数获取
var indexcode={
    getResCode:function(){
        var time=Math.floor(new Date().getTime()/1000);
        return window.JSonToCSV.missjson(""+time);
    }
}
从这可以知道最终调用了.missjson(""+time)
*/
// 这里要将函数改一下格式
function missjson(input) {
    var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv"   + "wxyz0123456789+/" + "=";
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;
    do {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;
        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }
        output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2)
                + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = "";
    } while (i < input.length);

    return output;
}

注意:除了js文件之外其他的都是自动生成的,手动创建的话会报错的。

 三、修改items.py文件,添加要爬取的数据表

先看一下能爬取的数据:

 选取直接想要爬取的数据添加在items.py文件中,用scrapy.Field()传输数据

items.py部分代码:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class GupiaoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    Transaction_date = scrapy.Field()        # 交易日期
    Opening_price = scrapy.Field()           # 开盘价
    Number_of_transactions = scrapy.Field()  # 成交数量
    Closing_price = scrapy.Field()           # 收盘价
    minimum_price = scrapy.Field()           # 最低价
    Highest_price = scrapy.Field()           # 最高价
    Securities_code = scrapy.Field()         # 证券代码
    Securities_abbreviation = scrapy.Field() # 证券简称
    pass
'''
爬取数据示例
交易所: "SZE"
交易日期: "2022-04-13"
币种: "CNY"
开盘价: 15.89
成交数量: 89062806
成交金额: 1415496125.98
收盘价: 15.8
最低价: 15.72
最高价: 16.08
涨跌: -0.12
涨跌幅: -0.7538
证券代码: "000001-SZE"
证券简称: "平安银行"
'''

四、修改设置文件setting.py

在setting.py文件中修改头部UA、参数等等,屏蔽爬虫日志、同时开启管道pipelines

# Scrapy settings for gupiao project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html


BOT_NAME = 'gupiao'

SPIDER_MODULES = ['gupiao.spiders']
NEWSPIDER_MODULE = 'gupiao.spiders'

# ------------------获取mcode值----------------------------
import execjs
import js2py
# 调用js文件
with open('E:/爬虫爬虫/Scrapy/gupiao/gupiao/js/123.js', 'r', encoding='utf-8')as f:
    read_js = f.read()
return_js = execjs.compile(read_js)  #
# 用来获取time参数
time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')
mcode = return_js.call('missjson', '{}'.format(time1))
# ------------------获取mcode值----------------------------

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'

DEFAULT_REQUEST_HEADERS = {
    'mcode': mcode,
    'Referer': 'http://webapi.cninfo.com.cn/',
}

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

# 屏蔽掉爬虫日志
LOG_LEVEL="WARNING"

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    # 开启管道
   'gupiao.pipelines.GupiaoPipeline': 300,
}

五、补充spiders文件夹下的文件

到这一步我们在爬取前需要准备的数据基本已经准备完成了,接下来补充spiders文件夹下的主文件开始爬取网站

import scrapy
from gupiao.items import GupiaoItem     # 获取存储的参数列表

class JuchaoSpider(scrapy.Spider):
    name = 'juchao'
    allowed_domains = ['cninfo.com.cn']
    start_urls = ['http://cninfo.com.cn/']

    def start_requests(self):
        data1 = {          # 通过创建的data1字典来构造Form Data表单数据
            'tdate': '2022-04-12',
            'market': 'SZE',
        }
        url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1007'
        # POST请求,所以使用scrapy.FormRequest()方法来发送网络请求
        # 发送完后通过回调函数callback来将响应内容返回给parse()方法
        yield scrapy.FormRequest(url=url,formdata=data1,callback=self.parse)

    def parse(self, response):
        p = response.json()
        if p != None:       # 防止取到空
            pda = p.get('records')      # 获取json文件下参数的对应位置
            for i in pda:
                item = GupiaoItem()
                item['Transaction_date'] = i.get('交易日期')
                item['Opening_price'] = i.get('开盘价')
                item['Number_of_transactions'] = i.get('成交数量')
                item['Closing_price'] = i.get('收盘价')
                item['minimum_price'] = i.get('最低价')
                item['Highest_price'] = i.get('最高价')
                item['Securities_code'] = i.get('证券代码')
                item['Securities_abbreviation'] = i.get('证券简称')
                yield item

六、进入数据库、创建数据表

1、进入数据库:cmd中输入  mysql -u root -p        输入账号密码

2、创建数据库用于存储:create database 表名;

3、选择数据库、创建数据表:(这里注意一点,表下的字段一定要跟上面的对应得上)

use 表名;

create table 表名(

    Transaction_date varchar(32),

    Opening_price varchar(32),

    Number_of_transactions varchar(32),

    Closing_price varchar(32),

    minimum_price varchar(32),

    Highest_price varchar(32),

    Securities_code varchar(32),

    Securities_abbreviation varchar(32));

 

 七、写入管道文件pipelines.py,用于保存数据到SQL中

代码:

import pymysql

class GupiaoPipeline:
    conn = None
    cursor = None
    def open_spider(self,spider):
        print('爬虫开始!!!')
        # 登录sql
        self.conn=pymysql.Connection(host='localhost',user='root',passwd='123456',db='juchao')

    def process_item(self,item,spider):
        print(list(item.values()))
        self.cursor=self.conn.cursor()
        # 写入数据库
        sql2 = "insert into gupiao(Transaction_date,Opening_price,Number_of_transactions,Closing_price,minimum_price,Highest_price,Securities_code,Securities_abbreviation) value(%s,%s,%s,%s,%s,%s,%s,%s);"
        # 这一块用来测试输出一下
        '''        
        for i in a:
            print(i)
        '''
        self.cursor.execute(sql2,list(item.values()))   # 执行sql语句,将item的值赋予sql中
        self.conn.commit()


    def close_spider(self,spider):
        print('爬虫结束!!!')
        self.cursor.close()

八、运行Scrapy文件

在根目录下cmd输入:scrapy crawl 爬虫名        来启用爬虫

运行效果截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy实战案例--抓取股票数据并存入SQL数据库(JS逆向) 的相关文章

随机推荐

  • Python操作SQL中json格式的问题

    1 json中的引号必须使用双引号 在mysql中双引号和单引号可以互换 但不可混合使用 需成对出现 mysql支持存储json格式数据 但是写入时json内容中引号必须使用双引号 否则出现下述错误 pymysql err Operatio
  • 超分辨率基础

    超分辨率综述 Image Super resolution 的深度学习方法 微信二维码引擎OpenCV开源 微信扫码背后的图像超分辨率技术 技术解析 即构移动端超分辨率技术 DIV2K数据集下载 B100 Manga109 Set5 Set
  • firefly框架分析之netconnect package(一)

    firefly下的目录结构如下 里面的各个包将会一一的介绍 今天先开始看看netconnect包 该包下面这些模块从connection开始 Connection py 与客户端的连接对象 通过其与客户端通讯 向客户端发送封装过的数据 还可
  • Qt源码解析1---D指针原理

    D指针 什么是d指针 如果你已经看过到Qt源文件像QLablel QPicture QLabel picture const Q D const QLabel if d gt picture return d gt picture retu
  • ChatGPT的接口在哪

    ChatGPT本身不是一个独立的接口 而是一个预训练的自然语言处理模型 如果您需要使用ChatGPT来实现某个自然语言处理任务 例如文本生成 问答等 您可以使用Python中的深度学习框架 如TensorFlow PyTorch 加载预训练
  • 谈我对于ajax的理解

    Ajax的全称是Asynchronous JavaScript and XML 中文名称定义为异步的JavaScript和XML Ajax是Web2 0技术的核心由多种技术集合而成 使用Ajax技术不必刷新整个页面 只需对页面的局部进行更新
  • qt 信号槽默认参数 toggled 和 trigger的区别

    toggled和trigger区别 1 toggle 类似开关 具有2个状态 打开 关闭 使用这个信号 是在这2个状态之间切换 2 trigger是一次性的 点击后 无法改变状态 要么是打开 要么是关闭 参考 http blog csdn
  • c# 对txt文件的读取与写入

    C txt文件分析 读取与写入 c 中对txt文件的读取写入在工作中用到的很多 今天写一个之前工作中用到的小demo 案例场景要求 txt文件中为很多条标记时间戳的报文 需要计算出每条报文从开始接收到结束用了多长时间 案例执行 如txt文件
  • Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法 为什么要学习数据结构和算法 这里我举个简单的例子 编程好比是一辆汽车 而数据结构和算法是汽车内部的变速箱 一个开车的人不懂变速箱的原理也是能开车的 同理一个不懂数据结构和算法的人也能编程 但是如果一个开车
  • apk文件 -- 反编译

    源博客 https www cnblogs com mfrbuaa p 4588057 html 编译工具 apktool 资源文件获取 能够提取出图片文件和布局文件进行使用查看 dex2jar 将apk反编译成java源代码 classe
  • Python中多线程和线程池的使用方法

    Python是一种高级编程语言 它在众多编程语言中 拥有极高的人气和使用率 Python中的多线程和线程池是其强大的功能之一 可以让我们更加高效地利用CPU资源 提高程序的运行速度 本篇博客将介绍Python中多线程和线程池的使用方法 并提
  • ad9361收发异常问题分析

    最近在调试ad9361 发送都调试好了 但是接收一直没调试好 折腾了一个多月才搞定接收 根据官方提供的api代码 需要修改的有 1 修改reference clk rate参考时钟 2 修改xo disable use ext refclk
  • CTF——被改错的密码

    http ctf idf cn index php g game m article a index id 29 cca9cc444e64c8116a30la00559c042b4看着像一串MD5加密 但是实际不是 去掉中间的l 进行md5
  • 新手小白一看就懂的Excel技能之入门基础

    很多同学开开心心拿到新买的电脑 开机一看 桌面干干净净的 想打开Excel 半天找不到 这些痛 只有新手小白才能懂 今天 我给大家好好讲讲怎么使用Excel 鼠标左键点击电脑桌面左下角的 搜索 输入 Excel 看到 Microsoft O
  • 过拟合现象,原因,以及降低过拟合的方法

    一 什么是过拟合 为什么要避免过拟合 图1 1 Overfit Normal 上图是一张使用线性回归拟合二维样本数据的matlab输出图片 其中Normal曲线是使用使用了带参数空间限制的最小二乘法进行求解的模型 Overfit曲线是使用最
  • 微服务中常用的注解

    注解的定义 Annotation 注解 用于为Java代码提供元数据 简单理解注解可以看做是一个个标签 用来标记代码 是一种应用于类 方法 参数 变量 构造器及包的一种特殊修饰符 1 Target 表示该注解类型所使用的程序元素类型 结合E
  • 机器学习实践(一)—sklearn之概述

    1956年 人工智能元年 人类能够创造出人类还未知的东西 这未知的东西人类能够保证它不误入歧途吗 一 机器学习和人工智能 深度学习的关系 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 二 机器学习 深度学习的应用场
  • Office 2019 for Mac 安装

    1 下载微软官方Office 2019 for Mac 64位 大小 1 7G 2 按照提示安装Office 2019 for Mac 3 下载14743217 Microsoft Office 2019 VL Serializer安装器
  • 发qq邮件被对方服务器拒绝,QQ被对方拉黑了。我发QQ邮件对对方能收到吗?

    QQ被对方拉黑了 我发QQ邮件对对方能收到吗 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 QQ被对方拉黑了 我发QQ邮件对对方能收到吗 拉黑删除能收到的 邮件
  • Scrapy实战案例--抓取股票数据并存入SQL数据库(JS逆向)

    目标网址 http webapi cninfo com cn marketDataZhishu 之前在这篇文章里面对该网站的JS进行了一个逆向的解析 JS逆向解析案例 接下来我们来创建一个Scrapy项目来爬取某潮的数据并保存在数据库中 过