liufu123 发表于 2022-11-15 16:22

Python——使用自动化模块进行滑动验证,ichrome持续更新的一个包。

本帖最后由 liufu123 于 2022-11-15 16:27 编辑

# 网上介绍selenium的文章已经很多了, 这篇文章是一个持续更新的包,暂时用的人还不多—ichrome。

```python
pip install ichrome
```

### 一、需求:解决阿里滑动验证问题。
![在这里插入图片描述](https://img-blog.csdnimg.cn/fb726e5082e64b95a0754e5c1033eb5a.png)
###### 使用selenum访问时候配置liunx系统特别麻烦,注入JS也是无法通过验证。
### 二、话不多说上代码,异步启动:

```python
asyncio.run(get_detail_anj())
```

### 三、pyautogui——进行滑动操作(单独写出来了,需要多次调用):
```python
pip install pyautogui
```

```python
# 因为需要代{过}{滤}理,但是不知道怎么加,就只能这样加上去了。teb是启动的浏览器,循环最多十次跳出。
async def hdyz(tab):
    n = 0
    while True:
      title = await tab.title
      if title == '':
            pyautogui.moveTo(860, 230)
            pyautogui.click()
            pyautogui.typewrite('账号')
            time.sleep(1)
            pyautogui.press('tab')
            pyautogui.typewrite('密码')
            pyautogui.press('Enter')
            time.sleep(5)
      elif "滑动验证页面" in title:
            pyautogui.press('F5')
            pyautogui.PAUSE = 1# 调用在执行动作后暂停的秒数,只能在执行一些pyautogui动作后才能使用,建议用time.sleep
            pyautogui.FAILSAFE = False
            pyautogui.moveTo(880, 430, duration=0.5)# 定位元素 可以将x,y写入,duration 是移动时间
            pyautogui.dragTo(random.randint(1190, 1220), random.randint(420, 440), duration=0.5, button='left')

      elif "滑动验证页面" not in title:
            time.sleep(10)
            html = await tab.get_html(timeout=5)        #给出html
            break
      elif '无法访问' in title or '无法连接':
            break
      n += 1
      if n == 10:
            break
    return html
```

### 四、启动浏览器和输出部分:

```python
async def get_detail_anj():

        headers = {
          "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/8"
                          "5.0.4183.102 Safari/537.36",
        }
        n = 1
        while True:
      try:
                        url = 'baidu.com'
                        proxyurl = f"{'127.0.0.1':8000}"         #代{过}{滤}理
                        #headless为是否显示浏览器
                  async with AsyncChromeDaemon(headless=False, user_agent=headers, proxy=proxyurl) as cd:       
                     async with cd.connect_tab(index=0) as tab:
                           for page in range(n, 1000):
                               url = url+page         #页数
                               await tab.goto(requrl, timeout=5)                 #浏览器访问网页
                                           html = await hdyz(tab)                #调用滑动取出html
                                           r = etree.HTML(html)
                                           cookies = await tab.get_cookies()                 #还可以取出全部cookies
                                           if not in html:                        #设置个xpath页数位了跳出
                                             break
               except:
            # print('访问错误重新访问', url)
            n = page
               
```

### 五、整合下代码:
```python
import random
import asyncio
import re
import time
import pyautogui
import redis
import requests
from ichrome import AsyncChromeDaemon
from lxml import etree

async def hdyz(tab):
    n = 0
    while True:
      title = await tab.title
      if title == '':
            pyautogui.moveTo(860, 230)
            pyautogui.click()
            pyautogui.typewrite('账号')
            time.sleep(1)
            pyautogui.press('tab')
            pyautogui.typewrite('密码')
            pyautogui.press('Enter')
            time.sleep(5)
      elif "滑动验证页面" in title:
            pyautogui.press('F5')
            pyautogui.PAUSE = 1# 调用在执行动作后暂停的秒数,只能在执行一些pyautogui动作后才能使用,建议用time.sleep
            pyautogui.FAILSAFE = False
            pyautogui.moveTo(880, 430, duration=0.5)# 定位元素 可以将x,y写入,duration 是移动时间
            pyautogui.dragTo(random.randint(1190, 1220), random.randint(420, 440), duration=0.5, button='left')

      elif "滑动验证页面" not in title:
            time.sleep(10)
            html = await tab.get_html(timeout=5)        #给出html
            break
      elif '无法访问' in title or '无法连接':
            break
      n += 1
      if n == 10:
            break
    return html
   
async def get_detail_anj():

        headers = {
          "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/8"
                          "5.0.4183.102 Safari/537.36",
        }
        n = 1
        # ip 或者其他出问题可以重新访问这一页
        while True:
      try:
                        url = 'baidu.com'
                        proxyurl = f"{'127.0.0.1':8000}"         #代{过}{滤}理
                        #headless为是否显示浏览器
                  async with AsyncChromeDaemon(headless=False, user_agent=headers, proxy=proxyurl) as cd:       
                     async with cd.connect_tab(index=0) as tab:
                           for page in range(n, 1000):
                               url = url+page         #页数
                               await tab.goto(requrl, timeout=5)                 #浏览器访问网页
                                           html = await hdyz(tab)                #调用滑动取出html
                                           r = etree.HTML(html)
                                           pg_list = r.xpath("//span[@class='wel']/text()")
                                           cookies = await tab.get_cookies()                 #还可以取出全部cookies
                                           if page == int(pg_list[-1]):                        #设置个xpath页数位了跳出
                                             break
               except:
            # print('访问错误重新访问', url)
            n = page
if __name__ == "__main__":
    asyncio.run(get_detail_anj())
               
```

==代码需要简答修改,无法直接使用。==

坚持梦想 发表于 2022-11-16 08:23

本帖最后由 坚持梦想 于 2022-11-16 08:24 编辑

node下nut-tree/nut-js 有同样的功效 可以过阿里滑块亲测有效

外酥内嫩 发表于 2022-11-15 17:54

一个新的自动化工具?

beyond0518 发表于 2022-11-15 18:38

感觉是的,ichrome是继承的selenium么

xuexiba 发表于 2022-11-15 21:24

虽然需要简答修改,但是思路清晰,学习了,感谢。

liufu123 发表于 2022-11-16 13:38

sp5087283 发表于 2022-11-15 18:33
这个ichrome是继承的selenium么

写法也不太一样,一直在更新的。文档也就英文的,也没几个人用。

liufu123 发表于 2022-11-16 13:39

外酥内嫩 发表于 2022-11-15 17:54
一个新的自动化工具?

应该是的,写法也不一样的。用的人也不多

liufu123 发表于 2022-11-16 13:41

xuexiba 发表于 2022-11-15 21:24
虽然需要简答修改,但是思路清晰,学习了,感谢。

:handshake感谢,爬取是其他的网站,因为是继承他人代码,也不好改,就把主要部分拿出来了。

liufu123 发表于 2022-11-16 13:43

坚持梦想 发表于 2022-11-16 08:23
node下nut-tree/nut-js 有同样的功效 可以过阿里滑块亲测有效

node也弄了下,我用这个puppeteer写了个,但是mac还好,linux基本过不了

ywsl 发表于 2022-11-21 02:49

学会了学会了,有空试试:lol
页: [1]
查看完整版本: Python——使用自动化模块进行滑动验证,ichrome持续更新的一个包。