python3爬取数据_python3爬取巨潮资讯网站年报数据
python3爬取巨潮资讯网站年报数据
2018年年底巨潮资讯http://www.cninfo.com.cn改版了,之前实习生从网上找的脚本不能用了,因此重新修改了下爬取脚本。最初脚本的原链接忘了,有时间补上,这里只放最新的脚本。
脚本运行环境为python3.7,脚本设定从开始时间到当前日期下载年报文件,将年报的下载地址和文件名存放在指定文件夹下的csv文件中,想下载的再写一个脚本读取csc文件中的链接进行下载。
# coding = utf-8
import csv
import math
import os
import time
import requests
START_DATE = '2018-07-16' # 搜索的起始日期
END_DATE = str(time.strftime('%Y-%m-%d')) # 默认当前提取,可设定为固定值
OUT_DIR = 'D:/XML/2018年年度报告'
OUTPUT_FILENAME = '2018年度报告'
# 板块类型:沪市:shmb;深市:szse;深主板:szmb;中小板:szzx;创业板:szcy;
PLATE = 'szzx;'
# 公告类型:category_scgkfx_szsh(首次公开发行及上市)、category_ndbg_szsh(年度报告)、category_bndbg_szsh(半年度报告)
CATEGORY = 'category_ndbg_szsh;'
URL = 'http://www.cninfo.com.cn/new/hisAnnouncement/query'
HEADER = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
MAX_PAGESIZE = 50
MAX_RELOAD_TIMES = 5
RESPONSE_TIMEOUT = 10
def standardize_dir(dir_str):
assert (os.path.exists(dir_str)), 'Such directory \"' + str(dir_str) + '\" does not exists!'
if dir_str[len(dir_str) - 1] != '/':
return dir_str + '/'
else:
return dir_str
# 参数:页面id(每页条目个数由MAX_PAGESIZE控制),是否返回总条目数(bool)
def get_response(page_num, return_total_count=False):
query = {
'stock': '',
'searchkey': '',
'plate': PLATE,
'category': CATEGORY,
'trade': '',
'column': 'szse', #注意沪市为sse
# 'columnTitle': '历史公告查询',
'pageNum': page_num,
'pageSize': MAX_PAGESIZE,
'tabName': 'fulltext',
'sortName': '',
'sortType': '',
'limit': '',
'showTitle': '',
'seDate': START_DATE + '~' + END_DATE,
}
result_list = []
reloading = 0
while True:
# reloading += 1
# if reloading > MAX_RELOAD_TIMES:
# return []
# elif reloading > 1:
# __sleeping(random.randint(5, 10))
# print('... reloading: the ' + str(reloading) + ' round ...')
try:
r = requests.post(URL, query, HEADER, timeout=RESPONSE_TIMEOUT)
except Exception as e:
print(e)
continue
if r.status_code == requests.codes.ok and r.text != '':
break
my_query = r.json()
try:
r.close()
except Exception as e:
print(e)
if return_total_count:
return my_query['totalRecordNum']
else:
for each in my_query['announcements']:
file_link = 'http://www.cninfo.com.cn/' + str(each['adjunctUrl'])
file_name = __filter_illegal_filename(
str(each['secCode']) + str(each['secName']) + str(each['announcementTitle']) + '.' + '(' + str(each['adjunctSize']) + 'k)' +
file_link[-file_link[::-1].find('.') - 1:] # 最后一项是获取文件类型后缀名
)
result_list.append([file_name, file_link])
return result_list
def __log_error(err_msg):
err_msg = str(err_msg)
print(err_msg)
with open(error_log, 'a', encoding='gb18030') as err_writer:
err_writer.write(err_msg + '\n')
def __filter_illegal_filename(filename):
illegal_char = {
' ': '',
'*': '',
'/': '-',
'\\': '-',
':': '-',
'?': '-',
'"': '',
'
'>': '',
'|': '',
'-': '-',
'—': '-',
'(': '(',
')': ')',
'A': 'A',
'B': 'B',
'H': 'H',
',': ',',
'。': '.',
':': '-',
'!': '_',
'?': '-',
'“': '"',
'”': '"',
'‘': '',
'’': ''
}
for item in illegal_char.items():
filename = filename.replace(item[0], item[1])
return filename
if __name__ == '__main__':
# 初始化重要变量
out_dir = standardize_dir(OUT_DIR)
error_log = out_dir + 'error.log'
output_csv_file = out_dir + OUTPUT_FILENAME.replace('/', '') + '_' + \
START_DATE.replace('-', '') + '-' + END_DATE.replace('-', '') + '.csv'
# 获取记录数、页数
item_count = get_response(1, True)
assert (item_count != []), 'Please restart this script!'
begin_pg = 1
end_pg = int(math.ceil(item_count / MAX_PAGESIZE))
print('Page count: ' + str(end_pg) + '; item count: ' + str(item_count) + '.')
time.sleep(2)
# 逐页抓取
with open(output_csv_file, 'w', newline='', encoding='gb18030') as csv_out:
writer = csv.writer(csv_out)
for i in range(begin_pg, end_pg + 1):
row = get_response(i)
if not row:
__log_error('Failed to fetch page #' + str(i) +
': exceeding max reloading times (' + str(MAX_RELOAD_TIMES) + ').')
continue
else:
writer.writerows(row)
last_item = i * MAX_PAGESIZE if i < end_pg else item_count
print('Page ' + str(i) + '/' + str(end_pg) + ' fetched, it contains items: (' +
str(1 + (i - 1) * MAX_PAGESIZE) + '-' + str(last_item) + ')/' + str(item_count) + '.')
python3爬取数据_python3爬取巨潮资讯网站年报数据相关推荐
- python3爬取巨潮资讯网站年报数据
python3爬取巨潮资讯网站年报数据 2018年年底巨潮资讯http://www.cninfo.com.cn改版了,之前实习生从网上找的脚本不能用了,因此重新修改了下爬取脚本.最初脚本的原链接忘了, ...
- 巧用selenium爬取巨潮资讯公司数据
巧用selenium爬取巨潮资讯公司数据 立项背景:在做深度学习的过程中利用python进行建模,需要数据来训练模型. 项目目标:通过运用python的selenium模块,爬取巨潮资讯网站关于公司的 ...
- python3爬取巨潮资讯网的年报数据
python3爬取巨潮资讯网的年报数据 前期准备: 需要用到的库: 完整代码: 前期准备: 巨潮资讯网有反爬虫机制,所以先打开巨潮资讯网的年报板块,看看有什么解决办法. 巨潮咨询年报板块 可以通过这样 ...
- selenium爬取巨潮资讯指定领域下所有上市公司的数据并存储到csv文件
selenium爬取巨潮资讯指定领域下所有上市公司的数据并存储到csv文件 from selenium.webdriver import Chrome #引入selenium中的Chrome from ...
- python爬取上市公司套期保值公告(巨潮网)--使用Selenium方法
python爬虫爬取上市公司套期保值公告(巨潮网) 摘要 巨潮资讯网的网页是通过JavaScript动态加载的,因此本文利用Selenium方法爬取该网站上市公司的套期保值公告. 主要技术路线: 1. ...
- 基于python+selenium+Chrome自动化爬取巨潮资讯网A股财务报表
转自同学的博客 引言: 网页爬虫分为静态网页爬虫和动态网页爬虫,前者是指索要获取的网页内容不需要经过js运算或者人工交互, 后者是指获取的内容必须要经过js运算或者人工交互.这里的js运算可能是aja ...
- python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例
第一次写一个算是比较完整的爬虫,自我感觉极差啊,代码low,效率差,也没有保存到本地文件或者数据库,强行使用了一波多线程导致数据顺序发生了变化... 贴在这里,引以为戒吧. # -*- coding: ...
- 爬虫|巨潮资讯网上市公司年报爬取
爬虫|巨潮资讯网上市公司年报爬取 import pandas as pd from selenium import webdriver from selenium.webdriver.common.k ...
- 批量爬取巨潮资讯网中“贵州茅台”相关公告的PDF文件。
1 需求 批量爬取巨潮资讯网中"贵州茅台"相关公告的PDF文件. 2 代码实现 import reimport requests from selenium import webd ...
最新文章
- 统计5分钟内Nginx访问量及平均相应时间
- Centos7安装docker与docker-compose
- linux安装tightvnc_tightvnc安装配置,在Linux系统中进行tightvnc安装配置
- Gmail的另类浏览法--RSS
- 深入理解 Docker 网络原理
- jQuery Zoom 图片聚焦或者点击放大A plugin to enlarge images on touch, click, or mouseover
- 你模型的变量符合业务逻辑了吗
- 解决办法:VirtualBox只能安装32位的问题
- 通天塔之石——企业级前端组件库方案
- 【2020模拟赛day6】B. 选择人员
- Loadrunner Error code : 9013.
- ffmpeg 用于转换视频格式的各种命令行
- meta http-equiv 是什么
- reactjs前端实现文件新窗口下载
- wireshark源码分析二
- java笔试题含答案总结五
- 两台电脑通过trunk口互通,修改trunk 接口pvid后不通了 <1>
- 色色的互联网名词解释整理
- 转载:区块链:关于软分叉与硬分叉以及什么是共识
- 什么是亚马逊kyc审核?
热门文章
- 统计N 个学生的成绩并输出低于平均水平的人数
- 【算法设计与分析】8枚硬币及n枚硬币问题
- 针对自动跳转到2345导航页流氓行为的解决办法
- 计算BMI身体质量指数
- 《Mysql是怎样运行的》读书笔记四
- 金蝶云如何html5登录,金蝶精斗云登录时,网页端和客户端如何选择?
- 2020-09-14 作业的补充
- 87-Python_某电商平台上销售不同规格包装、不同价格的水笔。编写程序,在不考虑运费的情况下,从键盘分别输人两种水笔的包装和价格,分别计算单根水笔的价格,根据价格就低原则打印输出选择购买哪种产品
- audacity VS2010 工程搭建
- 2021年高处安装、维护、拆除考试报名及高处安装、维护、拆除模拟考试题库