如何从巨潮资讯爬取股票公告

2023-11-13

​​​​​​z如何做一个难以被反制的爬虫——Selenium+Python爬取新股材料实例

之前我写了上面这篇文章来说明如何从深交所或者上交所的网站爬取文件,但是这个爬虫是有点不稳定的,因为网速的原因。

偶然间我发现巨潮资讯已经整合了所需要的公告,因此又写了一个针对巨潮资讯的爬虫。

相较来说,这个爬虫简洁的多,稳定性也要好得多。但是还有很多可以提升的空间。

from selenium import webdriver
from time import sleep
import pandas as pd
import datetime
import os
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from tqdm import tqdm
import functools


def log(text):
    print('-' * 15)
    print(text)


def logging(func):
    def wrapper(*args, **kw):
        try:
            print('%s %s():' % ('excute', func.__name__))
            return func(*args, **kw)
        except Exception as e:
            print('错误明细是', e.__class__.__name__, e)
    return wrapper


class find_document_jc(object):

    def __init__(self, stock_list):
        self.done_list = []
        self.stock_list = stock_list
        self.stock_list_neat = [stock[-6:] for stock in self.stock_list]
        self.current_dir = os.getcwd()
        date = str(datetime.date.today())
        self.work_dir = os.path.join(self.current_dir, date)

        @logging
        def set_driver(self):
            download_dir = self.work_dir
            options = Options()
            options.page_load_strategy = 'normal'
            options.add_experimental_option('prefs', {
                "download.default_directory": download_dir,  # 更改默认下载地址
                "download.prompt_for_download": False,  # 自动下载文件
                "download.directory_upgrade": True,
                "plugins.always_open_pdf_externally": True  # 不直接在chrome内显示pdf
            })
            return options

        self.driver = webdriver.Chrome(options=set_driver(self))
        self.jc_web = 'http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search&lastPage=index'

    @logging
    def set_work_dir(self):
        work_dir = self.work_dir
        if not os.path.isdir(work_dir):
            os.mkdir(work_dir)
            log('创建文件夹“%s”' % work_dir)
        else:
            log('文件夹“%s”已存在' % work_dir)

    @logging
    def file_rename(self, file_name, work_dir):
        flag = 0
        while flag == 0:
            try:
                file_list = os.listdir(work_dir)
                file_list.sort(key=lambda fn: os.path.getmtime(work_dir + "\\" + fn))
                target_file = file_list[-1]
                old = os.path.join(work_dir, target_file)
                new = os.path.join(work_dir, file_name)
                assert target_file[-3:].lower() == 'pdf'
                flag = 1
                if not os.path.exists(new):
                    log('找到目标文件,开始改名')
                    print('From:' + old)
                    print('To:' + new)
                    os.renames(old, new)
                else:
                    log('文件已存在:' + new)
            except Exception as e:
                print('错误明细是', e.__class__.__name__, e)
                print('错误,等待三秒后重试:可能由于【文件未下载完成】或【文件已存在】导致')
                sleep(3)

    def jc_file_name(self, r, results):
        code = results[r - 2].text
        stock = results[r - 1].text
        file = results[r].text
        file_name = '_'.join([code, stock, file])
        return file_name


    @logging
    def jc_search(self):
        # 获取内容
        results = self.driver.find_elements(By.CLASS_NAME, 'ahover')
        flag = 0
        # 遍历内容
        for r, result in enumerate(results):
            text = result.text
            if '初步询价' in text:
                file_name = self.jc_file_name(r, results)
                print(f'正在下载:{file_name}')
                href = result.find_element(By.XPATH, './a').get_attribute('href')
                print('进入下载页面:' + href)
                self.driver.get(href)
                download_icon = self.driver.find_element(By.CLASS_NAME, 'icongonggaoxiazai')
                download_icon.click()
                self.done_list.append(text)
                sleep(5)
                flag = 1
                self.flag_search = 1
                break
        if flag != 1:
            self.driver.find_element(By.CLASS_NAME, 'btn-next').click()

    @logging
    def jc(self, stock, stock_neat):
        self.flag_search = 0
        _driver = self.driver
        _driver.get(self.jc_web)
        _driver.implicitly_wait(10)
        sleep(3)
        search_line = _driver.find_elements(By.CLASS_NAME, 'el-input__inner')
        search_line[2].send_keys(stock_neat)
        sleep(3)
        search_icon = _driver.find_element(By.CLASS_NAME, 'el-button--primary')
        search_icon.click()
        log(f'目标股票:{stock_neat}')
        print('开始搜索文件:')
        # 搜索文件
        while self.flag_search != 1:
            self.jc_search()
        file_name = stock + '.pdf'
        # 重命名文件
        self.file_rename(file_name, self.work_dir)
        sleep(5)
        # 下载文件

    @logging
    def get_document(self):
        # 整理股票顺序
        stock_list_neat = self.stock_list_neat
        print(stock_list_neat)
        # 遍历股票
        for stock, stock_neat in zip(tqdm(stock_list), stock_list_neat):
            # 检查股票代码
            assert stock[-6:] == stock_neat
            self.jc(stock=stock, stock_neat=stock_neat)
        sleep(10)
        self.driver.quit()
        log('已获取文件:')
        list(map(lambda x: print(x), self.done_list))


