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

2024-02-29 19:46:33 浏览数 (2)

前言

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

导入模块

代码语言:javascript复制
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
  • 这一部分代码导入了所需的模块,其中包括selenium、json、time、datetime、pandas和openpyxl。

设置ChromeDriver路径和创建WebDriver对象

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

打开网页

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

找到结果元素

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

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

代码语言:javascript复制
data = []
  • 这部分代码创建了一个空列表data,用于存储数据。

获取当前日期和时间

代码语言:javascript复制
current_datetime = datetime.now()
current_date = current_datetime.date()
  • 这部分代码获取了当前的日期。

创建一个新的 Excel 文件

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

写入标题行

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

遍历结果元素并提取数据

代码语言:javascript复制
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}')
  • 这部分代码使用for循环遍历结果元素列表,并使用find_element()方法提取每个元素中的标题和链接信息。如果标题包含当前日期,则将标题和链接以字典的形式存储在data列表中。否则,输出一条消息。

输出data列表

代码语言:javascript复制
print(data)
  • 这部分代码输出data列表,显示提取的数据。

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

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

遍历链接并爬取数据

代码语言:javascript复制
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)
  • 这部分代码使用for循环遍历data列表中的每个元素,获取其链接并导航到该链接。然后从页面中找到标签为table的元素,并遍历表格的行和列,将单元格中的数据保存在row_data列表中,然后将row_data添加到result_sheet工作表中。

关闭浏览器驱动

代码语言:javascript复制
driver.quit()
  • 这部分代码关闭了浏览器驱动,释放资源。

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

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

完整代码如下

代码语言:javascript复制
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')

运行效果

结束语

太难了, 卷不起啊!!!

0 人点赞