• 【python】使用Selenium获取(2023博客之星)的参赛文章



    在这里插入图片描述

    前言

    2023博客之星活动已经过了半年之久,出于好奇,想看看目前为止到底有多少人参与了, 由于小助手每次只发单独赛道的, 因此无法窥其全貌,进行对比, 因此写了这个脚本,来分析一下, 看到结果之后, 很想放弃啊, 太卷了.

    导入模块

    from selenium import webdriver
    import json
    from selenium.webdriver.common.by import By
    from selenium.common.exceptions import NoSuchElementException
    import time
    from datetime import datetime
    import pandas as pd
    from openpyxl import Workbook, load_workbook
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 这一部分代码导入了所需的模块,其中包括selenium、json、time、datetime、pandas和openpyxl。

    设置ChromeDriver路径和创建WebDriver对象

    driver_path = ''
    driver = webdriver.Chrome(driver_path)
    
    • 1
    • 2
    • 这部分代码设置了ChromeDriver的路径,并创建了一个Chrome WebDriver对象,用于操作浏览器。

    打开网页

    url = 'https://bbs.csdn.net/forums/blogstar2023?typeId=3092730&spm=1001.2014.3001.9616'
    driver.get(url)
    time.sleep(5)
    
    • 1
    • 2
    • 3
    • 这部分代码通过get()方法打开了指定的网页,并使用time.sleep()方法等待5秒钟以确保页面加载完成。

    找到结果元素

    results = driver.find_element(By.CLASS_NAME, "user-tabs").find_elements(By.CLASS_NAME, "tab-list-item")
    
    • 1
    • 这部分代码通过find_element()方法定位Class名字为"user-tabs"的元素,并通过find_elements()方法查找其下所有Class名字为"tab-list-item"的元素,将结果保存在results变量中。

    创建一个空列表用于存储数据

    data = []
    
    • 1
    • 这部分代码创建了一个空列表data,用于存储数据。

    获取当前日期和时间

    current_datetime = datetime.now()
    current_date = current_datetime.date()
    
    • 1
    • 2
    • 这部分代码获取了当前的日期。

    创建一个新的 Excel 文件

    result_workbook = Workbook()
    result_sheet = result_workbook.active
    
    • 1
    • 2
    • 这部分代码使用openpyxl库的Workbook函数创建了一个新的Excel文件和一个工作表,并使用active属性获取默认的工作表。

    写入标题行

    result_sheet.append(['排名',"用户名","总原力值","当月获得原力值","2023年获得原力值","2023年高质量博文数"])
    
    • 1
    • 这部分代码使用append()方法将标题写入工作表的第一行。

    遍历结果元素并提取数据

    for result in results:
        time.sleep(5)
        
        title = result.find_element(By.CLASS_NAME, 'content-wrapper').find_element(By.CLASS_NAME, 'long-text-title').text
        link = result.find_element(By.CLASS_NAME, 'content-wrapper').find_element(By.CLASS_NAME, 'align-items-center').get_attribute("href")
        if str(current_date) in title:
            item = {
                'title': title,  # 标题
                'link': link
            }
            data.append(item)
        else:
            print(f'不是今天的不做处理. 标题{title}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 这部分代码使用for循环遍历结果元素列表,并使用find_element()方法提取每个元素中的标题和链接信息。如果标题包含当前日期,则将标题和链接以字典的形式存储在data列表中。否则,输出一条消息。

    输出data列表

    print(data)
    
    • 1
    • 这部分代码输出data列表,显示提取的数据。

    创建一个空的DataFrame来存储数据

    df = pd.DataFrame(columns=["Link", "Content"])
    
    • 1
    • 这部分代码使用pandas的DataFrame函数创建了一个空的DataFrame,用于存储数据。

    遍历链接并爬取数据

    for item in data:
        print(item['link'])
        driver.get(item['link'])
        time.sleep(5)
        table_element = driver.find_element(By.CLASS_NAME, 'markdown_views').find_element(By.TAG_NAME, 'table')
        rows = table_element.find_elements(By.TAG_NAME, 'tr')
        for row in rows:
            row_data = []
            columns = row.find_elements(By.TAG_NAME, 'td')
            for column in columns:
                 cell_data = column.text
                 row_data.append(cell_data)
                 print(cell_data)
            result_sheet.append(row_data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 这部分代码使用for循环遍历data列表中的每个元素,获取其链接并导航到该链接。然后从页面中找到标签为table的元素,并遍历表格的行和列,将单元格中的数据保存在row_data列表中,然后将row_data添加到result_sheet工作表中。

    关闭浏览器驱动

    driver.quit()
    
    • 1
    • 这部分代码关闭了浏览器驱动,释放资源。

    保存结果到一个新的 Excel 文件

    result_workbook.save('博客之星.xlsx')
    
    • 1
    • 这部分代码使用save()方法将result_workbook保存为名为"博客之星.xlsx"的Excel文件。

    完整代码如下

    from selenium import webdriver
    import json
    from selenium.webdriver.common.by import By
    from selenium.common.exceptions import NoSuchElementException
    import time
    from datetime import datetime
    import pandas as pd
    from openpyxl import Workbook, load_workbook
    
    # 设置ChromeDriver的路径
    driver_path = ''
    
    # 创建Chrome WebDriver对象
    driver = webdriver.Chrome(driver_path)
    
    # 打开网页
    url = 'https://bbs.csdn.net/forums/blogstar2023?typeId=3092730&spm=1001.2014.3001.9616'
    driver.get(url)
    time.sleep(5)
    
    # 找到结果元素
    results = driver.find_element(By.CLASS_NAME, "user-tabs").find_elements(By.CLASS_NAME, "tab-list-item")
    
    # 创建一个空列表用于存储数据
    data = []
    
    # 获取当前日期和时间
    current_datetime = datetime.now()
    # 提取当前日期
    current_date = current_datetime.date()
    
    
    # 创建一个新的 Excel 文件
    result_workbook = Workbook()
    result_sheet = result_workbook.active
    
    # 写入标题行
    result_sheet.append(['排名',"用户名","总原力值","当月获得原力值","2023年获得原力值","2023年高质量博文数"])
    # 遍历结果元素并提取数据
    for result in results:
        time.sleep(5)
    
    
        title = result.find_element(By.CLASS_NAME, 'content-wrapper').find_element(By.CLASS_NAME, 'long-text-title').text
        link = result.find_element(By.CLASS_NAME, 'content-wrapper').find_element(By.CLASS_NAME, 'align-items-center').get_attribute("href")
        if str(current_date) in title:
            # 将提取的数据存储为字典格式
            item = {
                'title': title,  # 标题
                'link': link
            }
            # 将字典添加到数据列表中
            data.append(item)
        else:
            print(f'不是今天的不做处理. 标题{title}')
    
    print(data)
    
    # 创建一个空的DataFrame来存储数据
    df = pd.DataFrame(columns=["Link", "Content"])
    
    
    # 遍历链接并爬取数据
    for item in data:
        print(item['link'])
        # 导航到链接
        driver.get(item['link'])
        time.sleep(5)
        table_element = driver.find_element(By.CLASS_NAME, 'markdown_views').find_element(By.TAG_NAME, 'table')
        rows = table_element.find_elements(By.TAG_NAME, 'tr')  # 获取所有行
        for row in rows:
            row_data = []
            columns = row.find_elements(By.TAG_NAME, 'td')  # 获取每行中的所有列
            for column in columns:
                 cell_data = column.text
                 row_data.append(cell_data)
                 print(cell_data)
            result_sheet.append(row_data)
    
    # 关闭浏览器驱动
    driver.quit()
    
    # 保存结果到一个新的 Excel 文件
    result_workbook.save('博客之星.xlsx')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    运行效果

    在这里插入图片描述

    结束语

    太难了, 卷不起啊!!!

  • 相关阅读:
    ssm基于小程序的医院预约挂号系统毕业设计源码260839
    电商数仓项目中各层的表
    【docker 实战】Docker数据卷的清理
    文件压缩:WinRAR设置默认压缩格式为.zip
    青阳网络文件传输系统 kiftd 1.1.0 正式发布!
    C++ 基础与深度分析 Chapter11 类与面向对象编程(析构与复制成员函数、字面值类、成员指针与bind交互)
    Linux常用命令
    Sora来袭!机器人+Sora落地性如何?
    云原生之深入解析Prometheus的安装部署和原理分析
    Ubuntu24.04 LTS安装中文输入法
  • 原文地址:https://blog.csdn.net/qq_33681891/article/details/132062763