登录网址: https://account.xiaomi.com/ 活动页面: https://s1.mi.com/m/app/hd/index.html?id=15042 如题,我想买个小米手环但是小米商城里面的 5 折优惠券太难抢了,于是手写了一段代码(selenium)如下:
from selenium import webdriver import time import datetime chrome_driver = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe' #chromedriver 的文件位置 browser = webdriver.Chrome(executable_path = chrome_driver) def login(name ,pwd): browser.get( 'https://account.xiaomi.com/')#登录网址 time.sleep(2) browser.find_element_by_id("username").send_keys(name) #利用账号标签的 ID,确定位置并 send 信息 browser.find_element_by_id("pwd").send_keys(pwd) #利用密码标签的 ID,确定位置并 send 信息 browser.find_element_by_id("login-button").click()#利用登录按钮的 ID,确定位置并点击 #如果找不到标签 ID,可以使用其他方法来确定元素位置 time.sleep(3) browser.get("https://s1.mi.com/m/app/hd/index.html?id=15042")#切换到秒杀页面 print('登录成功,正在等待秒杀') def buy_on_time(): while True: #不断刷新时钟 now = datetime.datetime.now() if now.strftime('%H:%M:%S') == '09:00:00' or now.strftime('%H:%M:%S') == '11:00:00' or now.strftime('%H:%M:%S') == '15:00:00' or now.strftime('%H:%M:%S') == '17:00:00': # if now.strftime('%H:%M:%S') == buytime: browser.find_element_by_xpath("//div[@class='content-box flex-box']/a[@data-log_code='logcode#activity_code=wjsncc49&page=activity&page_id=15042&bid=3645414.0']/div/img").click() # browser.find_element_by_xpath("//a[@data-log_code='logcode#activity_code=1i19jyzh&page=activity&page_id=15042&bid=3645414.0']").click() # browser.find_element_by_xpath("//a[@data-log_code='logcode#activity_code=tudhbjjy&page=activity&page_id=15042&bid=3646017.0']").click() #购买按钮的 Xpath # browser.find_element_by_xpath("//a[@data-log_code='logcode#activity_code=qpohzak0&page=activity&page_id=15042&bid=3646017.0']").click() print('当前时段已抢购完毕') time.sleep(0.01)#注意刷新间隔时间要尽量短 login('username' , 'password') time.sleep(10) buy_on_time()#指定秒杀时间,并且开始等待秒杀
运行的时候发现了一个问题,直接运行的话会报错找不到元素
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <img src="http://www.v2ex.com//cdn.cnbj1.fds.api.mi-img.com/mi-mall/233e61ba38ffb86943fea320adb1607a.jpg"> is not clickable at point (394, 648). Other element would receive the click: <img src="https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/6e607d2e29651daa308b6310998f2991.png?w=216&h=160&bg=7FFFFF"> (Session info: chrome=83.0.4103.7)
然后我每次都要在它运行之后在 Chromedriver 开的浏览器里面F12
打开一下源码之后运行才不会报错,求问大佬这种优惠券的话该怎么抓取,能给个源码就更好啦!
1 youngs 2020-04-27 11:03:01 +08:00 传说中的薅羊毛? |
![]() | 2 hunter2015 2020-04-27 11:04:53 +08:00 鉴定完毕,羊毛党 |
![]() | 4 evilic 2020-04-27 11:15:01 +08:00 偷懒的代码 ```python #!/usr/bin/python3 # -*- coding: UTF-8 -*- import pyautogui pyautogui.moveTo(968, 485) # 链接坐标 pyautogui.click(clicks=20000) ``` |
![]() | 5 evilic 2020-04-27 11:16:39 +08:00 事实上,我也不知道代码能不能运行,因为我不抢券。 |
![]() | 7 evilic 2020-04-27 11:33:42 +08:00 这种抢券的,正常应该是在 console 里加载 js 然后直接执行 js 发送请求的,不需要 selenium 的。 |
![]() | 8 evilic 2020-04-27 11:48:55 +08:00 |
![]() | 9 sigone 2020-04-27 12:27:22 +08:00 via Android 我觉得你不如写一个京东抢飞天茅台的外挂更有意义。 |
![]() | 10 gunavy 2020-04-27 12:48:14 +08:00 能行?没有前段分流吗? |
13 LZSZ 2020-04-27 13:22:40 +08:00 driver.find_elements_by_class_name('flex-box-item')[2].Click(); 行不行? |
![]() | 14 zdnyp 2020-04-27 13:29:24 +08:00 selenium 不行的,速度太慢了。人家接口 2s 请求完了,你浏览器还没打开。 |
![]() | 16 cquyf 2020-04-27 13:46:14 +08:00 大佬就是厉害 |
![]() | 17 westoy 2020-04-27 13:46:43 +08:00 headless 是抢不到的, 别浪费时间了 真の黄牛都是直接怼接口的 |
![]() | 18 heyhumor 2020-04-27 13:54:38 +08:00 xpath 不行就用 css_selector |
![]() | 21 xiaoming1992 2020-04-27 15:18:48 +08:00 via Android 同楼上,还是 f12 找找接口直接发请求吧 |
![]() | 22 2joe 2020-04-27 18:08:21 +08:00 selenium 不适用这个抢东西,放弃把,搞接口 |
![]() | 25 yunying 2020-04-27 21:46:16 +08:00 headless 虚拟浏览器也就适合模拟登录时偷懒用。。真正爬数据时还是得靠接口直接请求获取。。而且这也不用 js 。直接 python 发起 http 请求就好 |
![]() | 26 HuberyPang 2020-04-28 14:26:45 +08:00 F12 进入控制台,运行下面这个代码 var timer = setInterval(function() { document.querySelector("#app > div > div:nth-child(5) > div > div > a:nth-child(1)").click()); }, 3000) 此时每隔秒大概可以看到一次,活动未开始,证明进行了请求 每隔 3 秒请求一次,clearInterval(timer) 这个是清除定时。至于会不会被拉黑账号这个就不清楚了。 |
![]() | 27 HuberyPang 2020-04-28 14:28:32 +08:00 一会儿 3 点我试一波,哈哈哈 |
![]() | 28 HuberyPang 2020-04-28 15:05:37 +08:00 上面那个 click 多打了半个括号,抢购失败。 |
29 yinuxy OP @HuberyPang 哈哈哈 |
30 yinuxy OP @HuberyPang 设置 3s 的话会不会太长了,这个优惠券基本上都是秒的 |
31 yinuxy OP @HuberyPang 太快了,我调成 1ms 也不行 |