潭州课堂25班:Ph201805201 爬虫基础 第十三课 cookie (课堂笔记)

# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/9/15 0015 4:52

#cookie 是服务器发给浏览器的特殊信息
# 可以理解为一个临时通行证
# 以 json 形式存放
# name:   cookie 的名称
# value:  coikie 的值
# domain:  可以使用此 cookie 的域名
# path:  可以使用此 cookie 的页面路径
# expires/Max-Age : cookie 的超时时间  默认是 session ,当浏览器关闭时失效
# secure :  设置是否只能通过 https 来传递此条 cookie


#  豆瓣登录
# 抓包 按F12,在输入账号,密码框中输入相应值后,点登录,
#  找到 302 页面跳转,这时所需要的数据就在这里 login

import requests
from urllib import request
from lxml import etree
from PIL import  Image


class DoubanSpider():
    def __init__(self,us,ps):
        self.session = requests.session()
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
        self.login_url = 'https://accounts.douban.com/login'
        self.us = us
        self.ps = ps

    def start_res(self):
        # 第一步先不登录,先 get 看看有没有验证码出现,
        re = self.session.get(self.login_url).content.decode()
        ht = etree.HTML(re)
        self.pass_login(ht)

    def pass_login(self,ht):
        captcha_id = ht.xpath('//input[@name="captcha-id"]/@value')
        # print(captcha_id)
        # 验证码下载地址
        captcha_solution = ht.xpath('//img[@id="captcha_image"]/@src')
        # print(captcha_solution)
        # 如果没有验证码
        if captcha_solution == []:
            print('没有发现验证码')
            data = {
                'source': 'movie',
                'redir': 'https://movie.douban.com/top250',
                'form_email': self.us,
                'form_password':self.ps,
                'login': '登录'
            }
        else:
            im_path = '1.png'           # 验证码存放路径
            #  文件下载方法,      下载地址,     路径文件名
            request.urlretrieve(captcha_solution[0], im_path)
            img = Image.open(im_path).show()
            data = {
                'source': 'movie',
                'redir': 'https://movie.douban.com/top250',
                'form_email': self.us,
                'form_password':self.ps,
                'captcha-solution': input('请输入验证码--->>'),       #  验证码
                 'captcha-id': captcha_id[0],
                'login': '登录'
        }
        res = self.session.post(self.login_url, data=data, headers = self.headers).content.decode()
        self.login_res(res)


    # 登录成功后获取页面内容
    def login_res(self,res):
        html = etree.HTML(res)
        # 如果登录成功,r 列表中有值,否则为空列表
        r = html.xpath( '//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()' )
        if r ==[]:
            print('登录失败')
        else:print('登录成功,当前账号为:%s' %r[0])


if __name__ == '__main__':
    lo = DoubanSpider('账号', '密码')
    lo.start_res()

  

  data = {
'source': 'movie',
'redir': 'https://movie.douban.com/top250',
'form_email': self.us,
'form_password':self.ps,
'captcha-solution': input('请输入验证码--->>'), # 验证码
'captcha-id': captcha_id[0],
'login': '登录'
}

当要输入验证码时,要提交的值为data2,

其中  captcha - solution  的值为验证码

captcha - id 在页面源码中 ctrl  + f  搜索

 用 xpath  找到节点,可取其值

原文地址:https://www.cnblogs.com/gdwz922/p/9649784.html