Python自动化办公03篇

1,573 阅读3分钟

背景

自动化办公又来了。☺ 想了想现在是数据的时代,所以不管是财务还是金融从业者亦或是投资爱好者都需要批量的去看财报,动不动就是近五年、近十年的...如下图

如果现在我们有需求要下载分析近5年的所有财报,就需要点点点点点点...进行下载。但是,如果大家学会了今天的技术,我们除了不用点点点之外,可能会哭,也可能会秃。

实战

实现步骤

  • 确定财报pdf文件所有链接在的共同页面的url
  • 发送请求,接收数据
  • 解析获取所有pdf文件链接
  • 再向pdf文件链接发送请求,保存数据为pdf文件

确定财报pdf文件所有链接在的共同页面的url

首先,我们应该确认财报.pdf的链接是否就在当前我们看到的www.moutaichina.com/maotaigf/tz…

  • 打开Chrome自带开发者工具
    • F12/鼠标右键点击检查
  • 点击select选中财报区域

由上图得出信息:

  • 财报区域总体由ul>li结构,也就是说每个报告的信息都存储在ul下的每个li中
  • 展开单个li,发现.pdf连接就在href属性中
  • 注意:该链接并不全,需做拼接

但是在此处,我们并不能直接下定论说:“需要的数据就在当前url中”,而是需要做进一步的确定。

  • 进入到Network中
  • 清空交互列表,刷新页面
  • 找到当前url,查看preview/response确定

就这样,确认了我们所需数据所在url..

发送请求,接收数据 既然确认了url,我们就需要来使用 python 中的库,来对 url 发送请求,获取数据。

import requests  
mt_url = "https://www.moutaichina.com/maotaigf/tzzgx/cwbg/f10ab3ed-1.html"
response = requests.get(url=mt_url)
mt_html = response.text

但是细看输出结果,发现在接收的数据中有中文乱码情况。

解决:指定编码为utf8(万国码)即可

import requests    
mt_url = "https://www.moutaichina.com/maotaigf/tzzgx/cwbg/f10ab3ed-1.html"
response = requests.get(url=mt_url)
response.encoding = "utf-8"       
mt_html = response.text

解析获取所有pdf文件链接

  • 需获取 pdf 的网址,即 href 属性的值
  • 获取 a标签内容方便保存命名

使用xpath解析页面,提取数据

from lxml import etree   

mt_html = etree.HTML(mt_html)

href_list = mt_html.xpath('//*[@id="f10ab3edcc474d57924ea07735f4c76e"]/div[2]/div/ul/li/a/@href')
title_list = mt_html.xpath('//*[@id="f10ab3edcc474d57924ea07735f4c76e"]/div[2]/div/ul/li/a/text()')
print(len(href_list))
print(len(title_list))
print(href_list)
print(title_list)

结果如下:

得出信息:

  • xpath 获取到的都是列表数据
  • pdf 文件请求链接并不全,所以需要拼接www.moutaichina.com/
  • 列表最后一个元素不是pdf,而是 html 的

xpath语法大家了解即可,现在都可以直接拷贝,动作如下:

再向pdf文件链接发送请求,保存数据为pdf文件

思考如下:

  • 因为href_list为列表,需要逐个的请求内容,所以需要遍历。
  • 因为并不全是.pdf的url,所以需要针对处理
    • 如果字符串后缀为.pdf的则直接请求保存
    • 否则需再次解析.html页面

实现保存字符串后缀为.pdf部分

for i in range(len(href_list)):
   
   url = "https://www.moutaichina.com/" + href_list[i]

   if url.endswith(".pdf"):

       pdf_content = requests.get(url).content
       
       save_path = "E:/mt_财报pdf文件夹/" + title_list[i] + '.pdf'
       
       with open(save_path,"wb") as f:
           f.write(pdf_content)
           print(f"下载 {title_list[i]}.pdf 成功...")

那如果是.html结尾的呢?可以有多种处理方法,比如说,直接放弃。但是只要我们翻页,就会发现,前期的财务报表全是在一个单独的.html链接中。所以如果需要获取大量的财报,比如近5年的,都需要我们去攻克这部分。

分析页面,当为.html的时候

由下发现,pdf在这个跳转的hmtl中。

所以实现步骤应如下:

    else:
       res = requests.get(url)
       res.encoding = "utf-8"
       html = res.text
       res_href = etree.HTML(html)
       pdf_url = "https://www.moutaichina.com" + res_href.xpath('//*[@id="9de9b9c170114e2ea835d78f4231a819"]/div[2]/div[2]/div[3]/a/@href')[0]
       pdf_content = requests.get(pdf_url).content
       save_path = "E:/mt_财报pdf文件夹/" + title_list[i] + '.pdf'
       with open(save_path, "wb") as f:
           f.write(pdf_content)
           print(f"下载 {title_list[i]}.pdf 成功...")