selenium自动登录获取cookie+爬取在线编程网站阿尔法Coding中已完成的代码

具体思路:
之前写过一个爬取阿尔法Coding中已完成的代码的帖子,这个得手动获取cookie并复制到代码中才可以正常爬取数据。
但是通过selenium,我们可以实现自动登录,并自动获取cookie,然后直接在原有代码的基础上继续爬取数据。

在这里插入图片描述
通过selenium依次点击并输入内容(元素的定位直接在检查工具里copy xpath)即可,
在这里插入图片描述

最后登录平台获取cookie,代码如下,具体看注释:

AllinOne.py
# coding=utf-8
import json
import os
import time
from selenium import webdriver
import requests


def getCookie(str):  # 获取cookie
    wd = webdriver.Chrome(r'D:\chromedriver.exe')
    wd.implicitly_wait(10)
    wd.get('http://www.alphacoding.cn/login/')
    select__selections = wd.find_element_by_xpath(
        '//*[@id="app"]/div/div/div/div[2]/div[1]/div/div[1]/div[1]/div[2]/div[1]/div/span').click()#点击下拉列表
    select = wd.find_element_by_xpath(
        '//*[@id="app"]/div/div/div/div[2]/div[1]/div/div[1]/div[1]/div[2]/div[2]/ul[2]/li[2]').click()#选择学校
    username = wd.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[1]/div/div[1]/div[2]/div[2]/input').send_keys('此处输入学号')#输入学号
    password = wd.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[1]/div/div[1]/div[3]/div[2]/input').send_keys('此处输入密码')#输入密码

    login = wd.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[1]/div/div[2]/button/span').click()#点击登录
    time.sleep(3)
    cookie_list = wd.get_cookies()#获取cookie
    cookie1 = cookie_list[1]['name'] + '=' + cookie_list[1]['value']
    cookie2 = cookie_list[0]['name'] + '=' + cookie_list[0]['value']
    usefulcookie = cookie1 + ';' + cookie2#cookie拼接
    # print(usefulcookie)
    wd.quit()#获取cookie后退出浏览器
    return usefulcookie


