Loading...
墨滴

Wyl

2021/07/08  阅读:48  主题:橙心

爬虫 | 如何批量获取东方财富网的研究报告

目标

爬取东方财富网的宏观研究报告

前言

我们在【爬虫】30行代码轻松爬取全部A股公司年报介绍了如何批量获取中国A股2001-2019年上市公司年报。在资本市场中,除了上市公司的年报,分析师及其他机构的研究报告同样是投资者重要的信息来源。特别地,本文主要介绍如何批量获取恒大研究院发布的宏观研究报告。

主界面
主界面

网页分析

不难发现,东方财富网的这种表格性信息比较容易获取每个title背后的href

随便点击一个title进入该研报的主页面,可以看到主页面中有提供查看pdf原文的接口,可以直接通过html源代码获取该pdf的href

基本思路

1.获取宏观研究页面表格中的所有链接信息url_link

2.逐个访问研报链接并获取研报原文下载链接pdf_link

3.逐个访问研报原文下载链接pdf_link下载研报并保存

实现过程

实现第一步

导入第三方库

def get_url(code,pages):
    '''
    获取东方财富网宏观研报链接
    code是指宏观研报机构代码,本文以恒大研究院为例
    page是指宏观研报表格页数
    '''

    url_list = []
    for page in range(1,pages+1):
        url = f"https://reportapi.eastmoney.com/report/jg?cb=datatable6176985&pageSize=50&beginTime=2019-07-08&endTime=2021-07-08&pageNo={page}&fields=&qType=3&orgCode={code}&author=&_=1625747785207"
        url_list.append(url)
        
    return url_list

获取页面表格信息

def get_report(url_list):
    '''
    获取东方财富网宏观研报表格信息
    url_list是指宏观研报链接
    '''

    
    outwb = openpyxl.Workbook() # 打开一个将写的文件
    outws = outwb.create_sheet(index=0# 在将写的文件创建sheet
    outws.cell(row = 1, column = 1, value = "title")
    outws.cell(row = 1, column = 2, value = "author")
    outws.cell(row = 1, column = 3, value = "orgname")
    outws.cell(row = 1, column = 4, value = "publishdate")
    outws.cell(row = 1, column = 5, value = "link")
    index = 2
    
    for k in range(len(url_list)):
        url = url_list[k]
        res = requests.get(url)
        res_text = res.text
        res_text = res_text[17:-1]
        res_js = json.loads(res_text)
        for i in range(len(res_js["data"])):
            outws.cell(row = index, column = 1, value = str(res_js["data"][i]["title"]))
            outws.cell(row = index, column = 2, value = str(res_js["data"][i]["author"]))
            outws.cell(row = index, column = 3, value = str(res_js["data"][i]["orgName"]))
            outws.cell(row = index, column = 4, value = str(res_js["data"][i]["publishDate"]))
            outws.cell(row = index, column = 5, value = str(res_js["data"][i]["encodeUrl"]))                                            
            index += 1
            
            print(res_js["data"][i]["title"])
        print("第",k+1,"页")
        sleep(random.uniform(3,4))
            
    outwb.save("恒大研究院宏观研报.xlsx")

主程序实现

if __name__ == "__main__":
    os.chdir("E:\\桌面\\宏观研报")
    code = "80894586" # 恒大研究院代码
    pages = 2 # 总计2页
    url_list = get_url(code,pages)
    get_report(url_list)
    print("运行完成")
运行结果
运行结果
保存结果
保存结果

实现第二、第三步

导入第三方库

import pandas as pd
from bs4 import BeautifulSoup

读取文件

df = pd.read_excel("E:\\桌面\\宏观研报\\恒大研究院宏观研报.xlsx",sheet_name=0)

下载研报pdf

def get_data(iloc):
    publishdate = df.at[iloc,'publishdate'][:10]
    orgname = df.at[iloc,'orgname']
    url = "https://data.eastmoney.com/report/zw_macresearch.jshtml?encodeUrl=" + df.at[iloc,'link']  # 页面表格中获取的信息并非完整url信息,需要补充完整
    return publishdate, orgname, url


def get_filepath(orgname,publishdate):
    file_path = 'E:\\桌面\\宏观研报\\'
    file_name = "{}-{}宏观研报.pdf".format(orgname,publishdate)
    file_full_name = os.path.join(file_path,file_name)
    return file_full_name

def download_pdf(url,file_full_name):
    res = requests.get(url)
    soup = BeautifulSoup(res.text,"html.parser")
    pdf_link = soup.select(".pdf-link")[0]["href"]
    print(pdf_link)
    res_pdf = requests.get(pdf_link)
    with open(file_full_name,"wb"as fp:
        for chunk in res_pdf.iter_content(chunk_size=1024):
            if chunk:
                fp.write(chunk)

for iloc in range(len(df))[0:3]:   # 这里仅以下载3个为示例
    publishdate, orgname, url = get_data(iloc)
    print("开始下载{},发表时间{}的宏观研报".format(orgname,publishdate))
    file_full_name = get_filepath(orgname,publishdate)
    download_pdf(url,file_full_name)
    sleep(random.uniform(3,4))
    print("===========下载完成==========")
运行结果
运行结果
保存结果
保存结果

项目完整代码可在公众号后台回复关键词“研报爬虫”获取

期待您的关注在看点赞一键三连,您的一键三连是持续创作的动力!

知乎与公号:财会程序猿的笔记 (ID:wylcfy2014)
不定期推送:Python+Stata | 文本分析+机器学习 | 财务+会计

Wyl

2021/07/08  阅读:48  主题:橙心

作者介绍

Wyl

厦门大学