Python定时爬取东方财富行情数据

这篇具有很好参考价值的文章主要介绍了Python定时爬取东方财富行情数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习主要内容:使用Python定时在非节假日爬取东方财富股行情数据存入数据库中,

东方财富行情中心网地址如下:

http://quote.eastmoney.com/center/gridlist.html#hs_a_board

python 爬取东方财富,python,python,开发语言,爬虫

东方财富行情中心网地址

通过点击该网站的下一页发现,网页内容在变化,但是网站的 URL 却不变,说明这里使用了 Ajax 技术,动态从服务器拉取数据,这种方式的好处是可以在不重新加载整幅网页的情况下更新部分数据,减轻网络负荷,加快页面加载速度。

通过 F12 来查看网络请求情况,可以很容易的发现,网页上的数据都是通过如下地址请求的:

http://38.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409036039385296142_1658838397275&pn=3&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1658838404848

python 爬取东方财富,python,python,开发语言,爬虫

Json及URL地址

接下来同过多次,来观察该地址的变化情况,发现其中的pn参数代表这页数,于是通过修改&pn=后面的数字来访问不同页面对应的数据:

import requests
import json
import os

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
}
json_url = "http://48.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112402508937289440778_1658838703304&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1658838703305"

res = requests.get(json_url, headers=headers)

接下来通过观察返回的数据,可以得出数据并不是标准的 json 数据,需要转换一下数据格式,于是先进行 json 化:

result = res.text.split("jQuery112402508937289440778_1658838703304")[1].split("(")[1].split(");")[0]
result_json = json.loads(result)
print(result_json)

这样数据就整齐多了,所有的股票数据都在data.diff下面,我们只需要编写解析函数即可

返回各参数对应含义。

先准备一个存储函数:

def save_data(data):
    # "股票代码,股票名称,最新价,涨跌幅,涨跌额,成交量(手),成交额,振幅,换手率,市盈率,量比,最高,最低,今开,昨收,市净率"
    for i in data:
        Code = i["f12"]
        Name = i["f14"]
        Close = i['f2'] if i["f2"] != "-" else None
        ChangePercent = i["f3"] if i["f3"] != "-" else None
        Change = i['f4'] if i["f4"] != "-" else None
        Volume = i['f5'] if i["f5"] != "-" else None
        Amount = i['f6'] if i["f6"] != "-" else None
        Amplitude = i['f7'] if i["f7"] != "-" else None
        TurnoverRate = i['f8'] if i["f8"] != "-" else None
        PERation = i['f9'] if i["f9"] != "-" else None
        VolumeRate = i['f10'] if i["f10"] != "-" else None
        Hign = i['f15'] if i["f15"] != "-" else None
        Low = i['f16'] if i["f16"] != "-" else None
        Open = i['f17'] if i["f17"] != "-" else None
        PreviousClose = i['f18'] if i["f18"] != "-" else None
        PB = i['f23'] if i["f23"] != "-" else None

然后再把前面处理好的 json 数据传入

stock_data = result_json['data']['diff']
save_data(stock_data)

这样我们就得到了第一页的股票数据,最后我们只需要循环抓取所有网页即可。

代码如下:

def craw_data():
    stock_data = []
    json_url1= "http://72.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112406903204148811937_1678420818118&pn=%s&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1678420818127" % str(
        1)
    res1 = requests.get(json_url1, headers=headers)
    result1 = res1.text.split("jQuery112406903204148811937_1678420818118")[1].split("(")[1].split(");")[0]
    result_json1 = json.loads(result1)
    total_value = result_json1['data']['total']
    maxn = math.ceil(total_value/20)

    for i in range(1, maxn + 1):
        json_url = "http://72.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112406903204148811937_1678420818118&pn=%s&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1678420818127" % str(
            i)
        res = requests.get(json_url, headers=headers)
        result = res.text.split("jQuery112406903204148811937_1678420818118")[1].split("(")[1].split(");")[0]
        result_json = json.loads(result)
        stock_data.extend(result_json['data']['diff'])
    return stock_data

最后,针对此块,全部python代码整合如下,在非节假日每天定时15:05分爬取,并存入Mysql数据库中:

import math
import requests
import json
import db
import time
import holidays
import datetime

headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
    }

