python爬虫 模拟淘宝使用账号密码登陆 用mitmdump防止检测出使用chromedriver

使用淘宝账号密码模拟登陆淘宝

准备代理

  • 为什么需要代理呢?因为淘宝有检测是否是chromedriver来访问的代码
通过浏览器分析js代码,可以找得到这个文件存在校验逻辑
https://g.alicdn.com/secdev/sufei_data/3.9.9/index.js
function r() {
            return "$cdc_asdjflasutopfhvcZLmcfl_"in u || f.webdriver
        }
  • 1.需要修改chromedriver的内容
可以直接编辑chromedriver  
vim chromedriver
直接将cdc_asdjflasutopfhvcZLmcfl_变量替换
:1,$s/cdc_asdjflasutopfhvcZLmcfl_/cat_asdjflasutopfhvcZLmcfl_/g 
  • 2.需要修改 navigator.webdriver 让其为false,因为在正常的浏览器控制台这个值是false的,在chromedriver打开这个值为true

  • 我这里也使用的是mitmproxy ,因为 mitmproxy支持python编程,很方便通过代码进行控制

  • 使用流程

    • pip install mitmproxy
    • 编写脚本
    from mitmproxy import http
    '''
    需要安装 mitmproxy 代理
    # mitmdump -s proxy.py -p 9000 -q
    
    需要在浏览器安装它的证书才行  
    证书目录 
    cd 
    cd .mitmproxy
    将这个安装到浏览器  mitmproxy-ca-cert.cer   
    '''
    def response(flow: http.HTTPFlow):
    	# sufei_data 这个里面有检测 
        if flow.request.url.find('sufei_data'):	
            text = flow.response.text
            new_text = text.replace(
                'return "$cdc_asdjflasutopfhvcZLmcfl_"in u || f.webdriver', 'return false')
    
            flow.response.text = new_text
            print('注入成功')
    
    • 浏览器安装mitmdump证书
      • 证书位置放在 /Users/you/.mitmproxy 目录下
      • 具体安装方法参考 About Certificates
    • 开启代理 mitmdump -s proxy.py -p 9000 -q -q不打印mitmdump的日志

登陆的代码

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ChromeOptions
from selenium.webdriver import ActionChains

class TaobaoSpider():

    driver = None
    login_url = 'https://login.taobao.com/member/login.jhtml'
    index_url = 'https://taobao.com/'

    def __init__(self,username,password):
        options = ChromeOptions()
        # 不加载图片,加快访问速度
        # options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
        # 设置为开发者模式,避免被识别
        options.add_experimental_option('excludeSwitches',['enable-automation'])
        # 使用代理
        options.add_argument('--proxy-server=http://127.0.0.1:9000')
        options.add_argument('disable-infobars')
        self.driver = webdriver.Chrome(executable_path='../chromedriver',options=options)
        # 过 window.navigator.webdriver = true
     	self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                    Object.defineProperty(navigator, 'webdriver', {
                    get: () => undefined
                    })
                """
        })
        self.username = username
        self.password = password

    

    def run(self):
        self._start_request()

    def _start_request(self):
        self.driver.get(url=self.login_url)
        time.sleep(1)
        self.driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys(self.username)
        time.sleep(1)
        self.driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys(self.password)
        time.sleep(1)

        # 是否出现滑动验证
        if self._lock_exist():
            self._unlock()

        # 点击登陆
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()
        
        # 等待登陆成功
        WebDriverWait(self.driver, 600).until(EC.presence_of_element_located((By.XPATH, '//*[@id="mtb-nickname"]')))
        # 登陆成功
        self.driver.get(url=self.index_url)


    def _lock_exist(self):
        '''判断是否存在滑动验证'''
        try:
            self.driver.find_element_by_xpath('//*[@id="nocaptcha-password"][@style="display: block;"]')
            return True
        except Exception as err:
            return False
        

    def _unlock(self):
        bar_element = self.driver.find_element_by_id('nc_1_n1z')
        ActionChains(self.driver).drag_and_drop_by_offset(bar_element, 300, 0).perform()
        time.sleep(1.5)
        # 出现刷新按钮
        try:
            self.driver.find_element_by_xpath('//*[@id="nocaptcha-password"]/div/span/a').click()
            self._unlock()
        except Exception as err:
            print(err)
            raise Exception('滑动验证失败,被监测到了')


    def _parse(self):
        pass


if __name__ == "__main__":
    username = input("请输入你的淘宝用户名:")  
    password = input("请输入密码:")

    spider = Taobao(username, password)
    spider.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值