参考教材python语言程序设计基础(第2版)实例20,编写Python爬虫程序,爬取地址: https://www.luogu.com.cn/contest/68651#scoreboard中的比赛榜单, 读取《用户信息.xls文件》,如果用户信息中的账号不在榜单中则排名填-1,如果用户在榜单中则爬取用户的排名和题目通过情况(例:A题通过则填AC,否则留空)
时间: 2024-02-19 08:01:19 浏览: 68
https://www.luogu.com.cn/problem/solution/P8595
这是一个比较复杂的任务,需要用到爬虫和数据处理等技术。以下是一个可能的解决方案:
```python
import requests
from bs4 import BeautifulSoup
import xlrd
import xlwt
# 爬取比赛榜单
url = "https://www.luogu.com.cn/contest/68651#scoreboard"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
# 获取所有参赛选手的账号和排名
rank_list = []
for row in soup.select("#ranklist tbody tr"):
rank = row.select_one(".rank").text.strip()
username = row.select_one(".username").text.strip()
rank_list.append((username, rank))
# 读取用户信息文件
workbook = xlrd.open_workbook("用户信息.xls")
sheet = workbook.sheet_by_index(0)
# 处理用户信息
result_list = []
for row_index in range(sheet.nrows):
row = sheet.row_values(row_index)
username = row[0].strip()
if username == "账号":
continue # 跳过表头行
rank = -1 # 默认排名为-1
ac_list = [] # 记录通过的题目
for item in rank_list:
if username == item[0]:
rank = item[1] # 如果账号在榜单中,则更新排名
break
for i in range(1, sheet.ncols):
if row[i].strip().lower() == "ac":
ac_list.append(chr(ord("A") + i - 1)) # 将通过的题目转换为字母
ac_str = ",".join(ac_list) # 将通过的题目用逗号连接起来
result_list.append([username, rank, ac_str])
# 将结果写入新的Excel文件
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("结果")
sheet.write(0, 0, "账号")
sheet.write(0, 1, "排名")
sheet.write(0, 2, "通过题目")
for row_index, row in enumerate(result_list):
sheet.write(row_index + 1, 0, row[0])
sheet.write(row_index + 1, 1, row[1])
sheet.write(row_index + 1, 2, row[2])
workbook.save("结果.xls")
```
以上代码中,我们首先使用 requests 和 BeautifulSoup 库爬取比赛榜单,然后读取用户信息文件,处理得到每个用户的排名和通过题目情况,最后将结果写入新的 Excel 文件中。需要注意的是,爬取的排名和用户信息中的账号可能有大小写不同的情况,因此在比较时需要将它们转换为相同的大小写形式。
阅读全文