15行代码轻松绕过淘宝反爬虫机制

  • Post author:
  • Post category:其他

最近学习网络爬虫关注了不少技术大牛,前两天看见崔庆才老师公众号发了一个绕过淘宝验证的新方法,今天我就按照那篇文章进行实践
之前大牛们写的文章进行淘宝抓取都是使用selenium
但我自己使用的时候经常出错封IP,对于淘宝这类文章也很苦恼

而崔大介绍一款新工具——pyppeteer
这也是一款简单的自动化测试工具,使用的是Chromium
安装也十分简单
只需在Powershell里

pip3 install pyppeteer

这里简单介绍几个方法,这几个方法足以让我们通过淘宝验证
launcher.launch 这是实现浏览器的打开,里面有许多参数
ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。

headless (bool): 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。

executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium

slowMo (int|float): 通过传入指定的时间,可以减缓 Pyppeteer 的一些模拟操作。

args (List[str]): 在执行过程中可以传入的额外参数。

ignoreDefaultArgs (bool): 不使用 Pyppeteer 的默认参数,如果使用了这个参数,那么最好通过 args 参数来设定一些参数,否则可能会出现一些意想不到的问题。这个参数相对比较危险,慎用。

handleSIGINT (bool): 是否响应 SIGINT 信号,也就是可以使用 Ctrl + C 来终止浏览器程序,默认是 True。

handleSIGTERM (bool): 是否响应 SIGTERM 信号,一般是 kill 命令,默认是 True。

handleSIGHUP (bool): 是否响应 SIGHUP 信号,即挂起信号,比如终端退出操作,默认是 True。

dumpio (bool): 是否将 Pyppeteer 的输出内容传给 process.stdout 和 process.stderr 对象,默认是 False。

userDataDir (str): 即用户数据文件夹,即可以保留一些个性化配置和操作记录。

env (dict): 环境变量,可以通过字典形式传入。

devtools (bool): 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。

logLevel (int|str): 日志级别,默认和 root logger 对象的级别相同。

autoClose (bool): 当一些命令执行完之后,是否自动关闭浏览器,默认是 True。

loop (asyncio.AbstractEventLoop): 时间循环对象。


一般来说我们只是会设置headless,devtools,和传入一些必要的args

newPage()方法,相当于我们在浏览器里点开了新建选项卡
goto(),里面传入我们想要的url,即可前往指定的网页

ok我们这篇就介绍这几个,接下来我们看看淘宝的反爬虫机制

淘宝主要是靠window.navigator.webdriver进行检测
相信大家对webdriver都不陌生
我们使用selenium进行爬虫的时候就是chromedriver驱动chrome浏览器实行一系列操作,而这个值通常被设置为True,从而导致很容易被检测出来

所以我们可以通过JS代码进行修改,将该值设置为False

好了基本的内容介绍到这里,我们接下来直接看代码吧

import asyncio
from pyppeteer import launch

width, height = 1366, 768

async def main():
    browser = await launch(headless=False, args=[f'--window-size={width},{height}','--disable-infobars'])
    page = await browser.newPage()
    await page.setViewport({'width':width, 'height':height})
    await page.goto('https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/')
    await page.evaluate(
        '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

我们这里import asyncio 这是一个异步机制,因为pyppeteer是基于异步的,需要await这些进行修饰(具体异步机制的使用笔者也不是很了解

首先我们把浏览器的长宽赋给width height这两个变量
利用launch方法传入args设定窗口大小,而后面那个disable-infobars则是去除那个浏览器的“chrome当前正在受自动化测试软件控制”这个选项卡

然后我们调用setViewport进行窗口设置
goto方法进入淘宝登陆页面
我这里是建议直接goto到登陆页面,因为自己实践的时候我只是goto到了www.taobao.com,输入用户名和密码后拖动滑块会报错,但是直接goto到登陆页面就不会

然后evaluate是执行js代码,这里就是之前说的设置webdrive=false,来避开淘宝的检测

运行以后,输入用户名和密码,拖动滑块,我们就能成功进入到淘宝页面了!

最后这篇博文是受崔大的启发,建议大家关注一下他的公众号:进击的Coder
学习更多爬虫知识
共勉!


版权声明:本文为weixin_44106928原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。