国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python 爬取財務(wù)報表

這篇具有很好參考價值的文章主要介紹了Python 爬取財務(wù)報表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在本文中,我們將介紹如何使用Python編寫一個簡單的數(shù)據(jù)抓取器,用于爬取東方財富網(wǎng)上的各類財務(wù)報表數(shù)據(jù)。我們將利用requestslxml庫進(jìn)行數(shù)據(jù)請求和解析,并將抓取到的數(shù)據(jù)保存到CSV文件中。

1. 準(zhǔn)備工作

首先,確保你已經(jīng)安裝了以下Python庫:

pip install requests
pip install lxml

2. 創(chuàng)建數(shù)據(jù)抓取器

我們將創(chuàng)建一個名為DataScraper的類,用于封裝所有數(shù)據(jù)抓取相關(guān)的方法。數(shù)據(jù)抓取器的主要功能包括:

  • 獲取報表數(shù)據(jù)
  • 解析并提取表頭信息
  • 將數(shù)據(jù)寫入CSV文件

2.1 初始化

DataScraper類的__init__方法中,我們將初始化一些必要的屬性,如報表類型、報表名稱等。此外,我們還需要設(shè)置請求URL和請求頭,以便稍后進(jìn)行數(shù)據(jù)請求。

class DataScraper:
    def __init__(self):
        self.pagename_type = {
            # ...
        }

        self.pagename_en = {
            # ...
        }

        self.en_list = []

        self.url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
        self.headers = {
            # ...
        }

2.2 獲取報表數(shù)據(jù)

我們定義一個名為get_table的方法,用于向東方財富網(wǎng)發(fā)送請求并獲取報表數(shù)據(jù)。傳入頁數(shù)作為參數(shù),返回當(dāng)前頁的報表數(shù)據(jù)。

    def get_table(self, page):
        # ...

2.3 解析表頭

在抓取數(shù)據(jù)之前,我們需要解析表頭信息。我們創(chuàng)建一個名為get_header的方法,傳入一個包含所有英文表頭的列表。該方法將請求報表頁面,使用lxml庫解析HTML,并提取中文表頭信息。

    def get_header(self, all_en_list):
        # ...

2.4 寫入表頭

接下來,我們創(chuàng)建一個名為write_header的方法,用于將解析到的表頭信息寫入CSV文件。在該方法中,我們首先調(diào)用get_header方法獲取表頭信息,然后使用csv.writer將其寫入CSV文件。

    def write_header(self, table_data):
        # ...

2.5 寫入報表數(shù)據(jù)

定義一個名為write_table的方法,用于將抓取到的報表數(shù)據(jù)逐行寫入CSV文件。在該方法中,我們遍歷抓取到的數(shù)據(jù),并將每一行數(shù)據(jù)寫入CSV文件。

    def write_table(self, table_data):
        # ...

2.6 獲取時間列表

為了讓用戶選擇爬取的報表時間,我們定義一個名為get_timeList的方法。該方法將發(fā)送請求到東方財富網(wǎng),解析并提取可選的時間列表。

    def get_timeList(self):
        # ...

3 使用數(shù)據(jù)抓取器

在創(chuàng)建好DataScraper類之后,我們可以使用以下代碼來實例化它并爬取所需的報表數(shù)據(jù):

if __name__ == '__main__':
    scraper = DataScraper()

    timeList = scraper.get_timeList()
    for index, value in enumerate(timeList):
        if (index + 1) % 5 == 0:
            print(value)
        else:
            print(value, end=' ; ')
    timePoint = str(input('\n請選擇時間(可選項如上):'))
    pagename = str(input('請輸入報表類型(業(yè)績報表;業(yè)績快報;業(yè)績預(yù)告;預(yù)約披露時間;資產(chǎn)負(fù)債表;利潤表;現(xiàn)金流量表):'))
    # 校驗輸入
    assert timePoint in timeList, '時間輸入錯誤'
    assert pagename in list(scraper.pagename_type.keys()), '報表類型輸入錯誤'
    table_type = scraper.pagename_type[pagename]
    filename = f'{pagename}_{timePoint}.csv'

    # 寫入表頭
    scraper.write_header(scraper.get_table(1))

    # 循環(huán)遍歷所有頁數(shù)
    page = 1
    while True:
        table = scraper.get_table(page)
        if table:
            scraper.write_table(table)
        else:
            break
        page += 1

4 完整代碼及結(jié)果截圖

import csv
import json
import requests
from lxml import etree


