模拟京东登录

#!/usr/bin/env python
# coding=utf-8
# 模拟京东登录
# https://segmentfault.com/a/1190000013170936

import os
import requests
from bs4 import BeautifulSoup
import time

class JD_crawl(object):
    def __init__(self, username, password):
        # 初始化headers实例
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0",
                        "Referer": "https://www.jd.com/"
                        }
        # 登录界面
        self.login_url = "https://passport.jd.com/new/login.aspx"
        # 获取用户名
        self.post_url = "https://passport.jd.com/uc/loginService"
        # 控制验证码是否显示的网址
        self.auth_url = "https://passport.jd.com/uc/showAuthCode"
        # session会话对象
        self.session = requests.session()
        self.username = username
        self.password = password

    # 提取表单登录信息
    def get_login_info(self):
        html = self.session.get(self.login_url, headers=self.headers).content
        soup = BeautifulSoup(html, "lxml")
        # 获取代码中的id="uuid"的value值,id名前加#
        uuid = soup.select('#uuid')[0].get('value')
        eid = soup.select('#eid')[0].get('value')
        # 获取标签input中并且name="fp"属性里面的value的值
        fp = soup.select('input[name="fp"]')[0].get('value')
        _t = soup.select('input[name="_t"]')[0].get('value')
        login_type = soup.select('input[name="loginType"]')[0].get('value')
        pub_key = soup.select('input[name="pubKey"]')[0].get('value')
        sa_token = soup.select('input[name="sa_token"]')[0].get('value')

        auth_page = self.session.post(self.auth_url, data={'loginName': self.username}).text
        # 判断是否需要输入验证码
        if 'true' in auth_page:
            auth_code_url = soup.select('#JD_Verification1')[0].get('src2')
            auth_code = str(self.get_auth_img(auth_code_url))
        else:
            auth_code = ''
        data = {
            "uuid": uuid,
            "eid": eid,
            "fp": fp,
            "_t": _t,
            "loginType": login_type,
            "loginname": self.username,
            "nloginpwd": self.password,
            "chkRememberMe": True,
            "authcode": auth_code,
            "pubKey": pub_key,
            "sa_token": sa_token
        }
        return data

    # 下载验证码,并提示输入
    def get_auth_img(self, url):
        # 从源码获取的验证码链接是一个相对链接,需要对获取的链接进行补全,最后加上时间戳
        auth_code_url = 'http:{}&yys={}'.format(url, str(int(time.time() * 1000)))
        # 获取图片
        auth_img = self.session.get(auth_code_url, headers=self.headers)
        with open('auth.jpg', 'wb')as f:
            f.write(auth_img.content)
        # 获取下载的图片验证码的路径
        image_path = os.path.abspath('auth.jpg')
        # 以后还可以优化,将下载的图片地址链接附在上面,直接点击查看
        code_typein = input('请根据下载的图片输入验证码(验证码位于"%s"):' % image_path)
        return code_typein

    # 模拟登录
    def login(self):
        data = self.get_login_info()
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0",
                   "Referer": self.post_url,
                   "X-Requested-With": "XMLHttpRequest"
                   }
        try:
            login_page = self.session.post(self.post_url, data=data, headers=headers)
            # 打印代码结果提示:
            # ({"emptyAuthcode":"\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801"})  表示“请输入验证码”
            # ({"pwd":"\u8d26\u6237\u540d\u4e0e\u5bc6","_t":"_ntwERQb"})【账户名与密码不匹配,请重新输入】
            # ({"username":"\u8bf7\u5237\u65b0\u9875\u9762\u540e\u91cd\u65b0\u63d0\u4ea4","_t":"_ntijDOz"}) 验证失败
            # print(login_page.text)
            if "pwd" in login_page.text:
                print("账户名与密码不匹配!")
            elif "username" in login_page.text:
                print("验证失败!")
            elif "emptyAuthcode" in login_page.text:
                print("请输入正确验证码!")
            elif "success" in login_page.text:
                print("欢迎您'%s',登录成功!"%self.username)
        except Exception as e:
            print(e)
            jd.shopping()
    # 如果登录成功,获取购物车里面的商品
    def shopping(self):
        carShop = self.session.post('https://cart.jd.com/cart.action',headers = self.headers)
        print(carShop)

if __name__ == "__main__":
    username = input("请输入登录账号:")
    password = input("请输入登录密码:")
    jd = JD_crawl(username, password)
    jd.login()

猜你喜欢

转载自blog.csdn.net/z564359805/article/details/80930456