Web Spider NEX XX国际货币经纪 – PDF下载 & 解析


首先声明: 此次案例只为学习交流使用,切勿用于其他非法用途

文章目录

  • Web Spider NEX XX国际货币经纪 – PDF下载 & 解析
  • 前言
  • 一、任务说明
    • 1.PDF下载
    • 2.PDF解析提取关键词数据
  • 二、Pip模块安装
  • 三、网站分析
  • 四、核心代码注释
    • 1.创建2019年1月1日-至今的时间字符串,存入列表中
    • 2.pdf下载
    • 3.pdf读取解析
  • 五、运行结果
  • 六、示例代码
  • 总结

前言

目标网站:https://www.cfets-nex.com.cn/


提示:以下是本篇文章正文内容,下面案例可供参考

一、任务说明

1.PDF下载

提示:下载2019年1月1日-至今的”银行间货币市场”PDF文件
下图网址:https://www.cfets-nex.com.cn/Market/marketOverview/dailyReview

2.PDF解析提取关键词数据

提取关键词数据说明

  • 提取下图标红框处位置的内容,如果不存在则赋值”None”;
  • 红框处1:以”今日资金面”开头,句号(。)结束;
  • 红框处2:以”资金面情绪指数”开头,换行(\n)结束;
  • 以上为主要的提取部分,有些开头的关键词不同,需要另外写点匹配规则,参考案例;

提示:如果有更好的提取方式可以在评论处留言或者私信我,让我们在IT社区平台共同进步,感谢!

二、Pip模块安装

镜像地址

  • 清华:https://pypi.tuna.tsinghua.edu.cn/simple
  • 阿里云:http://mirrors.aliyun.com/pypi/simple/
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  • 华中理工大学:http://pypi.hustunique.com/
  • 山东理工大学:http://pypi.sdutlinux.org/
  • 豆瓣:http://pypi.douban.com/simple/

案例使用到的模块以及对应版本

  • pandas==1.1.3
  • PyPDF2==2.12.1
  • requests==2.27.0

pip指定模块安装:pip install 模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip指定requirements.txt文件安装:pip install -i https://pypi.doubanio.com/simple/ -r requirements.txt

三、网站分析

1、打开链接,可以发现一个规律,每天收盘日评的网站链接是由相应的日期字符串组成;
链接后面的时间字符串为:2022/12/15

链接后面的时间字符串为:2022/12/16
2、按F12进入开发者模式,可以直接看到PDF的链接,直接请求网站就完事了;
标签a的href:/Cms_Data/Contents/Site2019/Folders/Daily/~contents/XBVJCVJ4Q8QG9A9L/MM.pdf
根据经验前缀需要加上:https://www.cfets-nex.com.cn
组合后可以直接打开PDF:https://www.cfets-nex.com.cn/Cms_Data/Contents/Site2019/Folders/Daily/~contents/XBVJCVJ4Q8QG9A9L/MM.pdf

四、核心代码注释

1.创建2019年1月1日-至今的时间字符串,存入列表中

import datetimestart_string = '2019-01-01'def create_date_list():    start_date = datetime.datetime.strptime(start_string , "%Y-%m-%d")  # 将指定的字符串转为时间格式    now_date = (datetime.datetime.now()).strftime("%Y-%m-%d")  # 获取当前的时间    date_string_list = list()    i = 0    while True:        date_i = (start_date + datetime.timedelta(days=i)).strftime('%Y-%m-%d')        date_string = str(date_i).replace('-', '/')        print("创建时间字符串 - 存储成功:", date_string)        date_string_list.append(date_string)        if date_i < now_date:            i += 1        else:            break    return date_string_list

2.pdf下载

import requestsheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}def pdf_download():    file_path = "result.pdf"    pdf_url = 'https://xxxx.pdf'    response = requests.get(url=pdf_url, headers=headers, timeout=5)    with open(file_path, 'wb') as fis:        for chunk in response.iter_content(chunk_size=1000):            fis.write(chunk)            fis.flush()        print(f'下载完成:{file_path}')    return True

3.pdf读取解析

