参考教材实例20,编写Python爬虫程序,爬取地址: https://www.luogu.com.cn/contest/68651#scoreboard中的比赛榜单, 读取《用户信息.xls文件》,如果用户信息中的账号不在榜单中则排名填-1,如果用户在榜单中则爬取用户的排名和题目通过情况(例:A题通过则填AC,否则留空)
时间: 2024-02-29 11:55:08 浏览: 56
ACMNOICSP比赛经验分享&代码程序资源.md
好的,这里是完整的代码:
```python
import openpyxl
import requests
from bs4 import BeautifulSoup
# 读取用户信息
users = {}
wb = openpyxl.load_workbook('用户信息.xlsx')
ws = wb.active
for row in ws.iter_rows(min_row=2, values_only=True):
account, name = row
users[account] = {'name': name, 'rank': -1, 'problems': {}}
# 爬取比赛榜单
url = 'https://www.luogu.com.cn/contest/68651'
resp = requests.get(f'{url}/scoreboard')
soup = BeautifulSoup(resp.text, 'html.parser')
# 解析排名信息
for tr in soup.select('.lg-table > tbody > tr'):
account = tr.select_one('.lg-right > a').text
if account in users:
rank = tr.select_one('.lg-right:nth-child(2)').text
users[account]['rank'] = rank
for td in tr.select('td.lg-right-td')[2:]:
if td.text.strip() == '-':
users[account]['problems'][td['data-problem-id']] = ''
else:
users[account]['problems'][td['data-problem-id']] = td.text.strip()
# 写入结果
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['账号', '姓名', '排名'] + [f'题目{i}' for i in range(1, len(users[next(iter(users))]['problems']) + 1)])
for account, info in users.items():
row = [account, info['name'], info['rank']]
for problem in info['problems'].values():
row.append(problem)
ws.append(row)
wb.save('比赛结果.xlsx')
```
注意,这里需要将代码中的 `"用户信息.xlsx"` 和 `"比赛结果.xlsx"` 改成实际的文件名。另外,如果题目的数量比较多,写入 Excel 文件时可能会比较耗时,需要等待一段时间才能完成。
阅读全文