鱼C论坛

 找回密码
 立即注册
查看: 108|回复: 3

劳烦看下下面的问题

[复制链接]
发表于 2024-5-13 12:12:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
劳烦大佬们看下下面的代码,为什么始终无法正常运行?
  1. import os  # 创建文件夹, 文件是否存在
  2. import time  # time 计时
  3. import pickle  # 保存和读取cookie实现免登陆的一个工具
  4. from time import sleep
  5. from selenium import webdriver  # 操作浏览器的工具
  6. from selenium.webdriver.common.by import By

  7. """
  8. 一. 实现免登陆
  9. 二. 抢票并且下单
  10. """
  11. # 大麦网主页
  12. damai_url = 'https://www.damai.cn/'
  13. # 登录
  14. login_url = 'https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F'
  15. # 抢票目标页
  16. target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.home.card_0.ditem_2.591b23e1AyXdAl&id=729700971838'


  17. # class Concert:
  18. class Concert:
  19.     # 初始化加载
  20.     def __init__(self):
  21.         self.status = 0  # 状态, 表示当前操作执行到了哪个步骤
  22.         self.login_method = 1  # {0:模拟登录, 1:cookie登录}自行选择登录的方式
  23.         self.driver = webdriver.Chrome(executable_path='chromedriver.exe')  # 当前浏览器驱动对象

  24.     # cookies: 登录网站时出现的 记录用户信息用的
  25.     def set_cookies(self):
  26.         """cookies: 登录网站时出现的 记录用户信息用的"""
  27.         self.driver.get(damai_url)
  28.         print('###请点击登录###')
  29.         # 我没有点击登录,就会一直延时在首页, 不会进行跳转
  30.         while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
  31.             sleep(1)
  32.         print('###请扫码登录###')
  33.         # 没有登录成功
  34.         while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
  35.             sleep(1)
  36.         print('###扫码成功###')
  37.         # get_cookies: driver里面的方法
  38.         pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
  39.         print('###cookie保存成功###')
  40.         self.driver.get(target_url)

  41.     # 假如说我现在本地有 cookies.pkl 那么 直接获取
  42.     def get_cookie(self):
  43.         """假如说我现在本地有 cookies.pkl 那么 直接获取"""
  44.         cookies = pickle.load(open('cookies.pkl', 'rb'))
  45.         for cookie in cookies:
  46.             cookie_dict = {
  47.                 'domain': '.damai.cn',  # 必须要有的, 否则就是假登录
  48.                 'name': cookie.get('name'),
  49.                 'value': cookie.get('value')
  50.             }
  51.             self.driver.add_cookie(cookie_dict)
  52.         print('###载入cookie###')

  53.     def login(self):
  54.         """登录"""
  55.         if self.login_method == 0:
  56.             self.driver.get(login_url)
  57.             print('###开始登录###')
  58.         elif self.login_method == 1:
  59.             # 创建文件夹, 文件是否存在
  60.             if not os.path.exists('cookies.pkl'):
  61.                 self.set_cookies()  # 没有文件的情况下, 登录一下
  62.             else:
  63.                 self.driver.get(target_url)  # 跳转到抢票页
  64.                 self.get_cookie()  # 并且登录

  65.     def enter_concert(self):
  66.         """打开浏览器"""
  67.         print('###打开浏览器,进入大麦网###')
  68.         # 调用登录
  69.         self.login()  # 先登录再说
  70.         self.driver.refresh()  # 刷新页面
  71.         self.status = 2  # 登录成功标识
  72.         print('###登录成功###')
  73.         # 处理弹窗
  74.         if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):
  75.             self.driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()

  76.     # 二. 抢票并且下单
  77.     def choose_ticket(self):
  78.         """选票操作"""
  79.         if self.status == 2:
  80.             print('=' * 30)
  81.             print('###开始进行日期及票价选择###')
  82.             while self.driver.title.find("确认订单") == -1:
  83.                 try:
  84.                     buybutton = self.driver.find_element(By.CLASS_NAME, 'buybtn').text
  85.                     if buybutton == '提交缺货登记':
  86.                         self.status = 2  # 没有进行更改操作
  87.                         self.driver.get(target_url)  # 刷新页面 继续执行操作
  88.                     elif buybutton == '立即预定':
  89.                         # 点击立即预定
  90.                         self.driver.find_element('buybtn').click()
  91.                         self.status = 3
  92.                     elif buybutton == '立即购买':
  93.                         self.driver.find_element(By.CLASS_NAME, 'buybtn').click()
  94.                         self.status = 4
  95.                     elif buybutton == '选座购买':
  96.                         self.driver.find_element(By.CLASS_NAME, 'buybtn').click()
  97.                         self.status = 5
  98.                 except:
  99.                     print('###没有跳转到订单结算界面###')
  100.                 title = self.driver.title
  101.                 if title == '选座购买':
  102.                     # 选座购买的逻辑
  103.                     self.choice_seats()
  104.                 elif title == '确认订单':
  105.                     # 实现下单的逻辑
  106.                     while True:
  107.                         # 如果标题为确认订单
  108.                         print('正在加载.......')
  109.                         # 如果当前购票人信息存在 就点击
  110.                         if self.isElementExist('//*[@id="container"]/div/div[9]/button'):
  111.                             # 下单操作
  112.                             self.check_order()
  113.                             break

  114.     def choice_seats(self):
  115.         """选择座位"""
  116.         while self.driver.title == '选座购买':
  117.             while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
  118.                 print('请快速选择你想要的座位!!!')
  119.             while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
  120.                 self.driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[2]/div[2]/button').click()

  121.     def check_order(self):
  122.         """下单操作"""
  123.         if self.status in [3, 4, 5]:
  124.             print('###开始确认订单###')
  125.             time.sleep(1)
  126.             try:
  127.                 # 默认选第一个购票人信息
  128.                 self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
  129.             except Exception as e:
  130.                 print('###购票人信息选中失败, 自行查看元素位置###')
  131.                 print(e)
  132.             # 最后一步提交订单
  133.             time.sleep(0.5)  # 太快了不好, 影响加载 导致按钮点击无效
  134.             self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[9]/button').click()
  135.             time.sleep(20)

  136.     def isElementExist(self, element):
  137.         """判断元素是否存在"""
  138.         flag = True
  139.         browser = self.driver
  140.         try:
  141.             browser.find_element(By.XPATH, element)
  142.             return flag
  143.         except:
  144.             flag = False
  145.             return flag

  146.     def finish(self):
  147.         """抢票完成, 退出"""
  148.         self.driver.quit()


  149. if __name__ == '__main__':
  150.     con = Concert()
  151.     try:
  152.         con.enter_concert()  # 打开浏览器
  153.         con.choose_ticket()  # 选择座位
  154.     except Exception as e:
  155.         print(e)
  156.         con.finish()