def save_data(data):
    # "股票代码,股票名称,最新价,涨跌幅,涨跌额,成交量(手),成交额,振幅,换手率,市盈率,量比,最高,最低,今开,昨收,市净率"
    for i in data:
        Code = i["f12"]
        Name = i["f14"]
        Close = i['f2'] if i["f2"] != "-" else None
        ChangePercent = i["f3"] if i["f3"] != "-" else None
        Change = i['f4'] if i["f4"] != "-" else None
        Volume = i['f5'] if i["f5"] != "-" else None
        Amount = i['f6'] if i["f6"] != "-" else None
        Amplitude = i['f7'] if i["f7"] != "-" else None
        TurnoverRate = i['f8'] if i["f8"] != "-" else None
        PERation = i['f9'] if i["f9"] != "-" else None
        VolumeRate = i['f10'] if i["f10"] != "-" else None
        Hign = i['f15'] if i["f15"] != "-" else None
        Low = i['f16'] if i["f16"] != "-" else None
        Open = i['f17'] if i["f17"] != "-" else None
        PreviousClose = i['f18'] if i["f18"] != "-" else None
        PB = i['f23'] if i["f23"] != "-" else None
        insert_sql = """
            insert t_stock_code_price(code, name, close, change_percent, `change`, volume, amount, amplitude, turnover_rate, peration, volume_rate, hign, low, open, previous_close, pb, create_time)
            values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        """
        val = (Code, Name, Close, ChangePercent, Change, Volume, Amount, Amplitude,
            TurnoverRate, PERation, VolumeRate, Hign, Low, Open, PreviousClose, PB, datetime.now().strftime('%F'))
        db.insert_or_update_data(insert_sql, val)

def craw_data():
    stock_data = []
    json_url1= "http://72.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112406903204148811937_1678420818118&pn=%s&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1678420818127" % str(
        1)
    res1 = requests.get(json_url1, headers=headers)
    result1 = res1.text.split("jQuery112406903204148811937_1678420818118")[1].split("(")[1].split(");")[0]
    result_json1 = json.loads(result1)
    total_value = result_json1['data']['total']
    maxn = math.ceil(total_value/20)

    for i in range(1, maxn + 1):
        json_url = "http://72.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112406903204148811937_1678420818118&pn=%s&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1678420818127" % str(
            i)
        res = requests.get(json_url, headers=headers)
        result = res.text.split("jQuery112406903204148811937_1678420818118")[1].split("(")[1].split(");")[0]
        result_json = json.loads(result)
        stock_data.extend(result_json['data']['diff'])
    return stock_data

def craw():
    # print("运行爬取任务...")
    stock_data = craw_data()
    save_data(stock_data)

def is_business_day(date):
    cn_holidays = holidays.CountryHoliday('CN')
    return date.weekday() < 5 and date not in cn_holidays

def schedule_task():
    while True:
        now = datetime.datetime.now()
        target_time = now.replace(hour=15, minute=10, second=0, microsecond=0)

        if now >= target_time and is_business_day(now.date()):
            craw()

        # 计算下一个工作日的日期
        next_day = now + datetime.timedelta(days=1)
        while not is_business_day(next_day.date()):
            next_day += datetime.timedelta(days=1)

        # 计算下一个工作日的目标时间
        next_target_time = next_day.replace(hour=15, minute=5, second=0, microsecond=0)

        # 计算下一个任务运行的等待时间
        sleep_time = (next_target_time - datetime.datetime.now()).total_seconds()

        # 休眠等待下一个任务运行时间
        time.sleep(sleep_time)

if __name__ == "__main__":
    schedule_task()

其中db.py及mysql相关配置如下:

import pymysql

def get_conn():
    return pymysql.connect(
        host='localhost',
        user='root',
        password='1234',
        database='test',
        port=3306
    )

def query_data(sql):
    conn = get_conn()
    try:
        cursor = conn.cursor()
        cursor.execute(sql)
        return cursor.fetchall()
    finally:
        conn.close()

def insert_or_update_data(sql, val):
    conn = get_conn()
    try:
        cursor = conn.cursor()
        cursor.execute(sql,val)
        conn.commit()
    finally:
        conn.close()

mysql相关表结构如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_stock_code_price
-- ----------------------------
DROP TABLE IF EXISTS `t_stock_code_price`;
CREATE TABLE `t_stock_code_price` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票代码',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票名称',
  `close` double DEFAULT NULL COMMENT '最新价',
  `change_percent` double DEFAULT NULL COMMENT '涨跌幅',
  `change` double DEFAULT NULL COMMENT '涨跌额',
  `volume` double DEFAULT NULL COMMENT '成交量(手)',
  `amount` double DEFAULT NULL COMMENT '成交额',
  `amplitude` double DEFAULT NULL COMMENT '振幅',
  `turnover_rate` double DEFAULT NULL COMMENT '换手率',
  `peration` double DEFAULT NULL COMMENT '市盈率',
  `volume_rate` double DEFAULT NULL COMMENT '量比',
  `hign` double DEFAULT NULL COMMENT '最高',
  `low` double DEFAULT NULL COMMENT '最低',
  `open` double DEFAULT NULL COMMENT '今开',
  `previous_close` double DEFAULT NULL COMMENT '昨收',
  `pb` double DEFAULT NULL COMMENT '市净率',
  `create_time` varchar(64) NOT NULL COMMENT '写入时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

