各位股神,大家好!
东方财富网的研报中心提供了大量的证券分析师的研究报告,包括原文。但是通过网页访问,点来点去的影响阅读的连贯性,所以我想有一种办法来将研究报告批量下载下来,在本地电脑上连续阅读。
下载研报的方法我已经改进过多次了。
最初,我按照行业批量下载研报,同时也在B站的小店里提供了个exe工具。但是,后来发现,这种方法很难提个醒我去持续地追踪,经常是想起来就看看,想不起来就不去读了。
然后,我改进了这个方法,我按周批量下载全部的行业研报,大概一周300-500个文件,尝试用1周读完。后来,我发现,工作量还是蛮大的,我就用AI先帮我阅读一遍之后打分,我精选85分以上的研报再读,基本上就能读完了。这样的方法我坚持了大概有3-4个月了吧。
刚好最近,有B站网友说最初小店里的工具不能用了。
我就想着刚好再总结下,我这个阅读研报的方法,是否还有可以改进的地方。
当前的方法有两个问题:
1、时效性有点滞后,尤其是后半周,我还在读上一周的研报,信息稍微滞后,比方说海关进出口数据出来以后,往往一两天就有分析师给出自己的分析,但我往往要延迟1个礼拜。
2、可能会错过信息。AI的筛选还是并不能完全体现我的意思,可能会错过信息。尤其是,对于我不太关注的行业。
最终,我还是决定,不依靠AI的筛选了,自己来掌握信息的筛选和过滤。
这也就是我刚刚改变的读研报的方法,看看这次能不能坚持下去。
最新的方法是,我按照天下载全部的行业研报,大概一天几十份不等。这样就首先解决了时效性的问题。然后我再自己来决定是精读还是略读,接下来通过时间来验证这个方法合适不合适吧。
至于为什么读行业研报,不读个股研报。
实在是个股研报确实没什么价值。而行业研报能带给我们对新行业业务的理解、各个行业的最新重要资讯、以及分析师独特的行业视角和行业数据。这样的信息密度和价值是其他的方式很难能匹配的。
可能看书的价值高一些,但书籍的时效性和行业覆盖又差了不少。
所以,还是推荐各位股神,开始持续读研报。
最后,说下最新工具的形式。
第二版因为需要用到AI的Token,所以我就没有公开,整个自动化处理的过程也比较复杂。
最新的这个版本,我想着用python脚本的方式做个共享。
之所以,不再提供EXE形式的工具了,是因为,以我几十年电脑使用经验而言,python真的是唯二的对人的能力扩展的工具了,另一个是office。
关于office这个工具,它真的帮助人类极大地提升了处理信息的能力,我用一张照片来举例,王小波,在他短暂的一生中,正是因为他很早就使用电脑写作,才给我们留下了那些经典,你希望生活在没有《黄金时代》和《红拂夜奔》的世界么?

而python又一次扩展了我们与世界联通,处理信息的能力。
我最新工具的脚本粘贴如下:
import requests
import json
import re
import os
def download_pdf_with_retry(info_code, headers, filename, industry_code, max_retries=3):
ifos.path.exists(filename):
return True
detail_url = f'https://data.eastmoney.com/report/zw_industry.jshtml?infocode={info_code}'
for attempt in range(1, max_retries + 1):
try:
resp =requests.get(detail_url, headers=headers, timeout=10)
match = re.search(r'"attach_url"\s*:\s*"([^"]+)"', resp.text)
if not match:
print(f"⚠️ 未找到 PDF 链接(尝试 {attempt}/{max_retries}): {info_code}")
time.sleep(1)
continue
pdf_url=match.group(1)
pdf_resp = requests.get(pdf_url, headers=headers, timeout=15)
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, 'wb') as f:
f.write(pdf_resp.content)
return True
except Exception as e:
print(f"❌ 下载失败(尝试 {attempt}/{max_retries}): {str(e)[:100]}")
time.sleep(2)
return False
def get_list_by_day(day):
url = 'https://reportapi.eastmoney.com/report/list'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
'Referer': 'https://www.eastmoney.com/',
}
params = {
'cb': 'datatable7190919',
'industryCode': '*',
'pageSize': '100',
'industry': '*',
'rating': '*',
'ratingChange': '*',
'beginTime': day,
'endTime': day,
'pageNo': '1',
'fields': '',
'qType': '1',
'orgCode': '',
'rcode': '',
'p': '2',
'pageNum': '2',
'pageNumber': '',
'pageNumber': '2',
'_':"1778441285086"
}
params['beginTime'] = day
params['endTime'] = day
response = requests.get(url, headers=headers, params=params)
json_data =re.findall(r'datatable7190919\((.*)\)', response.text, re.DOTALL)[0]
json_data = json.loads(json_data)
page_no = json_data['pageNo']
data = json_data['data']
if page_no == 1:
return data
else:
for i in range(2, page_no+1):
params['pageNo'] = str(i)
response = requests.get(url, headers=headers, params=params)
json_data =re.findall(r'datatable7190919\((.*)\)', response.text, re.DOTALL)[0]
json_data = json.loads(json_data)
data.extend(json_data['data'])
return data
def get_pdf_by_day(day):
data = get_list_by_day(day)
for item in data:
item['title'] = item['title'].replace('/', '_')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': f'https://www.eastmoney.com/',
}
for item in data:
if os.path.exists(f'./pdf_by_day/{day}/{day}_{item["industryName"]}_{item["title"]}.pdf'):
continue
download_pdf_with_retry(info_code=item['infoCode'], filename=f'./pdf_by_day/{day}/{day}_{item["industryName"]}_{item["title"]}.pdf', headers=headers,industry_code=item['industryCode'])
if __name__ == '__main__':
day = '2026-05-08'
get_pdf_by_day(day)
你只需要将这些代码粘贴给AI,然后问问,我该如何运行这个脚本,AI会带你打开连接世界的大门。