def getHTMLText(url, usefulcookie):  # 获取网页内容
    try:
        kv = {'cookie': 'null', 'user-agent': 'Mozilla/5.0'}
        kv['cookie'] = usefulcookie
        # print(kv)
        r = requests.get(url, headers=kv, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        demo = r.text
        return demo
    except:
        return ""


def grabCode(demo):  # 提取数据
    jsonstr = json.loads(demo)
    # print(type(jsonstr))
    #   加工数据
    # 输出标题
    print("题目".center(40, '*'))
    print(jsonstr['data']['lesson']['title'])  # 对字典进行访问
    # 输出内容
    print("要求".center(40, '*'))
    print(jsonstr['data']['lesson']['exercises'][0]['description']['content'])  # 对字典和列表进行访问
    # 输出代码
    print("代码".center(40, '*'))
    print(jsonstr['data']['lesson']['exercises'][0]['files'][0]['correctAnswer'])
    # 数据加工后,将题目,内容,代码拼接,相当于成品,下一步存入文件
    code = "题目".center(40, '*') + "\n" + jsonstr['data']['lesson']['title'] + "\n" + \
           "要求".center(40, '*') + "\n" + jsonstr['data']['lesson']['exercise'][0]['description']['content'] + "\n" + \
           "代码".center(40, '*') + "\n" + \
           jsonstr['data']['lesson']['exercise'][0]['files'][0]['correctAnswer']
    return code


def saveText(i, enddate, title):
    root = "d:/CrawlAlphaCoding/"
    textname = root + title[i] + ".txt"
    if not os.path.exists(root):  # 目录不存在则创建
        os.makedirs(root)
    if not os.path.exists(textname):  # 文件不存在则创建
        f = open(textname, "w+", encoding="utf-8")  # 不加encoding会导致部分文件无内容写入
        f.write(enddate)
    else:
        print("文件已存在")


def main():
    usefulcookie = getCookie(str)
    url = 'http://www.alphacoding.cn/api/courses/v3/79/chapterDetail'  # 获取章节信息,包含id和title
    jsonstr = json.loads(getHTMLText(url, usefulcookie))  # 将json格式的字符转换为dict,从文件中读取
    # print(getHTMLText(url, usefulcookie))
    batchUrl = []  # 定义列表,将id和title存入列表,便于保存文件时的使用
    title = []
    rawdate = jsonstr['data']['chapters']
    for i in rawdate:  # 第一个for循环,遍历章节,用于做url后缀访问网站
        for a in range(len(i['lessons'])):  # 第二个for循环,遍历题目,用作文件名
            # print(len(i['lessons']))
            batchUrl.append("http://www.alphacoding.cn/api/learning/v3/79/lesson/" + i['lessons'][a]['lessonId'])#将网址存入Url列表
            title.append(i['lessons'][a]['title'])

    for i in range(len(batchUrl)):
        try:  # 导学部分没有代码,会访问出错,使用try/except处理异常
            print(batchUrl[i])
            saveText(i, grabCode(getHTMLText(batchUrl[i], usefulcookie)), title)
        except:
            print("章节导航没有代码")


main()

运行结果:
在这里插入图片描述
在这里插入图片描述

1. 获取cookie 首先,我们需要使用Selenium启动浏览器,并打开我们要自动登录网站。 ```python from selenium import webdriver # 启动浏览器 driver = webdriver.Chrome() # 打开网站 driver.get('https://www.example.com/') ``` 然后,我们可以使用`driver.get_cookies()`方法获取当前页面的所有cookie。 ```python # 获取所有cookie cookies = driver.get_cookies() # 输出所有cookie for cookie in cookies: print(cookie) ``` 输出的结果类似于: ``` {'domain': 'www.example.com', 'expiry': 1641947537, 'httpOnly': False, 'name': 'SESSIONID', 'path': '/', 'secure': False, 'value': '1234567890'} {'domain': 'www.example.com', 'expiry': 1641947537, 'httpOnly': False, 'name': 'username', 'path': '/', 'secure': False, 'value': 'testuser'} {'domain': 'www.example.com', 'expiry': 1641947537, 'httpOnly': False, 'name': 'password', 'path': '/', 'secure': False, 'value': 'testpassword'} ``` 其,每个cookie都是一个字典,包含以下键值对: - `domain`:cookie所属的域名。 - `expiry`:cookie的过期时间(以Unix时间戳表示)。 - `httpOnly`:指示浏览器是否只能通过HTTP或HTTPS协议访问cookie。 - `name`:cookie的名称。 - `path`:cookie的路径。 - `secure`:指示浏览器是否只能通过HTTPS协议访问cookie。 - `value`:cookie的值。 2. 使用cookie完成自动登录 获取cookie后,我们可以使用`driver.add_cookie()`方法将cookie添加到浏览器。然后,我们可以重新打开网站,浏览器会自动使用我们添加的cookie进行登录。 ```python # 添加cookie driver.add_cookie({'name': 'SESSIONID', 'value': '1234567890'}) driver.add_cookie({'name': 'username', 'value': 'testuser'}) driver.add_cookie({'name': 'password', 'value': 'testpassword'}) # 重新打开网站 driver.get('https://www.example.com/') ``` 这样,我们就完成自动登录功能。 完整代码如下: ```python from selenium import webdriver # 启动浏览器 driver = webdriver.Chrome() # 打开网站 driver.get('https://www.example.com/') # 获取所有cookie cookies = driver.get_cookies() # 输出所有cookie for cookie in cookies: print(cookie) # 添加cookie driver.add_cookie({'name': 'SESSIONID', 'value': '1234567890'}) driver.add_cookie({'name': 'username', 'value': 'testuser'}) driver.add_cookie({'name': 'password', 'value': 'testpassword'}) # 重新打开网站 driver.get('https://www.example.com/') ``` 注意事项: - 获取和使用cookie代码必须在同一个浏览器实例执行。 - 添加cookie时,必须指定cookie的名称和值。其他键值对是可选的,但建议尽量指定。 - 如果添加的cookie网站当前存在的cookie冲突,可能会导致自动登录失败。此时,可以尝试清除浏览器缓存或使用不同的浏览器实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高哥的代码没Bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值