使用pyppeteer 绕过selenium检测,实现淘宝登陆(¥53)

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

----------因为很多网站有对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:


  
  
  1. import asyncio
  2. import time
  3. from pyppeteer.launcher import launch
  4. from alifunc import mouse_slide, input_time_random
  5. from exe_js import js1, js3, js4, js5
  6. async def main(username, pwd, url):
  7. browser = await launch({ 'headless': False, 'args': [ '--no-sandbox'], })
  8. page = await browser.newPage()
  9. await page.setUserAgent(
  10. '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')
  11. await page.goto(url)
  12. await page.evaluate(js1)
  13. await page.evaluate(js3)
  14. await page.evaluate(js4)
  15. await page.evaluate(js5)
  16. await page.type( '.J_UserName', username, { 'delay': input_time_random() - 50})
  17. await page.type( '#J_StandardPwd input', pwd, { 'delay': input_time_random()})
  18. await page.screenshot({ 'path': './headless-test-result.png'})
  19. time.sleep( 2)
  20. slider = await page.Jeval( '#nocaptcha', 'node => node.style') # 是否有滑块
  21. if slider:
  22. print( '出现滑块情况判定')
  23. await page.screenshot({ 'path': './headless-login-slide.png'})
  24. flag = await mouse_slide(page=page)
  25. if flag:
  26. await get_cookie(page)
  27. else:
  28. await page.keyboard.press( 'Enter')
  29. await page.waitFor( 20)
  30. await page.waitForNavigation()
  31. try:
  32. global error
  33. error = await page.Jeval( '.error', 'node => node.textContent')
  34. except Exception as e:
  35. error = None
  36. finally:
  37. if error:
  38. print( '确保账户安全重新入输入')
  39. # 程序退出。
  40. loop.close()
  41. else:
  42. print(page.url)
  43. await get_cookie(page)
  44. # 获取登录后cookie
  45. async def get_cookie(page):
  46. res = await page.content()
  47. cookies_list = await page.cookies()
  48. cookies = ''
  49. for cookie in cookies_list:
  50. str_cookie = '{0}={1};'
  51. str_cookie = str_cookie.format(cookie.get( 'name'), cookie.get( 'value'))
  52. cookies += str_cookie
  53. print(cookies)
  54. return cookies
  55. if __name__ == '__main__':
  56. username = 'xxxxxxxxxxxxx'
  57. pwd = 'xxxxxxx'
  58. 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/'
  59. loop = asyncio.get_event_loop()
  60. loop.run_until_complete(main(username, pwd, url))

2 exe_js 需要伪装js数据的py文件,alifunc出现滑块情况下进行鼠标移动的py文件。


  
  
  1. # alifunc.py
  2. from retrying import retry
  3. import time, asyncio, random
  4. def retry_if_result_none(result):
  5. return result is None
  6. @retry(retry_on_result=retry_if_result_none,)
  7. async def mouse_slide(page=None):
  8. await asyncio.sleep( 3)
  9. try:
  10. await page.hover( '#nc_1_n1z')
  11. await page.mouse.down()
  12. await page.mouse.move( 2000, 0, { 'delay': random.randint( 1000, 2000)})
  13. await page.mouse.up()
  14. except Exception as e:
  15. print(e, ' :slide login False')
  16. return None
  17. else:
  18. await asyncio.sleep( 3)
  19. slider_again = await page.Jeval( '.nc-lang-cnt', 'node => node.textContent')
  20. if slider_again != '验证通过':
  21. return None
  22. else:
  23. await page.screenshot({ 'path': './headless-slide-result.png'})
  24. print( '验证通过')
  25. return 1
  26. def input_time_random():
  27. return random.randint( 100, 151)

  
  
  1. # exe_js.py
  2. js1 = '''() =>{
  3. Object.defineProperties(navigator,{
  4. webdriver:{
  5. get: () => false
  6. }
  7. })
  8. }'''
  9. js2 = '''() => {
  10. alert (
  11. window.navigator.webdriver
  12. )
  13. }'''
  14. js3 = '''() => {
  15. window.navigator.chrome = {
  16. runtime: {},
  17. // etc.
  18. };
  19. }'''
  20. js4 = '''() =>{
  21. Object.defineProperty(navigator, 'languages', {
  22. get: () => ['en-US', 'en']
  23. });
  24. }'''
  25. js5 = '''() =>{
  26. Object.defineProperty(navigator, 'plugins', {
  27. get: () => [1, 2, 3, 4, 5,6],
  28. });
  29. }'''

---------------------------------------------------------------------

运行结果

代码下载地址:

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

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

猜你喜欢

转载自blog.csdn.net/weixin_43721133/article/details/89083280