首先,一切使用自动化框架的项目,或者说代码,或者说爬虫都会碰到某些网站刚刚打开页面就被判定为:非人类行为。为啥??

----------因为很多网站有对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&reg= 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检测,实现淘宝登陆相关推荐

  1. python+selenium+phantomjs 模拟淘宝登陆

    一段时间前,微信群里有小伙伴在问如何模拟登陆淘宝.对于这样的需求我很乐意折腾,我也在网上看了一些大神写的,不用第三方组件,"纯模拟"实现的难度太大了,各种参数,可见淘宝安全机制且高 ...

  2. 如何解决selenium被检测,实现淘宝登陆

    爬虫都会碰到某些网站刚刚打开页面就被判定为:非人类行为 因为很多网站有对selenium的js监测机制.比如:navigator.webdriver,navigator.languages,navig ...

  3. 使用Selenium爬取淘宝商品(绕过登录页面)

    文章目录 1.准备工作 2.接口分析 3.页面分析 4.获取商品列表 5.解析商品列表 6.保存到MongoDB 7.遍历每页 8.异常处理(绕过登录反爬机制) 方法一:修改ChromeDriver. ...

  4. Python selenium模拟淘宝登陆

    通过selenium定位到各个元素,通过相关操作(如输入框的输入,按钮的点击等)来模拟人的真实操作流程 流程是通过绕个圈子,用微博账号登陆来绕过淘宝登陆,不过事先需要将微博账号与淘宝账号进行绑定 下面 ...

  5. selenium 淘宝登陆购买,基础实现

    主要实现基础的淘宝登陆搜索及购买. 利用selenium + chrome,当然,这个还有以下两个问题: 1. 不够稳定,还有些细节可以做 2. 没封装 先实现流程吧 from selenium im ...

  6. python模拟淘宝登陆_【Python】selenium模拟淘宝登录

    # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By f ...

  7. Python + selenium 爬取淘宝商品列表及商品评论 2021-08-26

    Python + selenium 爬取淘宝商品列表及商品评论[2021-08-26] 主要内容 登录淘宝 获取商品列表 获取评论信息 存入数据库 需要提醒 主要内容 通过python3.8+ sel ...

  8. 记录下mitmproxy做代理,实现淘宝登陆

    2019年1月1日我要上班很慌啊..这天气应该躺在被窝里美滋滋的睡觉.今天上班不知道干啥,闲来无事,记录下之前使用mitmproxy实现淘宝登陆.不多说,分割线-------------------- ...

  9. [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品

    在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...

最新文章

  1. Ollivander's Inventory(连接查询、单表双实例、子查询)
  2. oracle与jdbc连接数据库,JDBC与Oracle数据库连接
  3. 【caffe-matlab】使用matlab训练caffe及绘制loss
  4. selenium之HTMLTestRunner练习
  5. php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数
  6. mongodb数据库,批量插入性能测试记录
  7. maven-resources-plugin插件使用
  8. mysql负载均衡分区_分区和负载均衡让MySQL更大更好
  9. Android 系统(86)---mtk平台上如何开启f2fs
  10. python 消息框架_消息框架message
  11. 交换与路由第一章 网络技术基础
  12. time clock getrusage clock_gettime gettimeofday timespec_get 对比
  13. 廖雪峰python学习笔记之访问数据库
  14. android Google Advertising ID 如何重置
  15. U盘数据丢失后怎样恢复
  16. Python请求webserver服务用到的suds、suds-jurko、zeep库相关踩坑指南
  17. 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'...
  18. SEO优化技术之关键字
  19. appium自动化实例
  20. 调整oracle服务器时间,那些年Oracle数据库主机时间调整的风花雪月

热门文章

  1. 王齐老师 浅谈cache memory
  2. 北汽新能源驱动桥冷却水泵维修笔记
  3. 我的2015计划,目标
  4. 修改USRPx410的ip地址
  5. topik怎么读_学渣室友3个月拿下韩语TOPIK5级,到底发生了什么?!
  6. 动态调用DLL. LoadLibrary和GetProcAddress
  7. convert函数语法
  8. 国家测绘局:严禁擅自公布重要地理信息数据
  9. Friendfeed的MySQL key/value存储【转】
  10. 【uniapp】微信小程序发布后提醒用户更新版本