Python3 selenium爬虫抓取luogu主题库题目

我是一个编程机构的老师,自己搭建了一个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源码拷贝到剪贴板

思路 

所以我现在思路是:

  1. 首先登陆洛谷
  2. 然后自动跳转循环跳转到题面
  3. 自动点击“复制markdown” 
  4. 检查是否正确复制到剪贴板,失败则重来
  5. 如果成功,则读取剪贴板内容,把剪贴板内容写入到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里过后再慢慢添加测试数据

下载地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值