if __name__ == '__main__':
    stock_list = '424-2021-10-11-688553,425-2021-10-11-688737,426-2021-10-11-301082,427-2021-10-11-688255,' \
                 '428-2021-10-12-301087,429-2021-10-13-688211,430-2021-10-14-301090,431-2021-10-14-301088,' \
                 '432-2021-10-14-688280,433-2021-10-14-688257,434-2021-10-18-301093,435-2021-10-18-688739,' \
                 '436-2021-10-18-301092'.split(',')

    func = find_document_jc(stock_list=stock_list)
    func.get_document()

运行效果:

 “互联网精神”即:开放、平等、协作、快速、分享

对更多内容感兴趣欢迎关注我的个人公众号:梧承 Book House

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

如何从巨潮资讯爬取股票公告 的相关文章

随机推荐

  • 基本数据类型:浮点型、指针

    浮点数家族包括float double和long double类型 通常 这些类型分别提供单精度 双精度以及在某些支持扩展精度的机器上提供扩展精度 ANSI标准仅仅规定long double至少和double 一样长 而double至少和f
  • 如何创建Spring项目以及如何使用?

    目录 1 创建Spring项目 2 将对象存储在Spring中 3 从Spring中取出对象 4 使用对象 5 总结 Spring 就是 个包含了众多 具 法的 IoC 容器 它具备两个最基本的功能 将对象存储到容器 Spring 中 从容
  • 三层交换机 单臂路由 trunk access接口

    交换机 单独使用时条件比较苛刻 通信双方同一网段 同一网关 单臂路由和三层交换机可以实现跨网段通信 三层交换机 交换机和路由器兼并 可以设置VLAN 概念 分隔广播域 广播 一对多 人为进行切割 互不相干 逻辑分隔 属于代码 交换机 为了提
  • 简历中不写年龄、毕业院校、预期薪资会怎样?

    第五 自我评价 这一项与文凭一样 作者可能传达的意思是不要写在个人信息栏中 但很容易让人误解为不要写 这块真的需要看情况 如果你的自我评价非常好 那一定要提前曝光 展现 比如我的自我评价中会写到 全网博客访问量过千万 CSDN排名前100
  • C语言九九乘法表

    C语言编程实现九九乘法表 样式要求长方形 右三角形 左三角形 解题思路 这个问题的算法很简单 就是两个for循环的嵌套 三角形的样式就是多了一些空格 长方形源代码演示 include
  • 国内企业CAE仿真的作用和特点

    在知乎上看到某前辈所写的国内CAE仿真的现状的回答 觉得其将国内企业CAE仿真的作用和特点分析的很到位 询问可以转发之后 就转发到自己的博客中 希望也能给刚从事CAE仿真的同行一点帮助 知乎原文链接聊一聊国内CAE领域的现状吧 知乎 zhi
  • jar包中的文件找不到对应的地址的解决方法

    对于本地的地址 测试时可以 一上到服务环境 就报错 xml的文件地址找不到 于是也找了好多网上的方式解决 但始终解决不了 于是在一次偶然机会 找到了一种方式 反射流的方式 解决 InputStream inputStream ClassUt
  • Qt Install FrameWork——Qt打包工具

    主要介绍三部分内容 Qt Install FrameWork安装 打包程序 程序安装 环境配置 一 Qt Install FrameWork安装 两种方式 编译源码 安装预编译好的Installer 推荐安装预编译好的Installer 下
  • FreeRTOS的学习(二)——队列的介绍和操作

    目录 队列的简介 任务对队列的操作 读取队列中的消息 向队列中发送消息 队列结构体 队列创建 1 函数 xQueueCreate 动态创建队列 函数原型 参数 返回值 2 函数 xQueueCreateStatic 静态创建队列 函数原型
  • C++ cout << “\n“与 cout << endl的一个区别

    一句话概括 n 不会终止setw的计算 endl会 实际场景 代码1 include
  • MySQL必知必会 学习笔记 第十八章 全文本搜索

    并非所有引擎都支持全文本搜索 MyISAM支持 更新 1 MySQL 5 6 以前的版本 只有 MyISAM 存储引擎支持全文索引 2 MySQL 5 6 及以后的版本 MyISAM 和 InnoDB 存储引擎均支持全文索引 3 只有字段的
  • idea自定义注释模板方法名、参数、返回类型为空的问题

    重点的地方 在你的方法上输入 然后加上模板的名称 param和retrun才不会为空 如果你直接模板的名称 按键就会为空 https blog csdn net weixin 39591795 article details 7884442
  • 如何给Winform 的Panel控件添加滚动条

    真是太笨了 刚想起来 Panel控件还有一个AutoScoll属性 直接修改为true即可 添加Panel控件的如下两个事件即可 当然 只是添加的竖向滚动条 横向滚动条只需把VerticalScroll改为HorizontalScroll即
  • linux进阶-运维自动化工具之ansible

    文章目录 云计算运维工程师核心职能 ansible特性 ansible架构 ansible组成部分 ansible命令执行来源 ansible使用注意事项 ansible安装和入门 epel源的rpm包安装 编译安装 git方式 pip安装
  • ConvertException: Unsupported source type: class java.lang.String

    项目上遇到 文件异步上传时会把不符合标准的数据放入redis 然后隔几秒去请求redis里面的数据 但是时不时会出现ConvertException Unsupported source type class java lang Strin
  • tensorflow报错总结

    项目场景 tensorflow 版本 不兼容产生的报错 问题描述 1 AttributeError module tensorflow has no attribute random uniform 解决办法 tf2 0中用tf rando
  • 使用rancher在k8s上完成第一个CI/CD的项目_.NET篇

    隔了几天没写了 一是忙的不行 二是遇到一个问题一直没解决 我们自己搭建的harbor仓库是没有域名的 也没做nginx转发 所以都是http请求的 构建项目时会在两个地方遇到关于docker访问http仓库不通的问题 第一个 构建成功pus
  • Hadoop集群——shell自动采集文件到HDFS

    1 配置环境变量 在 export data logs目录下 目录不存在 则先提前创建该目录 使用vi命令创建 upload2HDFS sh脚本文件 在编写Shell脚本时 需要设置Java环境变量 即使当前虚拟 机节点已经配置了Java环
  • windows10下navicat 无限使用小技巧

    windows10下navicat 无限次使用小技巧 1 首先win R 输入regedit 2 找到HKEY CURRENT USER gt Software gt Classes gt CLSID gt 下面文件夹中有info的删除掉
  • 如何从巨潮资讯爬取股票公告

    z如何做一个难以被反制的爬虫 Selenium Python爬取新股材料实例 之前我写了上面这篇文章来说明如何从深交所或者上交所的网站爬取文件 但是这个爬虫是有点不稳定的 因为网速的原因 偶然间我发现巨潮资讯已经整合了所需要的公告 因此又写