js逆向爬虫实战之快手第三方平台之获取登录cookies!

爬虫js逆向系列
我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现。我觉得做技术分享,不仅仅是要记录问题,解决办法,更重要的是要提供解决问题的思路。怎么突破的,遇到这个问题怎么思考,尝试的方法有哪些。这样就可以有的放矢。希望对大家有用

爬虫认知
在程序猿所有的方向中,爬虫是离money最近的一个方向,你的明白?而且爬虫可发展的方向很多,前可走大数据,人工智能,后可转后端,还有就是安全领域。而且爬虫做得好,要求的技术栈还是比较全面的。如果你对爬虫有兴趣,欢迎加V:13809090874,一起沟通交流

免责申明:
此内容仅供学习交流使用,不用于商业用途,如果涉及侵权,联系作者删除

上面一篇我们说完了请求参数的破解,用我们模拟的请求链接+固定的cookies就可以通过代码的形式访问接口了。但有一个问题就是cookies是有失效期的,过一段时间,cookies就不能用了,我们必须得去破解登录的问题,然后建立自己的cookies池,才能真正实现自动化抓取。

1. 先人工登录,观察一下需要什么

1.微信扫码登录

 

2. 账号密码登录


我们可以看到这里有三种登录方式:1.微信扫码登录,2.密码登录,3.短信登录。
这其中难度系数,估计大家也都清楚,微信扫码登录和短信登录是很麻烦的,需要一些第三方服务,这个以后再讲。这个平台,可以用密码登录,最好不过了。


我们点击登录后需要拖动滑块。这个滑块,大家在看js的时候,如果细心一点,可以看到这个网站是调用阿里的滑块的服务的。
以下我给出的也是阿里滑块的通用解决方案。

阿里滑块解决–selenium屏蔽webdriver

我们通过selenium去调用chrome的webdriver,然后模拟拖动滑块,是拖不过去的,因为阿里会对你是不是用了webdriver进行检测的。
废话不多说,上代码:

    def init_chrome_options(self,):

        chrome_options = webdriver.ChromeOptions()
        # 设置浏览器初始 位置x,y & 宽高x,y
        chrome_options.add_argument(f'--window-position={217},{172}')
        chrome_options.add_argument(f'--window-size={1200},{1000}')
        # 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
        # window.navigator.webdriver还是返回True,当返回undefined时应该才可行。
        chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
        # 关闭开发者模式
        chrome_options.add_experimental_option("useAutomationExtension", False)
        # 禁止图片加载
        # prefs = {"profile.managed_default_content_settings.images": 2}
        # chrome_options.add_experimental_option("prefs", prefs)
        # 设置中文
        chrome_options.add_argument('lang=zh_CN.UTF-8')
        # 更换头部
        chrome_options.add_argument(
            'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"')
        path = './../chromedriver'
        driver = webdriver.Chrome(executable_path=path, options=chrome_options)
        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
        })
        return driver

这是我常用的selenium配置,拿走不谢。
加上这个配置,然后通过selenium去拖动滑块就可以。这个滑块直接滑到最右边就可以。没有路径,速度检测的。

    def login(self):
        c_list = []

        while 1:
            driver = self.init_chrome_options()
            try:
                url = 'https://xk.newrank.cn/?backUrl=https%3A%2F%2Fxk.newrank.cn%2Fdata%2F'
                driver.get(url)
                time.sleep(1)
                #获取登录元素,并输入账号密码
                driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[1]').click()
                driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div[2]/div[1]/input') \
                    .send_keys('xxxxx')
                driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div[2]/div[2]/span/input') \
                    .send_keys('xxxxx')
                time.sleep(1)
                #点击登录按钮
                driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div[2]/div[4]/button').click()
                time.sleep(2)
                #获取滑块按钮
                slider = driver.find_element_by_id('nc_1_n1z')
                #拖动滑块
                action_chains = ActionChains(driver)
                action_chains.click_and_hold(slider).perform()
                action_chains.move_by_offset(xoffset=random.randint(380,450), yoffset=0).perform()
                # action_chains.release(slider).perform()
                time.sleep(3)
                alert = EC.alert_is_present()(driver)
                if alert:
                    print('出现弹窗')
                    alert.accept()
                try:
                    WebDriverWait(driver, 5, 0.5).until(
                        EC.presence_of_element_located((By.CLASS_NAME, 'nr-pro-menu-wrap'))
                    )

                    cookie = driver.get_cookies()
                except UnexpectedAlertPresentException:
                    driver.switch_to.alert.accept()
                    WebDriverWait(driver, 5, 0.5).until(
                        EC.presence_of_element_located((By.CLASS_NAME, 'nr-pro-menu-wrap'))
                    )
                    cookie = driver.get_cookies()
                for item in cookie:
                    c = "{}={}".format(item['name'],item['value'])
                    c_list.append(c)
                cookiestr = ';'.join(c_list)
                print(cookiestr)
                if 'token' in cookiestr:
                    self.redis_cli.lpush('ksxk_cookies',cookiestr)
                    print('登录成功')
                    break
                else:
                    time.sleep(1)

            except:
                traceback.print_exc()

等这10个网站的爬虫研究完,会针对所有的登录问题,滑块问题,js混淆的问题等出一个垂直系列,敬请期待

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
嗨!对于爬虫中的 JavaScript 逆向案例,我可以给你提供一个简单的示例。请注意,这个示例只是为了帮助你理解逆向过程,真实的应用中可能涉及法律和伦理问题,请合法使用爬虫技术。 假设我们要爬取一个网站上的某个页面数据,但是该页面通过 JavaScript 动态生成。我们可以通过分析网页的 JavaScript 代码来逆向工程,获取所需数据。 首先,打开 Chrome 浏览器并进入开发者工具(按 F12 键或右键点击页面并选择“检查”)。然后切换到“网络”选项卡。 接下来,在浏览器地址栏中输入目标网页的 URL 并按下回车,浏览器将开始加载页面。在网络选项卡中,你将看到所有请求和响应的列表。 查找其中一个请求,该请求可能包含我们所需的数据。点击该请求并查看其请求头、响应头和响应体。 在响应体中,你可能会看到一些 JavaScript 代码,这些代码负责生成页面上的内容。你可以仔细阅读该代码,并找到生成目标数据的部分。 如果你发现目标数据是通过 Ajax 请求获取的,你可以查看该 Ajax 请求的 URL 和参数,然后使用 Python 的 requests 库或其他适当的方法模拟该请求,并解析响应获取数据。 如果你发现目标数据是在 JavaScript 代码中直接生成的,你可以尝试分析代码逻辑并编写相应的 Python 代码来模拟该过程。这可能涉及到使用 JavaScript 解释器或库来执行 JavaScript 代码。 需要注意的是,JavaScript 逆向工程是一项复杂的任务,需要对 JavaScript 和网络协议有一定的理解。同时,网站所有者可能会采取一些反爬虫措施来阻止你的行为,所以请务必遵守法律法规和网站的使用规则。 希望这个示例能够帮助你入门 JavaScript 逆向工程。如果你有任何其他问题,欢迎继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值