爬虫项目-爬取股吧(东方财富)评论

本文介绍了如何使用Python和Selenium库爬取东方财富股吧的帖子评论,包括设置用户代理、遍历链接获取详情、筛选评论数大于5的帖子,并将数据整理成CSV文件。
摘要由CSDN通过智能技术生成

1.最近帮别人爬取了东方财富股吧的帖子和评论,网址如下:http://mguba.eastmoney.com/mguba/list/zssh000300

2.爬取字段如下所示:
在这里插入图片描述
3.爬虫的大致思路如下:客户要求爬取评论数大于5的帖子,首先获取帖子链接,然后根据链接的列表进行遍历,爬取相应的信息:

4.对于刚入门的朋友可以修改,如下chromedriver的地址,在相关第三方库都安装的情况下运行代码:
在这里插入图片描述
5.完整代码如下所示,在修改第二步之后是可以直接运行的,如果不能成功运行可以下面评论,或者私聊我,我会帮你解答。

import csv
import random
import re
import time
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import dateutil.parser as dparser
from random import choice
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


chrome_options = webdriver.ChromeOptions()
# 添加其他选项,如您的用户代理等
# ...

# 指定 Chrome WebDriver 的路径
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=chrome_options)
## 时间节点
start_date = dparser.parse('2019-06-01')
## 浏览器设置选项
# chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false')


def get_time():
    '''获取随机时间'''
    return round(random.uniform(3, 6), 1)


def get_user_agent():
    '''获取随机用户代理'''
    user_agents = [
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
        "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
        "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
        "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20",
        "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
        "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
    ]
    ## 在user_agent列表中随机产生一个代理,作为模拟的浏览器
    user_agent = choice(user_agents)
    return user_agent


def get_detail_urls_by_keyword(list_url):
    '''获取包含特定关键字的留言链接'''
    user_agent = get_user_agent()
    chrome_options.add_argument('user-agent=%s' % user_agent)
    drivertemp = webdriver.Chrome(options=chrome_options)
    drivertemp.maximize_window()
    drivertemp.get(list_url)

    # 循环加载页面或翻页,提取包含特定关键字的留言链接
    comments_link,link,title = [],[],[]

    page = 1
    while True:
        try:
            next_page_button = WebDriverWait(drivertemp, 30).until(
                EC.element_to_be_clickable((By.CLASS_NAME, "nextp")))
            if page >= 2:
                break
            if next_page_button.is_enabled():
                next_page_button.click()
                page += 1
            else:
                break
        except TimeoutException:
            # 当找不到下一页按钮时,抛出TimeoutException,结束循环
            break
        time.sleep(3)

        titles = drivertemp.find_elements_by_xpath('//div[@class="title"]')
        for element in titles:
            message_id = element.text.strip().split(':')[-1]
            title.append(message_id)

        comment = drivertemp.find_elements_by_xpath('//div[@class="reply"]')
        for element in comment:
            message_id = element.text.strip().split(':')[-1]
            comments_link.append(message_id)

        links = drivertemp.find_elements_by_xpath('//div[@class="title"]//a[@title]')
        for element in links:
            href = element.get_attribute("href")
            link.append(href)


    drivertemp.quit()
    return link,comments_link,title




list_url = "http://mguba.eastmoney.com/mguba/list/zssh000300"
link, comments_link,title = get_detail_urls_by_keyword(list_url)

# print(title)
# print(link)
# print(comments_link)

# 示例的 link 和 comments 列表

final_link = []  # 用于存储符合条件的链接
final_comments = []
final_title = []
comment_counts = [int(link) for link in comments_link]
# 遍历 link 和 comments 列表,检查 comments 中的元素是否大于 5
for i in range(10,len(link)):
    if comment_counts[i] > 5:
        final_link.append(link[i])
        final_comments.append(comments_link[i])
        final_title.append(title[i])

print(final_title)

