爬虫都会碰到某些网站刚刚打开页面就被判定为:非人类行为

因为很多网站有对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之上稍微包装了下而已 )。

首先是main.py

import asyncio
import time,random
from pyppeteer.launcher import launch # 控制模拟浏览器用
from retrying import retry #设置重试次数用的async def main(username, pwd, url):# 定义main协程函数,#以下使用await 可以针对耗时的操作进行挂起browser = await launch({'headless': False, 'args': ['--no-sandbox'], }) # 启动pyppeteer 属于内存中实现交互的模拟器page = await browser.newPage()  # 启动个新的浏览器页面await page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')await page.goto(url) # 访问登录页面# 替换淘宝在检测浏览时采集的一些参数。# 就是在浏览器运行的时候,始终让window.navigator.webdriver=false# navigator是windiw对象的一个属性,同时修改plugins,languages,navigator 且让await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''') #以下为插入中间js,将淘宝会为了检测浏览器而调用的js修改其结果。await page.evaluate('''() =>{ window.navigator.chrome = { runtime: {},  }; }''')await page.evaluate('''() =>{ Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] }); }''')await page.evaluate('''() =>{ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''')# 使用type选定页面元素,并修改其数值,用于输入账号密码,修改的速度仿人类操作,因为有个输入速度的检测机制# 因为 pyppeteer 框架需要转换为js操作,而js和python的类型定义不同,所以写法与参数要用字典,类型导入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,page = await mouse_slide(page=page) #js拉动滑块过去。if flag:await page.keyboard.press('Enter') # 确保内容输入完毕,少数页面会自动完成按钮点击print("print enter",flag)await page.evaluate('''document.getElementById("J_SubmitStatic").click()''') # 如果无法通过回车键完成点击,就调用js模拟点击登录按钮。time.sleep(2)#cookies_list = await page.cookies()#print(cookies_list)await get_cookie(page) # 导出cookie 完成登陆后就可以拿着cookie玩各种各样的事情了。else:print("")await page.keyboard.press('Enter')print("print enter")await page.evaluate('''document.getElementById("J_SubmitStatic").click()''')await page.waitFor(20)await page.waitForNavigation()try:global error # 检测是否是账号密码错误print("error_1:",error)error = await page.Jeval('.error', 'node => node.textContent')print("error_2:",error)except Exception as e:error = Nonefinally:if error:print('确保账户安全重新入输入')# 程序退出。loop.close()else:print(page.url)await get_cookie(page)#time.sleep(100)
# 获取登录后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 cookiesdef 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(2)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, ':验证失败')return None,pageelse:await asyncio.sleep(2)# 判断是否通过slider_again = await page.Jeval('.nc-lang-cnt', 'node => node.textContent')if slider_again != '验证通过':return None,pageelse:#await page.screenshot({'path': './headless-slide-result.png'}) # 截图测试print('验证通过')return 1,pagedef input_time_random():return random.randint(100, 151)if __name__ == '__main__':username = 'xxxxxxxxx' # 淘宝用户名pwd = 'xxxxxxxxxxx' #密码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))  #将协程注册到事件循环,并启动事件循环

运行结果:

如何解决selenium被检测,实现淘宝登陆相关推荐

  1. Python3+Selenium 实现自动登录淘宝+清空购物车

    此博客的目的为分享自己用Python3和Selenium实现的自动登录淘宝和清空购物车的程序逻辑.经测试,此程序有时可以"秒杀"一些供给相对充足的限量商品,但无法秒杀疫情期间的任何 ...

  2. python + selenium多进程爬取淘宝搜索页数据

    python + selenium多进程爬取淘宝搜索页数据 1. 功能描述 按照给定的关键词,在淘宝搜索对应的产品,然后爬取搜索结果中产品的信息,包括:标题,价格,销量,产地等信息,存入mongodb ...

  3. 【爬虫】selenium+webdrive抓取淘宝商品评价

    [爬虫]selenium+webdrive抓取淘宝商品评价 爬虫小白入门 (声明:本人只是处于突如其来的兴趣学习一点点,水平实在不高,但在这个过程中也或多或少地解决了一些问题,所以对同为小白的朋友们或 ...

  4. 使用selenium自动秒抢淘宝商品(附详细入门指南)

    使用selenium自动秒抢淘宝商品(附详细入门指南) 转:https://www.liangzl.com/get-article-detail-207822.html Python大数据分析 记录  ...

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

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

  6. 用selenium模拟浏览器登录淘宝识别滑动验证码

    用selenium模拟浏览器登录淘宝,使用账号密码的方式登录淘宝,但是在登录的时候遇到需要滑动验证,使用selenium模拟点击滑块,滑动验证码完成登录. 本文的代码现测可用.做个记录,方便以后查看. ...

  7. Python selenium模拟淘宝登陆

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

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

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

  9. 淘宝爬虫之强行登录如何解决Selenium被检测到的问题?

    近遇上一些反Selenium爬虫的情况,爬虫都会碰到某些网站刚刚打开页面就被判定为:非人类行为. 因为不少大网站有对selenium的js监测机制.比如navigator.webdriver,navi ...

最新文章

  1. python类中方法的执行顺序-Python实例化class的执行顺序实例方法
  2. guid主分区表损坏怎么办_轻钢龙骨隔墙怎么办?轻钢龙骨隔墙的做法
  3. 【强烈推荐】程序猿们,九度Online Judge开始举办月赛啦!!会编程才是王道!!!!!
  4. 发布在即!.NET Core 1.0 RC2已准备就绪
  5. 进程锁 读写文件的小例子 C++代码
  6. 甲流病人初筛(信息学奥赛一本通-T1399)
  7. #iOS问题记录# 关于UITableViewcel的分割线去掉问题
  8. ubuntu安装gcc和g++
  9. 工商管理专业知识与实务(中级)【4】
  10. 蒙牛、小米、比亚迪,明星企业为何扎堆换LOGO?
  11. 如何用u盘装xp系统教程
  12. panabit策略路由
  13. zabbix使用详解
  14. 绕过知乎网页版禁止转载限制进行复制
  15. 文件上传upload-labs靶场通关指南
  16. 2014年中南大学复试-安全路径
  17. input的disabled属性
  18. 荣耀note10无缘鸿蒙,赵明确认荣耀NOTE10 真机参数疑似全曝光!
  19. (一)数据后端之逻辑综合
  20. 什么是云手机?有免费的云手机吗?

热门文章

  1. Ubuntu 下安装使用飞鸽传书
  2. 计算机的启动及关闭方法,如何关闭开机启动项
  3. 淘宝发布 18 年 18 件“时代宝贝”:胶卷、万能充、MP3 等
  4. 微信小程序上传阿里云视频文件流程及代码
  5. org.gradle.api.resources.ResourceException: Could not get resource ‘https://xxx.xxx/xxx.pom
  6. linux ftp主动和被动模式切换命令,Linux iptables配置FTP的主动和被动模式
  7. 海绵宝宝 聪明珊瑚脑 派大星变聪明 在B站第49集
  8. 在微型计算机中硬件和软件的关系是_,计算机的硬件系统和软件系统的关系是什么?...
  9. R语言学习二——工具的使用
  10. WPF网络图片保存编辑_se7en3_新浪博客