Python · 5 11 月, 2024 0

使用selenium实现12306的自动登录

# 自动化实现12306登录
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

index_url = "https://www.12306.cn/index/index.html"
opts = Options()
opts.add_experimental_option("detach", True)
br = Chrome()
br.get(index_url)
# 等待界面加载完成
wait = WebDriverWait(br, 5, poll_frequency=.2)
login_btn_x = '//*[@id="J-btn-login"]'
# 等待标签的出现
wait.until(lambda d: d.find_element(By.XPATH, login_btn_x).is_displayed())
l_btn = br.find_element(By.XPATH, login_btn_x)
if l_btn is None:
    print("当前界面已登录,不需要再次登录")
    exit(3)

# 找到了按钮,则点击按钮
l_btn.click()

wait = WebDriverWait(br, 5, poll_frequency=.2)
account_btn = '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[1]/a'
wait.until(lambda d: d.find_element(By.XPATH, account_btn).is_displayed())

# 输入账号和密码, 这里需要输入自己的账号密码
br.find_element(By.XPATH, '//*[@id="J-userName"]').send_keys("username")
br.find_element(By.XPATH, '//*[@id="J-password"]').send_keys("password")
br.find_element(By.XPATH, '//*[@id="J-login"]').click()

wait = WebDriverWait(br, 2, poll_frequency=.2)
wait.until(lambda d: d.find_element(By.XPATH, '//*[@id="id_card"]').is_displayed())

br.find_element(By.XPATH, '//*[@id="id_card"]').send_keys("身份证号码后四位")
send_code_btn = br.find_element(By.XPATH, '//*[@id="verification_code"]')
content = send_code_btn.text

sms_code = None
if content in ["获取验证码", "重新获取"]:
    print("获取验证码成功!")
    send_code_btn.click()
    sms_code = input("请输入你收到的验证码: ")

if not sms_code:
    print("获取验证码失败!")
    exit(10)

br.find_element(By.XPATH, '//*[@id="code"]').send_keys(sms_code)
# 执行登录操作
br.find_element(By.XPATH, '//*[@id="sureClick"]').click()
print("登录完成!")

12306有自己的验证规则,比方说一天发送短信有次数的限制,因此不能无限制的尝试。但是在这个过程中,需要输入验证码,因此这里是不能完全实现自动化的。可以研究一下,只登录一次,然后将cookie等信息保存,以在下次使用,以此实现以此登录,做后续的操作。

该代码只用于学习,不用于其他用途~~

最近在学习python的一些使用,其中向学习一些爬虫的实现,主要分为几类吧:

  1. 能够直接通过api地址获取到数据
  2. 界面数据加密,破解很困难,可以配置selenium + driver模拟浏览器请求
  3. 工程化的爬虫实现