SET FOREIGN_KEY_CHECKS = 1;

以上即是全部内容。文章来源地址https://www.toymoban.com/news/detail-794558.html

到了这里,关于Python定时爬取东方财富行情数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫:如何使用Python爬取网站数据

    更新:2023-08-13 15:30 想要获取网站的数据?使用Python爬虫是一个绝佳的选择。Python爬虫是通过自动化程序来提取互联网上的信息。本文章将会详细介绍Python爬虫的相关技术。 在使用Python爬虫之前,我们需要理解网络协议和请求。HTTP是网络传输的重要协议,它是在Web浏览器和

    2024年02月13日
    浏览(49)
  • Python小姿势 - # 如何使用Python爬取网页数据

    如何使用Python爬取网页数据 今天我们来学习一下如何使用Python来爬取网页数据。 首先,我们需要准备一个空白的文件,在文件中输入以下代码: ``` import requests url = \\\'http://www.baidu.com\\\' r = requests.get(url) print(r.text) ``` 上面的代码中,我们首先导入了 requests 库,然后声明了一个

    2024年02月04日
    浏览(51)
  • Python小姿势 - Python爬取数据的库——Scrapy

    Python爬取数据的库——Scrapy 一、爬虫的基本原理 爬虫的基本原理就是模拟人的行为,使用指定的工具和方法访问网站,然后把网站上的内容抓取到本地来。 爬虫的基本步骤: 1、获取URL地址: 2、发送请求获取网页源码; 3、使用正则表达式提取信息; 4、保存数据。 二、爬

    2024年02月02日
    浏览(40)
  • python之websocket数据爬取

    WebSocket是一种广泛使用的互联网通信协议,可以在不同的浏览器和服务器之间进行实时的双向通信。WebSocket不需要通过HTTP请求来建立连接,它与HTTP的关系类似于TCP与IP的关系。在实际应用过程中,WebSocket通常被用来建立一个实时、低延迟、高吞吐量的数据传输管道。 在Pyth

    2024年02月16日
    浏览(35)
  • python爬取招聘网站数据

    这段代码是使用Selenium自动化测试模块进行网页爬取的示例代码。它通过模拟人的行为在浏览器中操作网页来实现爬取。具体的流程如下: 导入所需的模块,包括Selenium、时间、随机、csv等模块。 打开浏览器,创建一个Chrome浏览器实例。 设置要爬取的页数范围。 循环遍历每

    2024年02月02日
    浏览(68)
  • 如何利用python爬取网站数据

    Python是一种非常适合用于网络爬虫的编程语言,以下是Python爬取网站数据的步骤: 1. 确定目标网站和所需数据:首先要找到需要爬取数据的网站,确定你需要爬取的数据是哪一部分。 2. 发送请求:使用Python中的requests库向目标网站发送请求,获取网站的HTML源码。 3. 解析HTM

    2024年02月06日
    浏览(44)
  • Python爬虫—爬取微博评论数据

    今日,分享编写Python爬虫程序来实现微博评论数据的下载。 具体步骤如下👇👇👇: Step1 :电脑访问手机端微博_https://m.weibo.cn/_ Step2 :打开一条微博_https://m.weibo.cn/detail/4907031376694279_ Step3 :URL地址中的_49070__31376694279_就是需要爬取的微博ID Step4 :将ID填写到_main_下即可,也支

    2024年03月21日
    浏览(59)
  • python爬虫实战(1)--爬取新闻数据

    想要每天看到新闻数据又不想占用太多时间去整理,萌生自己抓取新闻网站的想法。 使用python语言可以快速实现,调用 BeautifulSoup 包里面的方法 安装BeautifulSoup 完成以后引入项目 定义请求头,方便把请求包装成正常的用户请求,防止被拒绝 定义被抓取的url,并请求加上请求

    2024年02月13日
    浏览(58)
  • 【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片

    个人主页 :为梦而生~ 关注我一起学习吧! 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 往期推荐 : 【Python爬虫开发基础⑦】urllib库的基本使用 【Python爬虫开发基础⑧】XPath库及其基本用法 我们在之前已经有8篇文章讲述基础知识了,下面我们

    2024年02月11日
    浏览(74)
  • Python爬取城市天气数据,并作数据可视化

    1.爬取广惠河深2022-2024年的天气数据  爬取的数据如下图所示     2.读取csv文件 3.去除多余字符 4.分割星期和日期 5.筛选出城市数据子集。其中包含了四个城市在不同天气下的天数统计结果。    6.将原有的天气类型按照划分 7.对城市的天气数据按照新天气列分组后,

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包