class DataScraper:
    def __init__(self):
        self.pagename_type = {
            "業(yè)績報表": "RPT_LICO_FN_CPD",
            "業(yè)績快報": "RPT_FCI_PERFORMANCEE",
            "業(yè)績預(yù)告": "RPT_PUBLIC_OP_NEWPREDICT",
            "預(yù)約披露時間": "RPT_PUBLIC_BS_APPOIN",
            "資產(chǎn)負(fù)債表": "RPT_DMSK_FN_BALANCE",
            "利潤表": "RPT_DMSK_FN_INCOME",
            "現(xiàn)金流量表": "RPT_DMSK_FN_CASHFLOW"
        }

        self.pagename_en = {
            "業(yè)績報表": "yjbb",
            "業(yè)績快報": "yjkb",
            "業(yè)績預(yù)告": "yjyg",
            "預(yù)約披露時間": "yysj",
            "資產(chǎn)負(fù)債表": "zcfz",
            "利潤表": "lrb",
            "現(xiàn)金流量表": "xjll"
        }

        self.en_list = []

        self.url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
        self.headers = {
            'Accept': '*/*',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'closed',
            'Referer': 'https://data.eastmoney.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
            'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"'
        }

    def get_table(self, page):
        params = {
            'sortTypes': '-1,-1',
            'reportName': self.table_type,
            'columns': 'ALL',
            'filter': f'(REPORT_DATE=\'{self.timePoint}\')'
        }

        if self.table_type in ['RPT_LICO_FN_CPD']:
            params['filter'] = f'(REPORTDATE=\'{self.timePoint}\')'
        params['pageNumber'] = str(page)
        response = requests.get(url=self.url, params=params, headers=self.headers)
        data = json.loads(response.text)
        if data['result']:
            return data['result']['data']
        else:
            return

    def get_header(self, all_en_list):
        ch_list = []
        url = f'https://data.eastmoney.com/bbsj/{self.pagename_en[self.pagename]}.html'
        response = requests.get(url)
        res = etree.HTML(response.text)
        for en in all_en_list:
            ch = ''.join(
                [i.strip() for i in res.xpath(f'//div[@class="dataview"]//table[1]//th[@data-field="{en}"]//text()')])
            if ch:
                ch_list.append(ch)
                self.en_list.append(en)
        return ch_list

    def write_header(self, table_data):
        with open(self.filename, 'w', encoding='utf-8', newline='') as f:
            writer = csv.writer(f)
            headers = self.get_header(list(table_data[0].keys()))
            writer.writerow(headers)

    def write_table(self, table_data):
        with open(self.filename, 'a', encoding='utf-8', newline='') as csvfile:
            writer = csv.writer(csvfile)
            for item in table_data:
                row = []
                for key in item.keys():
                    if key in self.en_list:
                        row.append(str(item[key]))
                print(row)
                writer.writerow(row)

    def get_timeList(self):
        headers = {
            'Referer': 'https://data.eastmoney.com/bbsj/202206.html',
        }
        response = requests.get('https://data.eastmoney.com/bbsj/202206.html', headers=headers)
        res = etree.HTML(response.text)
        return res.xpath('//*[@id="filter_date"]//option/text()')

    def run(self):
        self.timeList = self.get_timeList()
        for index, value in enumerate(self.timeList):
            if (index + 1) % 5 == 0:
                print(value)
            else:
                print(value, end=' ; ')

        self.timePoint = str(input('\n請選擇時間(可選項如上):'))
        self.pagename = str(
            input('請輸入報表類型(業(yè)績報表;業(yè)績快報;業(yè)績預(yù)告;預(yù)約披露時間;資產(chǎn)負(fù)債表;利潤表;現(xiàn)金流量表):'))
        assert self.timePoint in self.timeList, '時間輸入錯誤'
        assert self.pagename in list(self.pagename_type.keys()), '報表類型輸入錯誤'
        self.table_type = self.pagename_type[self.pagename]
        self.filename = f'{self.pagename}_{self.timePoint}.csv'
        self.write_header(self.get_table(1))
        page = 1
        while True:
            table = self.get_table(page)
            if table:
                self.write_table(table)
            else:
                break
            page += 1


if __name__ == '__main__':
    scraper = DataScraper()
    scraper.run()

Python 爬取財務(wù)報表
關(guān)于更多東方財富網(wǎng)、巨潮網(wǎng)、中國知網(wǎng)的爬蟲,歡迎來參觀我的github倉庫文章來源地址http://www.zghlxwxcb.cn/news/detail-481487.html

