菜鸟写Python-Selenium操作:Selenium登录豆瓣并获取cookies

一、背景

很多时候,我们在爬取数据时,有些页面的数据需要登录才能看到,因此需要登录再爬取数据。实现login再爬取的手段很多,但核心都是通过cookie的方式来记录身份信息,因此模拟登录的核心在于对cookie的使用(获取、保存和使用)。

二、模拟登录方法

1、通过分析登录页面,获取登录接口和提交表单进行登录验证(可以用简单的Request库结合cookielib方式或者Scrapy等)

简单的Request库结合cookielib方式,请参考:Cookie登录爬取实战:Python 利用urllib库的cookie实现网站登录并抓取

2、通过selenium进行浏览器模拟登录(简单直接有效)

然而,随着各知名网站反爬虫机制升级,登录接口变得越来越复杂复杂,加入动态js的方法,使用方式1,难度在增加。因此本文采用selenium方式来登录,同时通过session记录登录后的cookies,进一步对其他内的内容进行爬取。

Selenium介绍:

Selenium可以模拟真实的浏览器,具有浏览器所有的功能,可以很容易的加载js。加上在写Python爬虫的时候,最麻烦的不是那些海量的静态网站,而是那些通过JavaScript获取数据的站点,这是Selenium的优势就很明显了。

三、实现代码

环境:python3.6 + windows10 + Chrome

依赖库:selenium库 (初次使用先安装 pip3 install selenium)

驱动包:下载Chrome驱动包:http://chromedriver.storage.googleapis.com/index.html,根据你的chrome版本下载,并放在python安装根目录

思路:用selenium打开chrome,通过程序自动输入账号密码,有验证码则需手动填写下验证码。等到成功登陆之后使用“get_cookies()”函数来调出它的Cookies,同时继续访问登录后的其他页面。

from selenium import webdriver #导入selenium

    def loginZhihu(self):
        loginurl='https://www.douban.com/'    # 登录页面
        # 加载webdriver驱动,用于获取登录页面标签属性
        driver=webdriver.Chrome()
        driver.get(loginurl)    # 请求登录页面
        driver.find_element_by_name('form_email').clear()  # 获取用户名输入框,并先清空
        driver.find_element_by_name('form_email').send_keys(u'usernam') # 输入用户名
        driver.find_element_by_name('form_password').clear()  # 获取密码框,并清空
        driver.find_element_by_name('form_password').send_keys(u'password') # 输入密码

        captcha=driver.find_element_by_id('captcha_image')  # 获取验证码标签
        submit=driver.find_element_by_css_selector('input[class="bn-submit"]')#获取提交按钮
        # 判断是否需要验证码
        if captcha:
            captcha_field=driver.find_element_by_id('captcha_field')  #获取验证码输入框
            text=input("请输入验证码:")  # 控制栏输入验证码
            captcha_field.send_keys(text)  # 将输入的验证码传递给selenium打开的浏览器
            submit.click()  # 按钮提交并登录
        else: 
            submit.click()  # 无验证码则直接登录提交
        cookies=driver.get_cookies()   # 获取验证码
        driver.get('https://movie.douban.com/')  # 请求其他页面
        return cookies  #返回cookies 之后其他方法可以调用,这样不用每次请求都返回登录

扩展:通过这个方法,我们请求其他页面也是登录之后的状态,其实除了return cookies外,我们也可以先把cookies保存文本,然后在在后面请求中,我们在读出cookies去请求其他页面也是一样的。

#  添加微信:第一行Python代码,获取开发代码视频及其他资料,一起交流学习Python

猜你喜欢

转载自blog.csdn.net/godot06/article/details/81566213