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

爬虫认知 在程序猿所有的方向中,爬虫是离money最近的一个方向,你的明白?而且爬虫可发展的方向很多,前可走大数据,人工智能,后可转后端,还有就是安全领域。而且爬虫做得好,要求的技术栈还是比较全面的。

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

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

1.微信扫码登录

 

python爬快手视频代码 爬虫 快手_python

2. 账号密码登录

python爬快手视频代码 爬虫 快手_人工智能_02

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

python爬快手视频代码 爬虫 快手_python爬快手视频代码_03

我们点击登录后需要拖动滑块。这个滑块,大家在看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混淆的问题等出一个垂直系列,敬请期待