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爬取巨潮资讯网站年报数据相关推荐

  1. python3爬取巨潮资讯网站年报数据

    python3爬取巨潮资讯网站年报数据 2018年年底巨潮资讯http://www.cninfo.com.cn改版了,之前实习生从网上找的脚本不能用了,因此重新修改了下爬取脚本.最初脚本的原链接忘了, ...

  2. 巧用selenium爬取巨潮资讯公司数据

    巧用selenium爬取巨潮资讯公司数据 立项背景:在做深度学习的过程中利用python进行建模,需要数据来训练模型. 项目目标:通过运用python的selenium模块,爬取巨潮资讯网站关于公司的 ...

  3. python3爬取巨潮资讯网的年报数据

    python3爬取巨潮资讯网的年报数据 前期准备: 需要用到的库: 完整代码: 前期准备: 巨潮资讯网有反爬虫机制,所以先打开巨潮资讯网的年报板块,看看有什么解决办法. 巨潮咨询年报板块 可以通过这样 ...

  4. selenium爬取巨潮资讯指定领域下所有上市公司的数据并存储到csv文件

    selenium爬取巨潮资讯指定领域下所有上市公司的数据并存储到csv文件 from selenium.webdriver import Chrome #引入selenium中的Chrome from ...

  5. python爬取上市公司套期保值公告(巨潮网)--使用Selenium方法

    python爬虫爬取上市公司套期保值公告(巨潮网) 摘要 巨潮资讯网的网页是通过JavaScript动态加载的,因此本文利用Selenium方法爬取该网站上市公司的套期保值公告. 主要技术路线: 1. ...

  6. 基于python+selenium+Chrome自动化爬取巨潮资讯网A股财务报表

    转自同学的博客 引言: 网页爬虫分为静态网页爬虫和动态网页爬虫,前者是指索要获取的网页内容不需要经过js运算或者人工交互, 后者是指获取的内容必须要经过js运算或者人工交互.这里的js运算可能是aja ...

  7. python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例

    第一次写一个算是比较完整的爬虫,自我感觉极差啊,代码low,效率差,也没有保存到本地文件或者数据库,强行使用了一波多线程导致数据顺序发生了变化... 贴在这里,引以为戒吧. # -*- coding: ...

  8. 爬虫|巨潮资讯网上市公司年报爬取

    爬虫|巨潮资讯网上市公司年报爬取 import pandas as pd from selenium import webdriver from selenium.webdriver.common.k ...

  9. 批量爬取巨潮资讯网中“贵州茅台”相关公告的PDF文件。

    1 需求 批量爬取巨潮资讯网中"贵州茅台"相关公告的PDF文件. 2 代码实现 import reimport requests from selenium import webd ...

最新文章

  1. 统计5分钟内Nginx访问量及平均相应时间
  2. Centos7安装docker与docker-compose
  3. linux安装tightvnc_tightvnc安装配置,在Linux系统中进行tightvnc安装配置
  4. Gmail的另类浏览法--RSS
  5. 深入理解 Docker 网络原理
  6. jQuery Zoom 图片聚焦或者点击放大A plugin to enlarge images on touch, click, or mouseover
  7. 你模型的变量符合业务逻辑了吗
  8. 解决办法:VirtualBox只能安装32位的问题
  9. 通天塔之石——企业级前端组件库方案
  10. 【2020模拟赛day6】B. 选择人员
  11. Loadrunner Error code : 9013.
  12. ffmpeg 用于转换视频格式的各种命令行
  13. meta http-equiv 是什么
  14. reactjs前端实现文件新窗口下载
  15. wireshark源码分析二
  16. java笔试题含答案总结五
  17. 两台电脑通过trunk口互通,修改trunk 接口pvid后不通了 <1>
  18. 色色的互联网名词解释整理
  19. 转载:区块链:关于软分叉与硬分叉以及什么是共识
  20. 什么是亚马逊kyc审核?

热门文章

  1. 统计N 个学生的成绩并输出低于平均水平的人数
  2. 【算法设计与分析】8枚硬币及n枚硬币问题
  3. 针对自动跳转到2345导航页流氓行为的解决办法
  4. 计算BMI身体质量指数
  5. 《Mysql是怎样运行的》读书笔记四
  6. 金蝶云如何html5登录,金蝶精斗云登录时,网页端和客户端如何选择?
  7. 2020-09-14 作业的补充
  8. 87-Python_某电商平台上销售不同规格包装、不同价格的水笔。编写程序,在不考虑运费的情况下,从键盘分别输人两种水笔的包装和价格,分别计算单根水笔的价格,根据价格就低原则打印输出选择购买哪种产品
  9. audacity VS2010 工程搭建
  10. 2021年高处安装、维护、拆除考试报名及高处安装、维护、拆除模拟考试题库