我是一个编程机构的老师,自己搭建了一个OJ供同学们学习,但是OJ缺少题目,我不敢让同学们在luogu做,怕抄袭题解养成坏习惯,所以我打算把洛谷的题目抓下来
登陆
import selenium,time,pyperclip,pyautogui
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
#from selenium.webdriver import ActionChains
#from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
#from selenium.webdriver.support import expected_conditions as EC
#from selenium.common.exceptions import TimeoutException, NoSuchElementException
safari=webdriver.Safari()#这里我使用的Mac的Safari浏览器,可以替换为webdriver.Chrome()
safari.get("https://www.luogu.com.cn/auth/login")
WebDriverWait(safari,5)
def login():
t=input("请输入验证码:")#由于洛谷登陆需要验证码,所以人工输入
userinput=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/div[1]/div/input')
passinput=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/div[2]/div/input')
testinput=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/div[3]/div/div[1]/input')
#loginlogo=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/button')
userinput.click()
userinput.send_keys("username")#输入用户名,把这里改成自己的用户名
passinput.click()
passinput.send_keys("******")#输入密码,把这里改成自己的密码
testinput.click()
testinput.send_keys(str(t))#输入验证码
testinput.send_keys(Keys.ENTER)#按下回车
login()
WebDriverWait(safari,5)
time.sleep(5)
抓取题目
在洛谷题库里,有个选项叫复制markdown ,会把题目的markdown源码拷贝到剪贴板
思路
所以我现在思路是:
- 首先登陆洛谷
- 然后自动跳转循环跳转到题面
- 自动点击“复制markdown”
- 检查是否正确复制到剪贴板,失败则重来
- 如果成功,则读取剪贴板内容,把剪贴板内容写入到Pxxxx.md文件
实现
python3中有一个第三方库叫pyperclip,可以读写剪贴板
读取的方法叫:pyperclip.paste()
写入的方法叫:pyperclip.copy()
最终实现代码
import selenium,time,pyperclip,pyautogui
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
#from selenium.webdriver import ActionChains
#from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
#from selenium.webdriver.support import expected_conditions as EC
#from selenium.common.exceptions import TimeoutException, NoSuchElementException
safari=webdriver.Safari()
safari.get("https://www.luogu.com.cn/auth/login")
WebDriverWait(safari,5)
def login():
t=input("请输入验证码:")
userinput=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/div[1]/div/input')
passinput=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/div[2]/div/input')
testinput=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/div[3]/div/div[1]/input')
#loginlogo=safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/div/div/div/div/div/button')
userinput.click()
userinput.send_keys("username")
passinput.click()
passinput.send_keys("*******")
testinput.click()
testinput.send_keys(str(t))
testinput.send_keys(Keys.ENTER)
login()
WebDriverWait(safari,5)
time.sleep(5)
pyperclip.copy("")
l=""
for i in range(1000,9488):
try:
pname="P"+str(i)
safari.get("https://www.luogu.com.cn/problem/"+pname)
WebDriverWait(safari,20)
time.sleep(1)
pg=""
while True:
safari.find_element(By.XPATH,'//*[@id="app"]/div[2]/main/div/section[2]/section/div/div[1]/a[1]').click()
time.sleep(2)
if(pyperclip.paste()!=l):
pg=str(pyperclip.paste())
break
print(pname)
time.sleep(1.5)
open(pname+".md","w").write(pg)
l=pg
print(pname)
finally:
time.sleep(2.5)
continue
safari.quit()
此程序在macOS ,Safari 16.6版本下测试过,理论上跨平台,但在其它平台需稍改代码,(几乎只用把webdrive.Safari()中的Safari改为Chrome() )
并且要登陆洛谷,所以请把代码中的username替换成里的洛谷用户名,把*******替换成你的洛谷密码
该程序需要使用第三方库有:
pyperclip
selenium
pyautogui
并且声明:你可能要让该程序运行很长时间,你可以直接下载我上传的洛谷主题库题目
这个程序不能爬取测试数据,所以题目导入到OJ里过后再慢慢添加测试数据