python selenium爬取东方财富沪深京A股 并对其做数据分析

import csv
import random
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 设置 ChromeDriver 的路径
driver_path = r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
service = webdriver.chrome.service.Service(executable_path=driver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

url = "https://quote.eastmoney.com/center/gridlist.html#hs_a_board"

file_header = ['序号', '代码', '名称', '相关链接', '最新价', '涨跌幅', '涨跌额', '成交量(手)', '成交额', '振幅', '最高',
               '最低', '今开', '昨收', '量比', '换手率', '市盈率(动态)', '市净率', '加自选']

try:
    page = 1
    while True:
        driver.get(url + f"?p={page}")
        random_wait_time = random.randint(1, 10)
        time.sleep(random_wait_time)

        # 等待表格加载
        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_element_located((By.ID, 'main-table_paginate')))

        page_source = driver.page_source
        soup = BeautifulSoup(page_source, 'html.parser')
        target_div = soup.find('div', id='table_wrapper', class_='row')
        if target_div:
            print(f"第{page}页内容:")
            data_for_this_page = []
            table = target_div.find('div', class_='listview full').find('table')
            if table:
                table_body = table.find('tbody')
                for row in table_body.find_all('tr'):
                    row_data = {}
                    cells = row.find_all('td')
                    if len(cells) > 0:
                        row_data['序号'] = cells[0].text.strip()
                        a_tag = cells[1].find('a')
                        row_data['代码'] = a_tag['href'] if a_tag else ''
                        row_data['名称'] = cells[2].find('a').text.strip()
                        links = cells[3].find_all('a')
                        link_texts = [link.get_text() for link in links]
                        row_data['相关链接'] = ' '.join(link_texts)
                        row_data['最新价'] = cells[4].find('span').text.strip() if cells[4].find('span') else ''
                        row_data['涨跌幅'] = cells[5].find('span').text.strip() if cells[5].find('span') else ''
                        row_data['涨跌额'] = cells[6].find('span').text.strip() if cells[6].find('span') else ''
                        row_data['成交量(手)'] = cells[7].text.strip()
                        row_data['成交额'] = cells[8].text.strip()
                        row_data['振幅'] = cells[9].text.strip()
                        row_data['最高'] = cells[10].find('span').text.strip() if cells[10].find('span') else ''
                        row_data['最低'] = cells[11].find('span').text.strip() if cells[11].find('span') else ''
                        row_data['今开'] = cells[12].find('span').text.strip() if cells[12].find('span') else ''
                        row_data['昨收'] = cells[13].text.strip()
                        row_data['量比'] = cells[14].text.strip()
                        row_data['换手率'] = cells[15].text.strip()
                        row_data['市盈率(动态)'] = cells[16].text.strip()
                        row_data['市净率'] = cells[17].text.strip()
                    data_for_this_page.append(row_data)

                # 将当前页数据写入 CSV 文件
                with open('东方财经沪深京A股.csv', 'a', newline='', encoding='utf-8') as csvfile:
                    writer = csv.writer(csvfile)
                    if page == 1:
                        writer.writerow(file_header)
                    for item in data_for_this_page:
                        writer.writerow([item.get(key, '') for key in file_header])

        # 尝试找到下一页按钮并点击
        pagination_div = soup.find('div', class_='dataTables_paginate paging_input')
        if pagination_div:
            next_page_button = pagination_div.find('a', class_='next paginate_button')
            if next_page_button and 'disabled' not in next_page_button.get('class',
                                                                           []) and next_page_button is not None:
                # 使用Selenium的方法来点击下一页按钮
                next_page_element = driver.find_element(By.XPATH,
                                                        "//a[@class='next paginate_button' and not(contains(@class, 'disabled'))]")
                next_page_element.click()
                page += 1
            else:
                print("已到达最后一页或未找到下一页按钮,停止翻页。")
                break
        else:
            print("未找到翻页区域,停止翻页。")
            break

except Exception as e:
    print("出现错误:", e)
finally:
    driver.quit()

数据分析

import pandas as pd

# 读取CSV文件
df = pd.read_csv('东方财经.csv')

# 打印列名,检查是否有任何不一致
print("列名:")
print(df.columns)

# 定义一个清洗数据的函数,将字符串转换为数值
def clean_data(value):
    if '亿' in str(value):
        return float(value.replace('亿', '')) * 1e8
    elif '万' in str(value):
        return float(value.replace('万', '')) * 1e4
    else:
        return value

# 尝试清洗数据并转换类型,确保列名与实际列名一致
try:
    # 清洗成交额数据
    if '成交额' in df.columns:
        df['成交额'] = df['成交额'].apply(clean_data)
        df['成交额'] = df['成交额'].astype(float)
    else:
        print("列名 '成交额' 不存在,请检查CSV文件的列名。")

    # 清洗成交量数据
    if '成交量(手)' in df.columns:
        df['成交量(手)'] = df['成交量(手)'].apply(clean_data)
        df['成交量(手)'] = df['成交量(手)'].astype(float)
    else:
        print("列名 '成交量(手)' 不存在,请检查CSV文件的列名。")

    # 清洗涨跌幅数据
    if '涨跌幅' in df.columns:
        df['涨跌幅'] = df['涨跌幅'].str.rstrip('%').astype(float)
    else:
        print("列名 '涨跌幅' 不存在,请检查CSV文件的列名。")

    # 计算股票的总成交额
    total_turnover = df['成交额'].sum()
    print(f"\n总成交额为:{total_turnover}亿")

    # 计算股票的平均涨跌幅
    average_change_percent = df['涨跌幅'].mean()
    print(f"平均涨跌幅为:{average_change_percent}%")

    # 找出涨跌幅最大的股票
    max_change_percent_stock = df.loc[df['涨跌幅'].idxmax()]
    print(f"涨跌幅最大的股票是:{max_change_percent_stock['名称']},涨跌幅为:{max_change_percent_stock['涨跌幅']}%")

    # 找出成交额最高的股票
    max_turnover_stock = df.loc[df['成交额'].idxmax()]
    print(f"成交额最高的股票是:{max_turnover_stock['名称']},成交额为:{max_turnover_stock['成交额']}亿")

except Exception as e:
    print(f"处理数据时出现错误:{e}")
引用: 东方财富吧是一个提供票相关讨论的平台,您可以通过Python进行爬取其发贴数据。根据引用中的描述,您可以使用Python爬取东方财富吧的帖子信息,包括吧名称、阅读量、评论数、标题、作者和发帖时间。具体的步骤如下: 1. 使用Python的网络爬虫库(例如BeautifulSoup或Scrapy)访问东方财富吧网站,获取页面的HTML内容。 2. 使用HTML解析库(例如BeautifulSoup或lxml)解析HTML内容,提取出帖子信息,例如吧名称、阅读量、评论数、标题、作者和发帖时间。 3. 将提取的帖子信息存储到一个数据结构(例如列表或字典)中,方便后续的分析和处理。 引用中提到了探索更复杂的实际案例,通过实际项目提升数据分析能力。因此,对于您的需求,您可以进一步扩展爬取的功能,例如分析帖子的情绪指数、研究帖子的亮点回顾等,以获得更入的数据分析结果。 最后,引用中给出了一个跨年份取月份对应时间戳的问题的解决方法。虽然这段代码与您的问题关系不大,但它提供了一个示例,展示了如何使用Python对时间进行处理和计算。 希望以上信息对您有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [东方财富吧标题爬取分析](https://blog.csdn.net/kun666666/article/details/115222647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python数据分析入门:掌握基本工具与技巧.md](https://download.csdn.net/download/pleaseprintf/88229437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luky!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值