爬取股吧评论(东方财经网)

         本文使用MySQL数据库,平台用的DBeaver与python进行股吧数据爬取,由于网站的反爬虫机制,本文章添加了随机用户代理与随机延时,但在爬取五六十页后,爬虫页面会变换,基本为方正证卷吧,如果页面变换,过一个小时之后在爬

如下代码为数据库的创建过程:

-- pfyh.comment definition

CREATE TABLE `comment` (
  `id` varchar(200) NOT NULL,
  `read_count` int DEFAULT NULL,
  `reply` int DEFAULT NULL,
  `title` varchar(200) DEFAULT NULL,
  `title_url` varchar(200) DEFAULT NULL,
  `author` varchar(200) DEFAULT NULL,
  `author_url` varchar(200) DEFAULT NULL,
  `update_time` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
import random
import re
import time
import requests
import pymysql
from parsel import Selector
from colorama import Fore, init
from fake_useragent import UserAgent

# 初始化Colorama用于输出着色
init()
"""
user一般都为root
password填写你自己设置的数据库密码
database为你的数据库
port基本为3306

"""
base_url = 'https://guba.eastmoney.com'
db = pymysql.connect(host='localhost', user='root', password='527630', database='pfyh', port=3306)

def get_random_user_agent():
    """随机获取用户代理"""
    try:
        ua = UserAgent()
        return ua.random
    except Exception as e:
        print(Fore.RED + f"Error creating UserAgent: {e}")
        return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'

def get_headers():
    """构造请求头"""
    return {
        'User-Agent': get_random_user_agent(),
        'Host': 'guba.eastmoney.com'
    }

def make_request(url):
    """执行网络请求"""
    retries = 3
    for _ in range(retries):
        try:
            print(Fore.BLACK + '-' * 50 + ' 正在获取:' + url)
            response = requests.get(url, headers=get_headers(), timeout=10)
            if response.status_code == 200:
                return response.text
            else:
                print(Fore.RED + f'获取页面失败,状态码: {response.status_code}')
        except requests.RequestException as e:
            print(Fore.RED + f'请求错误: {e}')
            time.sleep(5)  # 等待5秒后重试
    return None

def crawl_content(count=1):
    """ 获取指定页码的HTML内容 """
    url = f'{base_url}/list,600000_{count}.html' if count != 1 else f'{base_url}/list,600000.html'
    return make_request(url)

def spider_out_comment(content):
    """ 解析HTML内容提取所需数据 """
    selector = Selector(text=content)
    list_body = selector.xpath('//li[contains(@class, "defaultlist")]/table[contains(@class, "default_list")]/tbody[contains(@class, "listbody")]/tr[contains(@class, "listitem")]')
    data = []
    for item in list_body:
        data.append({
            'id': re.findall('[0-9]+', item.css('div.title > a').attrib['href'])[0],
            'read_count': item.css('div.read::text').get(),
            'reply': item.css('div.reply::text').get(),
            'title': item.css('div.title > a::text').get(),
            'title_url': item.css('div.title > a').attrib['href'],
            'author': item.css('div.author > a::text').get(),
            'author_url': item.css('div.author > a').attrib['href'],
            'update_time': item.xpath('.//div[contains(@class, "update")]/text()').get()
        })
    return data

def save_mysql(data):
    """ 保存数据到MySQL数据库 """
    cursor = db.cursor()
    try:
        for item in data:
            sql = 'INSERT INTO comment (id, read_count, reply, title, title_url, author, author_url, update_time) ' \
                  'VALUES (%s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE read_count = VALUES(read_count), reply = VALUES(reply)'
            cursor.execute(sql, tuple(item.values()))
        db.commit()
        print(Fore.GREEN + f'成功保存{len(data)}条数据。')
    except pymysql.Error as e:
        db.rollback()
        print(Fore.RED + f'保存数据失败: {e}')

if __name__ == '__main__':
    try:
        for i in range(700, 1500):  # 爬取1500页的数据
            content = crawl_content(i)
            if content:
                data = spider_out_comment(content)
                save_mysql(data)
            time.sleep(random.uniform(1, 30))  # 随机延时,可以自己修改
    finally:
        db.close()
        print(Fore.GREEN + '数据库连接已关闭。')

第三方库:snownlp、tushare、pandas、numpy、matplotlib getData:从东方财富网旗下的股吧论坛爬取数据 SQL:用到的数据库操作函数 quantilizeSentiment:量化情绪指数,生成excel文件便于后面进行情绪指数和股票价格涨幅相关度的量化分析(股票价格历史数据来自tusharepro网站,可以免费获取) result:传入某只股票代码,返回情绪指数结果(主要关注此文件即可,其他爬虫分析之类的我后面放到云上,爬取数据都放入云数据库中) analyze:进行情绪指数和股票价格涨幅相关度分析、数据可视化 爬取后的数据存储在云端数据库中: db = pymysql.connect(host="116.62.46.214",user="dfcf",password="iJHPFZnRjXacNi6p",db="dfcf",port=3306) 接口说明(重点!!!): 函数: def data(share_code):#计算情绪指数 传参:share_code 股票代码(例如:zssh000001)上证指数 返回参数:result 情绪指数 例如: if __name__ == '__main__': result=data('zssh000001') #传入股票代码参数 print(result) #打印情绪指数结果 实现功能:根据传入的股票代码到东方财富网旗下的股吧对应的某股票分论坛爬取当天的用户评论信息,并将爬取数据存储到MySQL中,之后再将数据进行统计并计算出该股票当天的市场情感趋势。 执行流程 1、输入股票代码 2、清空数据库上一天的评论信息 3、使用爬虫爬取当天东方财富股吧论坛中该股票的股民评论信息并进行数据清洗过滤,筛选出有效信息,存入MySQL数据库 4、使用金融情感计算模型进行文本数据分析 5、得出该股票当日的情绪指数 6、返回情绪指数值 计算情绪指数具体算法实现 借助自然语言处理中的情感分类技术。按照正常的处理流程,需要搭建模型、准备语料库、训练模型、测试模型然后得到一个情感分类的模型。但这里,时间有限,所以直接使用现有的模型。snownlp是一个中文的开源的自然语言处理的Python库,可以进行分词、情感分类等。在本项目中可以直接使用它来量化出某一日市场投资者的整体情绪。量化的方法有许多种,可以将某一日所有的评论情绪得分得分相加再求评价,也可以求某一日情绪得分大于0.5的评论所占的比例。 项目所采用的方法: 将情绪得分>0.6的评论当作积极评论,小于0.4的评论当作消极评论。 设置变量neg和pos,存储某一日市场的积极情绪因子和消极情绪因子。关于neg和pos的计算方法,以neg为例: 初始化为0,若某一日的某一评论comment的情绪得分<0.4 neg=neg+1+log(该条评论的点赞数+该条评论作者的粉丝数+1,2),其中log(x,2)表示以2为低的x的对数。考虑该条评论的点赞数和该条评论作者的粉丝数是因为考虑到不同的评论的质量不同。取对数是为了让数据更加平滑,防止极值过大。+1是为了防止该条评论的点赞数和该条评论作者的粉丝数都为0。 计算某一日市场的总体情绪得分score。设计的模型是: score=log((pos/(pos+neg+0.0001)-0.5)*(该日评论总数+1)) (pos/(pos+neg+0.0001)-0.5)的意思是计算市场的情绪倾向,**大于0表明市场积极情绪情绪较强,越接近0.5越强。小于0反之。**后面的(该日评论总数+1),是因为某一日投资者的评论越多,代表市场投资者情绪的波动越大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值