到了這里,關(guān)于Python 爬取財務(wù)報表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python爬取電影信息:Ajax介紹、爬取案例實戰(zhàn) + MongoDB存儲

    Python爬取電影信息:Ajax介紹、爬取案例實戰(zhàn) + MongoDB存儲

    Ajax(Asynchronous JavaScript and XML)是一種用于在Web應(yīng)用程序中實現(xiàn)異步通信的技術(shù)。它允許在不刷新整個網(wǎng)頁的情況下,通過在后臺與服務(wù)器進(jìn)行數(shù)據(jù)交換,實時更新網(wǎng)頁的一部分。Ajax的主要特點包括: 異步通信: Ajax是異步的,這意味著它可以在不阻塞用戶界面的情況下進(jìn)行

    2024年02月09日
    瀏覽(19)
  • 如何利用python爬取網(wǎng)站數(shù)據(jù)

    Python是一種非常適合用于網(wǎng)絡(luò)爬蟲的編程語言,以下是Python爬取網(wǎng)站數(shù)據(jù)的步驟: 1. 確定目標(biāo)網(wǎng)站和所需數(shù)據(jù):首先要找到需要爬取數(shù)據(jù)的網(wǎng)站,確定你需要爬取的數(shù)據(jù)是哪一部分。 2. 發(fā)送請求:使用Python中的requests庫向目標(biāo)網(wǎng)站發(fā)送請求,獲取網(wǎng)站的HTML源碼。 3. 解析HTM

    2024年02月06日
    瀏覽(20)
  • Python爬蟲:如何使用Python爬取網(wǎng)站數(shù)據(jù)

    更新:2023-08-13 15:30 想要獲取網(wǎng)站的數(shù)據(jù)?使用Python爬蟲是一個絕佳的選擇。Python爬蟲是通過自動化程序來提取互聯(lián)網(wǎng)上的信息。本文章將會詳細(xì)介紹Python爬蟲的相關(guān)技術(shù)。 在使用Python爬蟲之前,我們需要理解網(wǎng)絡(luò)協(xié)議和請求。HTTP是網(wǎng)絡(luò)傳輸?shù)闹匾獏f(xié)議,它是在Web瀏覽器和

    2024年02月13日
    瀏覽(31)
  • Python小姿勢 - # 如何使用Python爬取網(wǎng)頁數(shù)據(jù)

    Python小姿勢 - # 如何使用Python爬取網(wǎng)頁數(shù)據(jù)

    如何使用Python爬取網(wǎng)頁數(shù)據(jù) 今天我們來學(xué)習(xí)一下如何使用Python來爬取網(wǎng)頁數(shù)據(jù)。 首先,我們需要準(zhǔn)備一個空白的文件,在文件中輸入以下代碼: ``` import requests url = \\\'http://www.baidu.com\\\' r = requests.get(url) print(r.text) ``` 上面的代碼中,我們首先導(dǎo)入了 requests 庫,然后聲明了一個

    2024年02月04日
    瀏覽(18)
  • 【python】import時,python是如何找到我們需要的包的?

    【python】import時,python是如何找到我們需要的包的?

    參考:https://docs.python.org/3/tutorial/modules.html#the-module-search-path 當(dāng)執(zhí)行 import spam 時,編譯器首先從內(nèi)嵌模塊(buil-in module)中尋找 spam 庫,如果內(nèi)嵌模塊不含有 spam ,編譯器將依據(jù) sys.path 所給的一系列文件夾路徑尋找名為 spam.py 的文件。 其中: sys.path 由以下內(nèi)容初始化: 輸入

    2023年04月08日
    瀏覽(22)
  • 如何在C++中將int類型的變量轉(zhuǎn)換為string類型呢?今天我們就來介紹兩種方法。

    如何在C++中將int類型的變量轉(zhuǎn)換為string類型呢?今天我們就來介紹兩種方法。 第一種方法是使用C++11標(biāo)準(zhǔn)引入的std::to_string()函數(shù)。這個函數(shù)可以將數(shù)字類型的變量轉(zhuǎn)換為對應(yīng)的字符串類型。下面是一個使用示例: 上面的代碼將整型變量num轉(zhuǎn)換為字符串類型,并輸出到控制臺

    2024年02月08日
    瀏覽(32)
  • Python如何運用爬蟲爬取京東商品評論

    Python如何運用爬蟲爬取京東商品評論

    打開京東商品網(wǎng)址(添加鏈接描述) 查看商品評價 。我們點擊評論翻頁,發(fā)現(xiàn)網(wǎng)址未發(fā)生變化,說明該網(wǎng)頁是動態(tài)網(wǎng)頁。 我們在 瀏覽器右鍵點擊“檢查” ,,隨后 點擊“Network” ,刷新一下,在搜索框中 輸入”評論“ ,最終找到 網(wǎng)址(url) 。我們點擊Preview,發(fā)現(xiàn)了我們需要

    2024年02月07日
    瀏覽(23)
  • 【python】websocket原理詳細(xì)剖析,如何使用python爬取ws協(xié)議數(shù)據(jù)?

    【python】websocket原理詳細(xì)剖析,如何使用python爬取ws協(xié)議數(shù)據(jù)?

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習(xí)慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構(gòu)師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。 ??《博客》:Python全棧,前后端開

    2024年03月24日
    瀏覽(22)
  • python爬蟲如何寫,有哪些成功爬取的案例

    編寫Python爬蟲時,常用的庫包括Requests、Beautiful Soup和Scrapy。以下是三個簡單的Python爬蟲案例,分別使用Requests和Beautiful Soup,以及Scrapy。 1. 使用Requests和Beautiful Soup爬取網(wǎng)頁內(nèi)容: 2. 使用Requests和正則表達(dá)式爬取圖片: 3. 使用Scrapy爬取網(wǎng)站: 首先,確保已安裝Scrapy: 創(chuàng)建一個

    2024年01月19日
    瀏覽(30)
  • 華納云:Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)

    這篇文章主要介紹“Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)”,在日常操作中,相信很多人在Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中如何使用Selenium爬取網(wǎng)頁數(shù)據(jù)”的疑惑有所幫助!接下

    2024年02月07日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包