python爬虫(一) |
您所在的位置:网站首页 › 巨潮网下载年报比萝卜投研下载好 › python爬虫(一) |
第一步:创建所需要爬取的企业代码——国泰安即可获取。 第二步:爬取企业年报——代码如下 代码: # 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'[(*)()(\\)(|)(\")(?)(:)(/)()()]', '', 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 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |