pyppeteer 绕过selenium检测,实现淘宝登陆
首先,一切使用自动化框架的项目,或者说代码,或者说爬虫都会碰到某些网站刚刚打开页面就被判定为:非人类行为。为啥??
----------因为很多网站有对selenium的js监测机制。比如:navigator.webdriver,navigator.languages,navigator.plugins.length......很多很多。
比如美团,大众,淘宝这些'无良'商家。。就有对window.navigator.webdriver的检测机制。正常情况下---->
window.navigator.webdriver的值为undefined。
而当我们使用selenium 的时候---->
window.navigator.webdriver的值为True。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
主要说下破解的两种办法。第一张使用mitmproxy用中间人的方式截取服务器发送来的js,修改js里面函数的参值方式发送给服务器。相当于在browser和server之间做一层中介的拦截。不过此方法要对js非常熟悉的人才好实施。
第二种方法依旧通过selenium,不过是在服务器在第一次发送js并在本地验证的时候,做好‘第一次’的伪装,从而实现‘第一次登陆’有效。。方法简单,适合小白。
我们用第二种方式来实现淘宝的登陆吧------------------>
pyppeteer 加 asyncio 绕过selenium检测,实现鼠标滑动后自动登陆(代码很简单。主要熟悉异步模块及pyppeteer模块。pyppeteer模块看不懂就去看puppeteer文档,pyppeteer只是在puppeteer之上稍微包装了下而已 )。
1.main_py 文件作为主要运行的py:
import asyncio
import time
from pyppeteer.launcher import launch
from alifunc import mouse_slide, input_time_random
from exe_js import js1, js3, js4, js5async def main(username, pwd, url):browser = await launch({'headless': False, 'args': ['--no-sandbox'], })page = await browser.newPage()await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299')await page.goto(url)await page.evaluate(js1)await page.evaluate(js3)await page.evaluate(js4)await page.evaluate(js5)await page.type('.J_UserName', username, {'delay': input_time_random() - 50})await page.type('#J_StandardPwd input', pwd, {'delay': input_time_random()})await page.screenshot({'path': './headless-test-result.png'})time.sleep(2)slider = await page.Jeval('#nocaptcha', 'node => node.style') # 是否有滑块if slider:print('出现滑块情况判定')await page.screenshot({'path': './headless-login-slide.png'})flag = await mouse_slide(page=page)if flag:await get_cookie(page)else:await page.keyboard.press('Enter')await page.waitFor(20)await page.waitForNavigation()try:global errorerror = await page.Jeval('.error', 'node => node.textContent')except Exception as e:error = Nonefinally:if error:print('确保账户安全重新入输入')# 程序退出。loop.close()else:print(page.url)await get_cookie(page)# 获取登录后cookie
async def get_cookie(page):res = await page.content()cookies_list = await page.cookies()cookies = ''for cookie in cookies_list:str_cookie = '{0}={1};'str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value'))cookies += str_cookieprint(cookies)return cookiesif __name__ == '__main__':username = 'xxxxxxxxxxxxx'pwd = 'xxxxxxx'url = 'https://login.taobao.com/member/login.jhtml?style=mini&css_style=b2b&from=b2b&full_redirect=true&redirect_url=https://login.1688.com/member/jump.htm?target=https://login.1688.com/member/marketSigninJump.htm?Done=http://login.1688.com/member/taobaoSellerLoginDispatch.htm®= http://member.1688.com/member/join/enterprise_join.htm?lead=http://login.1688.com/member/taobaoSellerLoginDispatch.htm&leadUrl=http://login.1688.com/member/'loop = asyncio.get_event_loop()loop.run_until_complete(main(username, pwd, url))
2 exe_js 需要伪装js数据的py文件,alifunc出现滑块情况下进行鼠标移动的py文件。
# alifunc.py
from retrying import retry
import time, asyncio, randomdef retry_if_result_none(result):return result is None@retry(retry_on_result=retry_if_result_none,)
async def mouse_slide(page=None):await asyncio.sleep(3)try:await page.hover('#nc_1_n1z')await page.mouse.down()await page.mouse.move(2000, 0, {'delay': random.randint(1000, 2000)})await page.mouse.up()except Exception as e:print(e, ' :slide login False')return Noneelse:await asyncio.sleep(3)slider_again = await page.Jeval('.nc-lang-cnt', 'node => node.textContent')if slider_again != '验证通过':return Noneelse:await page.screenshot({'path': './headless-slide-result.png'})print('验证通过')return 1def input_time_random():return random.randint(100, 151)
# exe_js.pyjs1 = '''() =>{Object.defineProperties(navigator,{webdriver:{get: () => false}})}'''js2 = '''() => {alert (window.navigator.webdriver)}'''js3 = '''() => {window.navigator.chrome = {runtime: {},// etc.};}'''js4 = '''() =>{Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});}'''js5 = '''() =>{Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5,6],});}'''
---------------------------------------------------------------------
运行结果
代码下载地址:
https://github.com/chenchong6/taobao-login
puppeteer文档地址:
https://zhaoqize.github.io/puppeteer-api-zh_CN/#/?id=%E6%A6%82%E8%BF%B0
async/await 速看:
https://python.freelycode.com/contribution/detail/57
pyppeteer地址:
https://github.com/miyakogi/pyppeteer
pyppeteer 绕过selenium检测,实现淘宝登陆相关推荐
- python+selenium+phantomjs 模拟淘宝登陆
一段时间前,微信群里有小伙伴在问如何模拟登陆淘宝.对于这样的需求我很乐意折腾,我也在网上看了一些大神写的,不用第三方组件,"纯模拟"实现的难度太大了,各种参数,可见淘宝安全机制且高 ...
- 如何解决selenium被检测,实现淘宝登陆
爬虫都会碰到某些网站刚刚打开页面就被判定为:非人类行为 因为很多网站有对selenium的js监测机制.比如:navigator.webdriver,navigator.languages,navig ...
- 使用Selenium爬取淘宝商品(绕过登录页面)
文章目录 1.准备工作 2.接口分析 3.页面分析 4.获取商品列表 5.解析商品列表 6.保存到MongoDB 7.遍历每页 8.异常处理(绕过登录反爬机制) 方法一:修改ChromeDriver. ...
- Python selenium模拟淘宝登陆
通过selenium定位到各个元素,通过相关操作(如输入框的输入,按钮的点击等)来模拟人的真实操作流程 流程是通过绕个圈子,用微博账号登陆来绕过淘宝登陆,不过事先需要将微博账号与淘宝账号进行绑定 下面 ...
- selenium 淘宝登陆购买,基础实现
主要实现基础的淘宝登陆搜索及购买. 利用selenium + chrome,当然,这个还有以下两个问题: 1. 不够稳定,还有些细节可以做 2. 没封装 先实现流程吧 from selenium im ...
- python模拟淘宝登陆_【Python】selenium模拟淘宝登录
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By f ...
- Python + selenium 爬取淘宝商品列表及商品评论 2021-08-26
Python + selenium 爬取淘宝商品列表及商品评论[2021-08-26] 主要内容 登录淘宝 获取商品列表 获取评论信息 存入数据库 需要提醒 主要内容 通过python3.8+ sel ...
- 记录下mitmproxy做代理,实现淘宝登陆
2019年1月1日我要上班很慌啊..这天气应该躺在被窝里美滋滋的睡觉.今天上班不知道干啥,闲来无事,记录下之前使用mitmproxy实现淘宝登陆.不多说,分割线-------------------- ...
- [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品
在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...
最新文章
- Ollivander's Inventory(连接查询、单表双实例、子查询)
- oracle与jdbc连接数据库,JDBC与Oracle数据库连接
- 【caffe-matlab】使用matlab训练caffe及绘制loss
- selenium之HTMLTestRunner练习
- php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数
- mongodb数据库,批量插入性能测试记录
- maven-resources-plugin插件使用
- mysql负载均衡分区_分区和负载均衡让MySQL更大更好
- Android 系统(86)---mtk平台上如何开启f2fs
- python 消息框架_消息框架message
- 交换与路由第一章 网络技术基础
- time clock getrusage clock_gettime gettimeofday timespec_get 对比
- 廖雪峰python学习笔记之访问数据库
- android Google Advertising ID 如何重置
- U盘数据丢失后怎样恢复
- Python请求webserver服务用到的suds、suds-jurko、zeep库相关踩坑指南
- 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'...
- SEO优化技术之关键字
- appium自动化实例
- 调整oracle服务器时间,那些年Oracle数据库主机时间调整的风花雪月