【Python54.1--豆瓣登录】

1、模拟豆瓣登录

'''
|-- 代码解析:
|-- 1、登录必须具备的条件:url,cookie,fromData
    fromData的参数如下:
        source: index_nav
        form_email: 1832785141@qq.com
        form_password: wfq8319274129
        captcha-solution: rough
        captcha-id: K0dnHwvyM2evqk1Do8beSlpl:en
        login:登录
    拿到这些参数必须弄懂具体各个参数是什么含义:
        form_email : 用户名
        form_password : 密码
        captcha-solution : 验证码图片的名字(如何确认:登录页面查看网页源代码搜索:captcha-solution;另外一种方法:登录页检查,用左上角箭头查看验证码框。得到以下的内容:)
            <input type="text" autocomplete="off" class="inp" id="captcha_field" name="captcha-solution" tabindex="3" placeholder="验证码"/>
        captcha-id : 验证码图片ID(如何确认:同captcha-solution方法一样)
|-- 2、由于存在验证码,所以data字典内分两部分写入,一部分写入验证码之前的字段:source,form_email,form_password。一部分等获取验证码后,在写入:
       captcha-solution,captcha-id,login
|-- 3、用reponse接受请求
|-- 4、读取返回来的数据
|-- 5、获取验证码的地址(方法:登录页检查,用左上角的箭头点击验证码图片就可以得到地址,具体如下:)
        <img id="captcha_image" src="https://www.douban.com/misc/captcha?id=XnfFdo9PtGEvzszCDcsba03p:en&amp;size=s" alt="captcha" class="captcha_image" title="看不清楚?点图片可以换一个" style="cursor: pointer;">
        具体代码用:re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html)
            -- 这里需要注意的知识点:imgurl=re.search(), src="(.+?)"正则表达式
|-- 6、获取验证码的图片url:url =  imgurl.group(1) 并把图片保存到目录下以便程序运行时输入具体的验证码:res = urllib.request.urlretrieve(url,'v.jpg')
|-- 7、获取验证码的ID(方法同第5步一样,具体如下:) 
        <input type="hidden" name="captcha-id" value="F3RK1x6AUPruX28jxjfSGfoI:en">
        具体代码用: re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>',html)
            --同样需要注意的知识点:re.search,value="(.+?) 正则表达式
|-- 8、再次写入captcha-solution,captcha-id,login
|-- 9、再次用reponse读取返回的数据
|-- 10、做个检查点,判断返回的url是否是登录后的url
'''

import re
import urllib.request
import urllib.parse
from http.cookiejar import CookieJar
import ssl
ssl._create_default_https_context = ssl._create_unverified_context


#登录需要的参数
login_url = "https://www.douban.com/accounts/login"
cookie = CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor)

data = {"form_email":"1832785141@qq.com",
        "form_password":"wfq8319274129",
        "source":"index_nav"}


#request = urllib.request.Request(login_url,urllib.parse.urlencode(data).encode('utf-8'),method='POST')
reponse = opener.open(login_url,urllib.parse.urlencode(data).encode('UTF-8'))

#验证成功跳转至登录页
if reponse.geturl() == login_url:
    html = reponse.read().decode()

    #获取验证码图片地址
    imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html)
    print("imgurl++",imgurl)

    if imgurl:
        #group()返回组号匹配的所有字符串即:验证码图片的url
        url = imgurl.group(1)
        print("url--",url)
        #将验证码图片保存至同目录下
        res = urllib.request.urlretrieve(url,'v.jpg')

        #获取图片id:captcha-id
        captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>',html)
        #print("captcha==",captcha)

        if captcha:
            vcode = input('请输入验证码:')
            data["captcha-solution"]=vcode
            data["captcha-id"] = captcha.group(1)
            data["login"] = "登录"

            #提交验证码
            reponse =opener.open(login_url,urllib.parse.urlencode(data).encode('UTF-8'))

            #登录成功,跳转至首页
            if reponse.geturl() == "https://www.douban.com/":
                print("登录成功")

涉及到的知识点

1、https://www.cnblogs.com/tina-python/p/5508402.html

2、http://www.cnblogs.com/anni-qianqian/p/10019672.html   (各类爬虫的实例!!!)

3、URLError错误解决方案:https://blog.csdn.net/sylmoon/article/details/78777770

原文地址:https://www.cnblogs.com/frankruby/p/10080460.html