😄需求
爬取白页中全部内容,爬取所有测试集输入输出。
😆 分析
selenium简单向页面发起请求,发现会跳转到登录界面。
所以先需要手动登录一下,获取cookie。然后携带cookie向页面发起请求。
😳 代码+说明
getcookie.py
from selenium import webdriver
import time
import json
# 填写webdriver的保存目录
driver = webdriver.Chrome("..\chromedriver.exe")
# 记得写完整的url 包括http和https
driver.get('https://www.educoder.net/tasks/fctupil8smqo')
# 程序打开网页后20秒内 “手动登陆账户”
time.sleep(20)
with open('cookies.txt','w') as f:
# 将cookies保存为json格式
f.write(json.dumps(driver.get_cookies()))
driver.close()
需要手动登录,获取cookie,并保存到cookie.txt中
spider.py
import json
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from time import sleep
from lxml import etree
from selenium.webdriver.chrome.options import Options
driver = webdriver.Chrome("..\chromedriver.exe")
driver.get('https://www.educoder.net/tasks/fctupil8smqo')
# 首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()
with open('cookies.txt','r') as f:
# 使用json读取cookies 注意读取的是文件 所以用load而不是loads
cookies_list = json.load(f)
#将expiry类型变为int
for cookie in cookies_list:
# 并不是所有cookie都含有expiry 所以要用dict的get方法来获取
if isinstance(cookie.get('expiry'), float):
cookie['expiry'] = int(cookie['expiry'])
driver.add_cookie(cookie)
#重新发送请求(这步是非常必要的,要不然携带完cookie之后仍然在登录界面)
driver.get('https://www.educoder.net/tasks/fctupil8smqo')
#sleep等待页面完全加载出来,这一步很关键
sleep(5)
page_text=driver.page_source
tree=etree.HTML(page_text)
#title为文件名称
title=tree.xpath('//*[@id="root"]/div/div/div/div[2]/section[1]/div[1]/h3/@title')[0]
fileName=title+'.txt'
#将任务要求写入文件中
x=tree.xpath('//*[@id="root"]/div/div/div/div[2]/section[1]/div[2]/div[1]//text()')
with open(fileName,'w',encoding='utf-8') as f:
for i in x:
f.write(i)
f.write('\n\n测试集:\n')
#将测试集写入文件中
with open(fileName,'a',encoding='utf-8') as f:
try:
all=tree.xpath('//*[@class="test-case-list"]//ins/text()')
for j in all:
f.write(j+'\n\n')
f.write('\n\n\n')
except:
print('')
参考博客 这一篇,非常感谢这位大佬