def get_information(urls):
    coments_n, date, title, reply, article = [], [], [], [], []
    for url in urls:
        '''获取包含特定关键字的留言链接'''
        user_agent = get_user_agent()
        chrome_options.add_argument('user-agent=%s' % user_agent)
        drivertemp = webdriver.Chrome(options=chrome_options)
        drivertemp.maximize_window()
        drivertemp.get(url)

        titles = drivertemp.find_elements_by_xpath('//div[@class="article-head"]//h1[@class="article-title"]')
        for element in titles:
            message_id = element.text.strip().split(':')[-1]
            title.append(message_id)

        dates = drivertemp.find_elements_by_xpath('//div[@class="article-meta"]//span[@class="txt"]')
        for element in dates:
            message_time = element.text.strip()
            date.append(message_time)

        articles = drivertemp.find_elements_by_xpath('/html/body/script[20]')
        for element in articles:
            message_time = element.get_attribute("text")
            print(message_time)
            #match = re.search(r'\"desc\":\"(.*?)\"', message_time)
            match = re.search(r'(?<=desc:").*?(?=")', message_time)
            if match:
                desc = match.group(0)
                max_line_length = 15
                desc_lines = [desc[i:i + max_line_length] for i in range(0, len(desc), max_line_length)]
                desc_text_formatted = "\n".join(desc_lines)
                article.append(desc_text_formatted)


        replies = drivertemp.find_elements_by_xpath('//div[@class="short_text"]')
        Replies = []
        for element in replies:
            message_time = element.text.strip().split(':')[-1]
            Replies.append(message_time)
        number = len(Replies)
        coments_n.append(number)
        Reply = "\n".join([f"{i + 1}. {comment}" for i, comment in enumerate(Replies)])
        reply.append(Reply)


    drivertemp.quit()
    return coments_n , date, title, reply,article

coments_n, date, title, reply,article = get_information(final_link)

print(reply)
print(article)
print(date)


# 将这些列表组合成一个包含五个列表的列表
data = list(zip(final_comments, date, title, reply, article))

# 指定要保存的CSV文件名
csv_filename = "example3.csv"


# 修改字典中的键名称,使其与列名匹配
data = [
    {"评论数量": c, "日期": d, "帖子标题": t, "帖子的评论": r, "帖子内容": a}
    for c, d, t, r, a in data
]

# 使用csv模块创建CSV文件并写入数据,同时指定列名
with open(csv_filename, 'w', newline='') as csvfile:
    fieldnames = ["评论数量", "日期", "帖子标题", "帖子的评论", "帖子内容"]
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    # 写入列名
    writer.writeheader()

    # 写入数据
    writer.writerows(data)

print(f"Data has been written to {csv_filename}")

6.有需要爬取数据的朋友,或者学习技术的朋友都可以联系我,如果觉得对你有帮助,记得点个赞哦!!!!!!

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
第三方库: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),是因为某一日投资者的评论越多,代表市场投资者情绪的波动越大。
当使用etree库进行爬取东方财富评论时,出现没有所需要的评论内容的问题,可能是由以下几个原因引起的: 1. 页结构变动:东方财富吧的页结构可能会经常性地进行更新和调整,如果etree使用的是旧的页结构,就可能无法正确解析出所需的评论内容。 2. 动态加载:有可能该评论内容是通过JavaScript动态加载生成的,而etree库只能解析静态的HTML页面。这种情况下,使用etree可能无法获取到动态加载的评论内容。 解决这个问题的方法可以有以下几种: 1. 使用其他解析库:尝试使用其他强大的解析库,例如BeautifulSoup或Scrapy等,它们具备更强大的解析能力,可以解析出更复杂的页结构,包括动态加载的内容。 2. 了解页结构变化:随着东方财富页结构的变化,及时了解其最新的结构变化,然后相应地调整爬虫代码,以适应更新后的页结构。 3. 分析页请求:使用浏览器的开发者工具或其他络调试工具,分析络请求,找到包含所需评论内容的请求或接口,然后直接请求该接口获取评论内容,避免解析HTML页面。 总之,爬虫使用etree爬取东方财富评论时没有所需要的评论内容,可能是由于页结构变动或动态加载导致的。解决方法可以尝试使用其他解析库,及时了解页结构的变化,或者直接分析页请求获取评论内容。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Algorithm1576

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

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

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

打赏作者

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

抵扣说明:

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

余额充值