前言
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
- 这一部分代码导入了所需的模块,其中包括selenium、json、time、datetime、pandas和openpyxl。
设置ChromeDriver路径和创建WebDriver对象
driver_path = '' driver = webdriver.Chrome(driver_path)
- 这部分代码设置了ChromeDriver的路径,并创建了一个Chrome WebDriver对象,用于操作浏览器。
打开网页
url = 'https://bbs.csdn.net/forums/blogstar2023?typeId=3092730&spm=1001.2014.3001.9616' driver.get(url) time.sleep(5)
- 这部分代码通过get()方法打开了指定的网页,并使用time.sleep()方法等待5秒钟以确保页面加载完成。
找到结果元素
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变量中。
创建一个空列表用于存储数据
data = []
- 这部分代码创建了一个空列表data,用于存储数据。
获取当前日期和时间
current_datetime = datetime.now() current_date = current_datetime.date()
- 这部分代码获取了当前的日期。
创建一个新的 Excel 文件
result_workbook = Workbook() result_sheet = result_workbook.active
- 这部分代码使用openpyxl库的Workbook函数创建了一个新的Excel文件和一个工作表,并使用active属性获取默认的工作表。
写入标题行
result_sheet.append(['排名',"用户名","总原力值","当月获得原力值","2023年获得原力值","2023年高质量博文数"])
- 这部分代码使用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}')
- 这部分代码使用for循环遍历结果元素列表,并使用find_element()方法提取每个元素中的标题和链接信息。如果标题包含当前日期,则将标题和链接以字典的形式存储在data列表中。否则,输出一条消息。
输出data列表
print(data)
- 这部分代码输出data列表,显示提取的数据。
创建一个空的DataFrame来存储数据
df = pd.DataFrame(columns=["Link", "Content"])
- 这部分代码使用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)
- 这部分代码使用for循环遍历data列表中的每个元素,获取其链接并导航到该链接。然后从页面中找到标签为table的元素,并遍历表格的行和列,将单元格中的数据保存在row_data列表中,然后将row_data添加到result_sheet工作表中。
关闭浏览器驱动
driver.quit()
- 这部分代码关闭了浏览器驱动,释放资源。
保存结果到一个新的 Excel 文件
result_workbook.save('博客之星.xlsx')
- 这部分代码使用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')
运行效果
结束语
太难了, 卷不起啊!!!