南岸 发表于 2021-1-25 21:20

Selenium模拟淘宝登陆的一次尝试

**最近在学习爬虫,今天看实战是要爬取淘宝的一些信息,老师讲的挺好,自己来就死到这个登陆了,所以尝试写了一个模拟登陆,还望大佬指正**


```
# -*- coding: utf-8 -*-
"""
@Time : 2021/1/25 19:28
@Auth : Ne-21
@file :taobao_login.py
@IDE :PyCharm
@Motto:Another me.

"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time

options = webdriver.ChromeOptions()
browser = webdriver.Chrome(options=options)
# 防止被监测
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": '''
            Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
            })
          '''
})
wait = WebDriverWait(browser, 5)


def do_slider():
    """
    处理滑动验证码
    :return:
    """
    slider_go = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR, '#nc_1_n1z'))
    )
    # 实例化一个动作链关联游览器
    action = ActionChains(browser)
    action.reset_actions()
    # 使用鼠标动作链进行点击并悬浮
    action.click_and_hold(slider_go)
    # 滑动验证码
    action.move_by_offset(xoffset=258, yoffset=0).perform()
    time.sleep(1)


def login(username, password):
    browser.get('https://login.taobao.com/member/login.jhtml')
    input_username = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR, '#fm-login-id'))
    )
    input_password = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR, '#fm-login-password'))
    )
    submit = wait.until(
      EC.element_to_be_clickable((By.CSS_SELECTOR, '#login-form > div.fm-btn > button'))
    )
    input_username.send_keys(username)
    time.sleep(2)
    input_password.send_keys(password)
    time.sleep(2)
    submit.click()
    time.sleep(3)# 等待检验滑块

    # 判断有无滑块验证
    try:
      slider = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#nc_1__scale_text > span'))
      )
      if bool(slider):
            print('发现滑块验证码')
            time.sleep(2)
            do_slider()
            submit.click()
      else:
            print('未发现滑块')
            pass
    except:
      print('未发现滑块')
    finally:
      print('登录成功')




def main():
    login(username='', password='')


if __name__ == '__main__':
    main()
```

joffrey 发表于 2021-2-7 17:19

Traceback (most recent call last):
File "C:\Users\zp\Desktop\myPython\taobao\login.py", line 63, in login
    do_slider()
File "C:\Users\zp\Desktop\myPython\taobao\login.py", line 34, in do_slider
    action.move_by_offset(xoffset=258, yoffset=0).perform()
File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\common\action_chains.py", line 80, in perform
    self.w3c_actions.perform()
File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\common\actions\action_builder.py", line 76, in perform
    self.driver.execute(Command.W3C_ACTIONS, enc)
File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.JavascriptException: Message: javascript error: Failed to execute 'elementsFromPoint' on 'Document': The provided double value is non-finite.
(Session info: chrome=88.0.4324.150)

没懒用。并且手动滑过去仍然被检测到了,无法登录

苏晓宇c 发表于 2021-1-25 22:08

?淘宝吗,我做数据可视化刚写了淘宝的爬虫。

我直接做了扫码登陆,没写登陆的滑块验证,但是爬虫的时候 会出来滑块验证
用ActionChains和move_by_offset,
过不了那个验证,

我试了 把x坐标i直接放到for循环了 和 用模拟减速的方法

都不行,

楼主如果有什么好办法了,记得@我一下,感谢。{:1_893:}

Tomatoman 发表于 2021-1-25 21:28

学习咯,感谢分享

super谦 发表于 2021-1-26 08:32

苏晓宇c 发表于 2021-1-25 22:08
?淘宝吗,我做数据可视化刚写了淘宝的爬虫。

我直接做了扫码登陆,没写登陆的滑块验证,但是爬虫的时 ...

是不是说操作太频繁,叫你休息一下的

hyzhangyong 发表于 2021-1-26 09:19

苏晓宇c 发表于 2021-1-25 22:08
?淘宝吗,我做数据可视化刚写了淘宝的爬虫。

我直接做了扫码登陆,没写登陆的滑块验证,但是爬虫的时 ...

这种是没办法的,操作频繁了,硬要你隔15分钟。手动操作一样。只要给识别为恶意访问。

千年恨 发表于 2021-1-26 09:22

selenium的内核被检测了 chromedriver也一样 需要修改

苏晓宇c 发表于 2021-1-26 11:30

super谦 发表于 2021-1-26 08:32
是不是说操作太频繁,叫你休息一下的

不是,就是验证码拦截

苏晓宇c 发表于 2021-1-26 11:31

hyzhangyong 发表于 2021-1-26 09:19
这种是没办法的,操作频繁了,硬要你隔15分钟。手动操作一样。只要给识别为恶意访问。

我到没有硬隔15分钟,只是出一个滑块验证,用selenium过不去,只能手动滑块,过去了就可以正常浏览。

苏晓宇c 发表于 2021-1-26 11:33

千年恨 发表于 2021-1-26 09:22
selenium的内核被检测了 chromedriver也一样 需要修改

对的,楼主给那个代码,上来加一个JS劫持,其实过不了淘宝对selenium和Chromedrive的检测。

我现在的替代方案是用Firefox驱动,这个可以过滑块。

南岸 发表于 2021-1-28 08:49

苏晓宇c 发表于 2021-1-26 11:33
对的,楼主给那个代码,上来加一个JS劫持,其实过不了淘宝对selenium和Chromedrive的检测。

我现在的 ...

其实自己在chromedrive正常登陆下就不会有滑块和短信了
页: [1] 2
查看完整版本: Selenium模拟淘宝登陆的一次尝试