import PyPDF2pdffile = open(file=file_path, mode='rb')  # 读取pdf文件;pdfreader = PyPDF2.PdfFileReader(pdffile)pdf_content = ''for i in range(pdfreader.numPages):  # 获取pdf的总页数;    page_content = pdfreader.getPage(i)  # 获取第i页的对象;    pdf_content += page_content.extractText()  # 提取第i页的对象内容,字符串类型;parse(pdf_content) # 自定义一个解析内容的方法,根据自己的需求提取相应的内容;

五、运行结果



六、示例代码

import osimport reimport timeimport PyPDF2import datetimeimport requestsimport pandas as pdfrom requests import exceptions as request_exceptionsclass SHICEconomy(object):    def __init__(self):        self.headers = {            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '                          'Chrome/95.0.4638.69 Safari/537.36'        }        self.start_string = '2019-01-01'        self.resource_path = 'resource'        self.result_file_path = 'result.csv'    def create_date_list(self):        start_date = datetime.datetime.strptime(self.start_string, "%Y-%m-%d")  # 将指定的字符串转为时间格式        now_date = (datetime.datetime.now()).strftime("%Y-%m-%d")  # 获取当前的时间        date_string_list = list()        i = 0        while True:            date_i = (start_date + datetime.timedelta(days=i)).strftime('%Y-%m-%d')            date_string = str(date_i).replace('-', '/')            print("创建时间字符串 - 存储成功:", date_string)            date_string_list.append(date_string)            if date_i < now_date:                i += 1            else:                break        return date_string_list    def request_server(self, url):        request_count = 0        request_total = 3        result = {'status': False}        while request_count < request_total:            try:                response = requests.get(url=url, headers=self.headers, timeout=5)                result = {'status': True, 'response': response}                break            except request_exceptions.ConnectTimeout:                print(f'{url} - 请求失败 ConnectTimeout!\n', end='')            except request_exceptions.RequestException:                print(f'{url} - 请求失败 RequestException!\n', end='')            request_count += 1            time.sleep(1)        return result    def pdf_download(self, file_path, pdf_url):        """ pdf下载 """        download_result = {'status': False}        request_result = self.request_server(url=pdf_url)        if request_result['status'] is False:            return download_result        response = request_result['response']        with open(file_path, 'wb') as fis:            for chunk in response.iter_content(chunk_size=1000):                fis.write(chunk)                fis.flush()            print(f'下载完成:{file_path}')        download_result = {'status': True}        return download_result    def read_finished_download_path(self):        finished_download_pdf_list = list()        for path in os.listdir(self.resource_path):            file_path = f'{self.resource_path}/{path}'            finished_download_pdf_list.append(file_path)        return finished_download_pdf_list    def pdf_download_controller(self, date_string_list=[]):        """ pdf下载控制 """        finished_download_pdf_list = self.read_finished_download_path()  # 获取已经下载的pdf地址        for date_string in date_string_list:            file_path = f"{self.resource_path}/{date_string.replace('/', '-')}.pdf"  # 拼接下载文件路径            if file_path in finished_download_pdf_list:                print(f"已下载:{file_path}")                continue            url = f'https://www.cfets-nex.com.cn/Market/marketOverview/dailyReview" />""        filename_prefix = os.path.splitext(self.result_file_path)[0]  # 切割文件路径以及后缀        df = pd.read_csv(self.result_file_path, encoding='utf-8', dtype='object')        df.to_excel(f"{filename_prefix}.xlsx", index=False)        print("csv 转 xlsx 成功!")    def runs(self):        self.create_file()        date_string_list = self.create_date_list()        pdf_path_list = self.pdf_download_controller(date_string_list)        self.pdf_parse(pdf_path_list)        self.csv_save_as_xlsx()if __name__ == '__main__':    SHICEconomy().runs()

总结

此次案例只为学习交流使用,若有侵犯网站利益的地方请及时联系我下架该博文;
在此我抛出两个问题,欢迎在评论区讨论或者私信我,感谢赐教!:
问题1:如何通过requests请求pdf链接拿到二进制内容后直接使用pdf解析模块进行解析;
问题2:如何以更好的方式提取pdf的关键词内容;