前言
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')
运行效果
结束语
太难了, 卷不起啊!!!