【爬虫实战】2.多线程批量下载+多线程PDF转TXT(另附2010-2021A股TXT年报下载)

2023-10-15 00:50

本文主要是介绍【爬虫实战】2.多线程批量下载+多线程PDF转TXT(另附2010-2021A股TXT年报下载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.项目分析

数据来源:excel表格文件

项目需求:从excel表格中批量下载pdf版本的年报,将其命名为"股票代码_公司简称_ 年份"的格式,并全部转为txt文件。

使用语言:python

第三方库:pandas,requests, re , pdfplumber,time等。

实现思路:

  • 由于企业年报文件众多,需要加入多线程来改善程序运行速度;
  • 企业年报下载后体积较大,在转换为txt文件后清理原有pdf文件(可选);
  • 出于效率考虑,将下载与转换操作合并,读者亦可自行调整代码分离处理。

2. 具体步骤

1.准备工作

由于数据保存在excel文件中,所以第一步从读取数据入手,本文采用pandas库处理excel表格,其他第三库亦可。

import requests
import pandas as pd
import os
import multiprocessing
import pdfplumber
import logging
import relogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 读取Excel文件
try:df = pd.read_excel('年报_2015.xlsx')
except Exception as e:logging.error(f"读取失败!! {e}")return

下图为原始excel文件数据,我们可以用标题名称来作为查找名,并设置对应的变量。
在这里插入图片描述

# 读取文件内容并存储为字典
content_dict = ((row['公司代码'], row['公司简称'], row['年份'], row['年报链接']) for _, row in df.iterrows())
# 我们分别用code, name, year, pdf_url四个变量来接受这些值

在设置好变量后,还需要设置文件目录,用来存放下载的pdf文件和我们需要的txt文件,因此我们创建两个文件夹。

# 创建存储文件的文件夹
pdf_dir = 'pdf年报'
txt_dir = 'txt年报'
try:os.makedirs(pdf_dir, exist_ok=True)os.makedirs(txt_dir, exist_ok=True)
except Exception as e:logging.error(f"创建文件夹失败!请检查权限! {e}")return

2.多线程操作

前面提到,由于表格中的文件比较庞大,直接运行速度过于缓慢,需要加入多线程来提高效率,而且笔者将下载与转换都一次性处理,在分配一个线程进行,逻辑如下图所示。
在这里插入图片描述

多线程具体代码如下,我们开启一个线程池(网络上有很多人讲,这里不赘述),并加入了检查文件是否存在的功能,以防止程序意外中断后,会重复进行下载操作。

如果检测到文件不存在,则调用convert()函数进行下载和转换操作。

#开启多线程
with multiprocessing.Pool() as pool:for code, name, year, pdf_url in content_dict:txt_file_name = f"{code}_{name}_{year}.txt"txt_file_path = os.path.join(txt_dir, txt_file_name)#检测文件是否已经存在if os.path.exists(txt_file_path):logging.info(f"{txt_file_name} 已存在,跳过.")else:pool.apply_async(convert, args=(code, name, year, pdf_url, pdf_dir, txt_dir))pool.close()pool.join()

3.下载和转换

接下来的任务写好convert函数即可,这里这直接给出完整代码。

def convert(code, name, year, pdf_url, pdf_dir, txt_dir):pdf_file_path = os.path.join(pdf_dir, f"{code}_{name}_{year}.pdf")txt_file_path = os.path.join(txt_dir, re.sub(r'[\\/:*?"<>|]', '', f"{code}_{name}_{year}.txt"))try:# 下载PDF文件if not os.path.exists(pdf_file_path):with requests.get(pdf_url, stream=True) as r:r.raise_for_status()with open(pdf_file_path, 'wb') as f:for chunk in r.iter_content(chunk_size=8192):f.write(chunk)# 转换PDF文件为TXT文件with pdfplumber.open(pdf_file_path) as pdf:with open(txt_file_path, 'w', encoding='utf-8') as f:for page in pdf.pages:text = page.extract_text()f.write(text)logging.info(f"{txt_file_path} 已保存.")except Exception as e:logging.error(f"出错了- {code}_{name}_{year}. {e}")else:# 删除已转换的PDF文件,以节省空间os.remove(pdf_file_path)logging.info(f"{pdf_file_path} 已被删除。")

具体来说,第一步是根据输入参数构造出 pdf文件的完整路径和 txt文件的完整路径。这里使用了 Python 的 os.path.join 函数来拼接文件路径,以及 re.sub 函数来去除文件名中的非法字符。

接下来就是用 requests 库从 pdf_url 下载文件,并将其保存在 pdf_file_path 中。下载的过程中,函数会以 8192 字节为一块,依次将文件块写入本地文件。

如果 pdf文件下载成功,我们使用 pdfplumber 库将 其转换为txt文件。

最后,函数会删除已经转换成功的 pdf文件,这样就大功告成了~


3.成果展示

经过整理,得到了如下txt文本,可以看到txt文本内容与原内容一致,便于我们之后进行词频分析。
在这里插入图片描述
在这里插入图片描述

文本挖掘是财经类学术研究的常用方式,特别是借助上市公司年报进行词频分析的应用十分广泛。
若要获取完整代码文件,或者2010-2021的txt年报下载链接,可以关注同名公众号“凌小添”回复‘年报’获取哦~

这篇关于【爬虫实战】2.多线程批量下载+多线程PDF转TXT(另附2010-2021A股TXT年报下载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/214274

相关文章

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1