赞
踩
第一步:创建所需要爬取的企业代码——国泰安即可获取。
第二步:爬取企业年报——代码如下
代码:
# 1、定义股票代码列表 和 爬取结果输出地址(最好指定一个空的文件夹)———必选项
Codelist_path = r"D:\教学视频\企业代码.xls"
Output_path = r"D:\教学视频\年报"
# 2、定义要爬取的报表类型(若同时爬取多项中间用;连接)———必选项
# 公司年度报告:category_ndbg_szsh
# 公司治理报告:category_gszl_szsh
Category_All = "category_ndbg_szsh;category_sjdbg_szsh;category_dshgg_szsh;category_rcjy_szsh;category_sf_szsh;category_pg_szsh;category_kzzq_szsh;category_bcgz_szsh;category_tbclts_szsh;category_tszlq_szsh;category_cqdq_szsh;category_qtrz_szsh;category_jj_szsh;category_zf_szsh;category_gszl_szsh;category_jshgg_szsh;category_yjygjxz_szsh;category_bndbg_szsh;category_yjdbg_szsh;category_qyfpxzcs_szsh;category_gddh_szsh;category_zj_szsh;category_gqjl_szsh;category_gszq_szsh;category_gqbd_szsh;category_fxts_szsh;"
# Category_A = Category_All
# Category_A = "category_ndbg_szsh;"
Category_A = "category_ndbg_szsh"
# 3、定义要爬取的时间段———必选项
SeDate_A = '2015-01-01~2017-01-01'
# 4、定义爬取指定报告的关键词(若不指定则保持为空即可)———可选项
Search_key = ''
import requests
# 用于获取网页内容
from urllib.request import urlretrieve
# 用于下载网络文件到本地
import re
# 用于正则匹配
import math
# 用于调用数学函数
import json
# 用于解析json
import xlwt
# 用于写入excel
import xlrd
# 用于读取excel
import os
# 用于实现系统功能
import pandas as pd
# 导入pandas工具库
# 若此处报错 ModuleNotFoundError:No module named 'XXX' 时说明XXX包未安装,需自行在控制台通过pip或conda进行安装(小白自行百度“python安装函数包”)
# 从以下url中提取所需要的上市企业数据源信息(该url包括了巨潮资讯网上目前所有上市企业的stockList信息,我们的目的是从中获取到不同股票的orgId,以便接下来通过orgId去爬取不同企业的指定报告)
url = "http://www.cninfo.com.cn/new/data/szse_stock.json"
ret = requests.get(url=url)
ret = ret.content
stock_list = json.loads(ret)["stockList"]
# 查看巨潮资讯网一共收录了多少家企业数据
len(stock_list)
# 输出stock_list中的前两项,查看一下列表中的具体数据形式
print(stock_list[:2])
# 提取stock_list中的code与orgId,遍历生成独立字典
code_dic = {(it['code']): it['orgId'] for it in stock_list}
print("\n正在进行服务器数据库检索,共找到 {} 家上市公司!\n\n --------------------------------服务器数据比对工作完成,即将开始载入数据进行匹配!--------------------------------\n".format(len(code_dic)))
# 若要输出查看具体“code-orgId”匹配内容请取消注释此行
# print(code_dic)
print("\n --------------------------数据匹配完成,共生成 {} 家上市公司的“code-orgId”匹配数据!--------------------------\n".format(len(code_dic)))
# 定义一个读取xls文件数据并转为列表的类
class excel_read:
def __init__(self, excel_path=Codelist_path, encoding='utf-8', index=0): # 待爬取企业清单路径
# 获取文本对象
self.data = xlrd.open_workbook(excel_path)
# 根据index获取某个sheet
self.table = self.data.sheets()[index]
# 获取当前sheet页面的总行数,把每一行数据作为list放到 list
self.rows = self.table.nrows
def get_data(self):
result = []
for i in range(self.rows):
# 获取每一行的数据
col = self.table.row_values(i)
# print(col)
result.append(col)
print("待爬取企业已从xls文件中加载完毕,结果如下:\n {}\n".format(result))
return result
# 运用函数生成待爬取企业的code_list
code_list = []
code_list.extend(excel_read().get_data())
# 1、对单个页面进行请求,并返回数据信息——通过data自定义特定企业
def get_and_download_pdf_flie(pageNum, stock, searchkey='', category='', seDate=''):
url = 'http://www.cninfo.com.cn/new/hisAnnouncement/query'
pageNum = int(pageNum)
# 定义表单数据
data = {'pageNum': pageNum,
'pageSize': 30,
'column': '',
'tabName': 'fulltext',
'plate': '',
'stock': stock,
'searchkey': searchkey,
'secid': '',
'category': category,
'trade': '',
'seDate': seDate,
'sortName': '',
'sortType': '',
'isHLtitle': 'true'}
# 定义请求头(非小白建议更改为自己浏览器的headers)
headers = {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '181',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'www.cninfo.com.cn',
'Origin': 'http://www.cninfo.com.cn',
'Referer': 'http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'}
# 提交请求
r = requests.post(url, data=data, headers=headers)
# 获取单页年报的数据,数据格式为json,解析并获取json中的年报信息
result = r.json()['announcements']
# 2.对数据信息进行提取
for i in result:
# 避免下载一些年报摘要等不需要的文件
if re.search('摘要', i['announcementTitle']):
pass
else:
title = i['announcementTitle']
# 获取公告文件名
secName = i['secName']
# 获取公司股票代码
secCode = i['secCode']
# 获取adjunctUrl,并组合生成pdf文件下载地址(分析得知巨潮资讯数据库pdf下载地址格式:http://static.cninfo.com.cn/+adjunctUrl)
adjunctUrl = i['adjunctUrl']
down_url = 'http://static.cninfo.com.cn/' + adjunctUrl
# 定义下载之后需要保存到本地的文件名
filename = f'{secCode}{secName}{title}.pdf'
# 用正则表达式将公告文件名中的特殊符号去掉,因为保存文件时命名规则不能带有某些特殊符号(比如*号),否则会导致程序报错
filename = re.sub(r'[(*)(<)(>)(\\)(|)(\")(?)(:)(/)(<em>)(</em>)]', '', filename)
# 定义文件存放地址
filepath = saving_path + '\\' + filename
# 提交下载请求
r = requests.get(down_url)
# 用response.content来写入文件信息
with open(filepath, 'wb') as f:
f.write(r.content)
# 设置进度条
print(f'{filename}下载完毕')
# 设置存储年报文件的具体路劲
saving_path = Output_path
# 根据code_list计算待爬企业数量
Num = len(code_list)
print("待爬取企业总数量为:{}\n\n ------------------------------------已加载待爬取企业匹配信息,即将开始爬取数据!------------------------------------\n".format(Num))
# 从code_list中根据待爬企业数量遍历提取code与orgIdS
for i in range(0, Num):
code = code_list[i][0]
orgId = code_dic[code]
# 定义stock
stock = '{},{}'.format(code, orgId)
print("\n即将爬取 {} :".format(stock))
# 定义searchkey
searchkey_A = Search_key
# 定义category
category = Category_A
# 定义seDate
seDate = SeDate_A
# 定义pageNum(需要通过观测,确保pageNum能够涵盖每一次遍历请求的结果页数,此处定为2页即可)
for pageNum in range(1, 3):
try:
get_and_download_pdf_flie(
pageNum, stock, searchkey_A, category, seDate,)
except:
# 超出页数后会报错,需要跳过异常以便于继续遍历执行
pass
print("-------------------------------------------------程序执行完成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。