模拟动态登录,获取cookie和图片验证码登录(AcFun和豆瓣)

#模拟登录acfun
#导入第三方库
import requests
import pickle
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import re
from PIL import Image

#提交表单获取cookie
def get_cookie_from_net():
    #d登录的url
    url = 'http://www.acfun.cn/login.aspx'
    #定义提交的表单数据
    #表单结构,可以通过自己的观察来设计
    payload={
       'username':'账号',
       'password':'密码'
    }
    # 绕过SSL验证、
    #发送post请求
    data = s.post(url, headers=headers, data=payload, verify=True)
    #将请求道的cookie保存下来
    with open('cookies.acfun', 'wb') as f:
        cookiedict = requests.utils.dict_from_cookiejar(s.cookies)
        pickle.dump(cookiedict, f)
    print('提交表单登录,成功获取cookies..')

    return s.cookies

# 从cookie文件获取cookie
def get_cookie_from_file():
    with open('cookies.acfun', 'rb') as f:
        cookiedict = pickle.load(f)
        cookies = requests.utils.cookiejar_from_dict(cookiedict)
    print('解析文件,成功提取cookie....')
    return cookies

# 获取数据
def getData(html):
    soup = BeautifulSoup(html.text, 'html.parser')
    # print(soup)
    #异常处理
    try:
        #根据需要,可以在这个位置获取登录页面后的数据
        #和进行另外的操作
        mydata = soup.select('.desc')[0].get_text()
    except:
        #获取不到判断啧进行第二次登陆尝试
        #细心的话,可以进行递归判断,仿制死循环
        print('再次尝试登录')
        s.cookies = get_cookie_from_net()
        login_and_getdata()
    # 还可以继续处理其他数据

    return mydata

#主要启动程序,查看是否已存在可以登录的cookie
#若存在,则直接登录
#不存在,则进行表单提交操作,获取cookie
def login_and_getdata():
    print('获取cookie')
    try:
        s.cookies = get_cookie_from_file()
    except:
        print('从文件获取cookie失败。。\n正在尝试提交表单登录以获取...')
        s.cookies = get_cookie_from_net()
    html = s.get('这里填写登陆后可以直接访问的地址', headers=headers)
    data = getData(html)
    print(data)

if __name__ == "__main__":
    # 全局变量
    s = requests.session()
    ua = UserAgent()
    headers = {'User-Agent': ua.chrome}

    login_and_getdata()

上述是登录A站的,貌似A站没有设置多次重复登录之类的操作过于频繁的话,需要验证码操作。因此,找到了豆瓣的网站(我发现豆瓣和12306有的一拼,都是被拿来练手的)

下面上代码:(因为和上述的操作步骤区别不大,只是针对多次登录后会出现图片验证码的问题做文章,因此详细讲解这一步,使用了PIL第三方模块的Image)

import requests
import pickle
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import re
from PIL import Image


# 提交表单获取cookie
def get_cookie_from_net():
    url = 'https://accounts.douban.com/login'
    #这一步需要先把豆瓣登录页面的数据获取到
    login_html = s.get(url, headers=headers).text
    #通过正则,获取image的地址
    verif_img_url = re.findall(r'<img id="captcha_image" src="(.*?)" alt="captcha"', login_html)[0]
    #获取图片的数据
    verif_img_data = s.get(verif_img_url, headers=headers).content
    #二进制写入下来
    with open('douban.jpg', 'wb') as f:
        f.write(verif_img_data)

    # 手动输入验证码
    #使用Image的open和_show方法,打开保存的图片
    img = Image.open('douban.jpg')
    Image._show(img)
    captha_img = str(input("输入验证码:"))

    # 云打码
    #网上也有云打码这方面的,需要和第三方平台做交互,这就不做演示了
    # print('利用云打码获取识别码。。。。')
    # captha_img = getcode_from_yundama()
    # 获取captcha-id
    #print(login_html)
    #当豆瓣登录页面出现验证码的时候,实有图片的id值的,只需要获取,然后拼接在登录表单里即可
    captha_id = re.findall(r'name="captcha-id" value="(.*?)"/>', login_html)[0]
    print('captcha_id:', captha_id)

    # 构建表单
    payload = {'source': 'None',
               'redir': 'https://www.douban.com',
               'form_email': '登录账号',
               'form_password': '登录密码',
               'login': '登录',
               'captcha-solution': captha_img,
               'captcha-id': str(captha_id)
               }
    # 绕过SSL验证
    data = s.post(url, headers=headers, data=payload, verify=True)

    with open('cookies.douban', 'wb') as f:
        cookiedict = requests.utils.dict_from_cookiejar(s.cookies)
        pickle.dump(cookiedict, f)
    print('提交表单登录,成功获取cookies..')


    return s.cookies


# 从cookie文件获取cookie
def get_cookie_from_file():
    with open('cookies.douban', 'rb') as f:
        cookiedict = pickle.load(f)
        cookies = requests.utils.cookiejar_from_dict(cookiedict)
    print('解析文件,成功提取cookie....')
    return cookies


# 获取数据
def getData(html):
    soup = BeautifulSoup(html.text, 'html.parser')
    # print(soup)
    try:
    #这里只是获取了登陆成功页面的个人签名数据
    #若要获取更多,可以另行操作。都是基础操作
        mydata = soup.select('#display')[0].get_text()
    except:
        s.cookies = get_cookie_from_net()
        login_and_getdata()
    # 还可以继续处理其他数据

    return mydata


def login_and_getdata():
    print('获取cookie')
    try:
        s.cookies = get_cookie_from_file()
    except:
        print('从文件获取cookie失败。。\n正在尝试提交表单登录以获取...')
        s.cookies = get_cookie_from_net()
    html = s.get('https://www.douban.com/people/181618569/', headers=headers)
    data = getData(html)
    print(data)


if __name__ == "__main__":
    # 全局变量
    s = requests.session()
    ua = UserAgent()
    headers = {'User-Agent': ua.chrome}

    # print(headers)

    login_and_getdata()

猜你喜欢

转载自blog.csdn.net/qq_38044574/article/details/81906152