复制代码
1.png
2.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-13 12:12:35 | 显示全部楼层
这段代码在运行时可能会出现一些问题。首先,确保你的电脑上安装了Chrome浏览器,并且将其驱动程序(chromedriver.exe)与你的Python文件放在同一个目录中。

其次,从代码中看到,它尝试使用Cookie进行免登录操作。但是,在执行`set_cookies()`方法之前,你需要手动登录大麦网并生成cookie,并将其保存在名为"cookies.pkl"的文件中。如果你没有手动生成cookie,则无法进行免登录操作。

此外,还需要特别注意一些语法错误:
- 在`choose_ticket()`方法中,`if self.status in :`代码后面缺少一个列表或其他数据结构来进行判断。
- 在`isElementExist()`方法中,`browser.find_element(By.XPATH, element)`代码后面应该使用`except NoSuchElementException:`来捕获元素不存在的异常,而不使用裸露的`except:`。

最后,确保你安装了`selenium`和`pickle`模块。你可以使用以下命令来进行安装:
  1. pip install selenium
  2. pip install pickle
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-13 15:12:13 | 显示全部楼层
FishC 发表于 2024-5-13 12:12
这段代码在运行时可能会出现一些问题。首先,确保你的电脑上安装了Chrome浏览器,并且将其驱动程序(chrome ...
  1. raceback (most recent call last):
  2.   File "C:\Users\Administrator\Desktop\大麦.py", line 164, in <module>
  3.     con = Concert()
  4.   File "C:\Users\Administrator\Desktop\大麦.py", line 26, in __init__
  5.     self.driver = webdriver.Chrome(executable_path='chromedriver.exe')  # 当前浏览器驱动对象
  6. TypeError: __init__() got an unexpected keyword argument 'executable_path'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-13 15:12:34 | 显示全部楼层
lxg1434334642 发表于 2024-05-13 15:12
raceback (most recent call last):
  File "C:\User ...


这个错误发生在`webdriver.Chrome()`方法中,因为它没有接受名为`executable_path`的关键字参数。

你需要检查以下几点:

1. 确保你的电脑上安装了Chrome浏览器。
2. 确保你下载了与你的Chrome浏览器版本相对应的Chrome驱动程序(chromedriver.exe)。你可以从这个网址下载:https://sites.google.com/a/chromium.org/chromedriver/home
   下载后,将chromedriver.exe文件放在与Python文件相同的目录中。

如果你已经确认了以上两点,并且仍然出现这个错误,请尝试更新你的selenium库。你可以使用以下命令来更新:
`pip install --upgrade selenium`

如果问题依然存在,请提供你所使用的Chrome浏览器和selenium库的版本信息,这样我才能更好地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 22:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表