来源:IMyxuan

链接:https://segmentfault.com/a/1190000011978866

分析登录的网络请求

打开https://passport.jd.com/new/login.aspx

打开浏览器的调试面板,然后,输入账号密码 =>> 登录,然后看调试面板上面的Network捕捉到的网络请求,如下图:

根据上面的图片,我们可以知道,在我们点击完登录按钮之后,浏览器发送了一个POST请求到https://passport.jd.com/uc/loginService,然后在请求头上面带上了一些基本的参数,最重要的有三个,一个是cookie,一个是Referer,还有一个是User-Agent。

然后,再看看请求所需要的参数,这里面有两部分,一个是Query Params:

uuid:6a9ddda4-1819-4819-a888-b59301f83a59
ReturnUrl:https://item.jd.com/5089239.html
r: 0.2520828231526894
version: 2015

另一个是Form Data

uuid:6a9ddda4-1819-4819-a888-b59301f83a59
eid:F37T4YRBOPZZ6JSEGDA7WH2VCIETQY…J23JGCTD3IM4TMK44Y5ATOTO6G4SM
fp:87783198d64a9aa25b3f0b28b152b094
_t:_t
loginType:f
loginname:test@qq.com
nloginpwd:P+TbkVGbhhhC4DFlZ7y4az8j/Y1QYw…h0qs8+bKp7UbHeGWF1KEMrQUG5po=
chkRememberMe:
authcode:
pubKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD…woanQq+CA6agNkqly2H4j6wIDAQAB
sa_token: B68C442BE645754F33277E70120805…8EF504D2CD67D7341B8BFBA47FFA5

上面的参数里面,基本可以在页面上面可以找到

其中:ReturnUrl是登录成功后返回的页面,authcode是图片验证码,本例子上面不需要输入验证码。

Python实现

根据上面的分析我们只需要通过代码发送一个post请求,并且带上相对应的参数就可以实现登录了。所有的参数,我们都可以轻而易举地获取,唯一的困难是cookie,但是,Python的requests库给我们提供了会话机制,也就是requests.Session(),因此,具体的实现过程可以如代码所示。

完整代码

# -*- coding: UTF-8 -*-
import json
import requests
import sys

from bs4 import BeautifulSoup

s = requests.Session()

class JD:
    def __init__(self, username, password):
        self.username = username
        self.password = password
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0',
            'Referer': 'https://www.jd.com/'
        }

def get_login_data(self):
        url = 'https://passport.jd.com/new/login.aspx'
        html = s.get(url, headers=self.headers).content
        soup = BeautifulSoup(html, 'lxml')
        display = soup.select('#o-authcode')[0].get('style')
        auth_code = ''
        if not display:
            print('需要验证码。。。')
            auth_code_url = soup.select('#JD_Verification1')[0].get('src2')
            auth_code = self.get_auth_img(auth_code_url)
        uuid = soup.select('#uuid')[0].get('value')
        eid = soup.select('#eid')[0].get('value')
        fp = soup.select('input[name="fp"]')[0].get('value')  # session id
        _t = soup.select('input[name="_t"]')[0].get('value')  # token
        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')

data = {
            'uuid': uuid,
            'eid': eid,
            'fp': fp,
            '_t': _t,
            'loginType': login_type,
            'loginname': self.username,
            'nloginpwd': self.password,
            'chkRememberMe': True,
            'authcode': '',
            'pubKey': pub_key,
            'sa_token': sa_token,
            'authCode': auth_code
        }
        return data

def get_auth_img(self, url):
        auth_code_url = 'http:' + url
        auth_img = s.get(auth_code_url, headers=self.headers)
        with open(sys.path[0] + '/auth.jpg', 'wb') as f:
            f.write(auth_img.content)
        code = input('请输入验证码:')
        return code

def login(self):
        """
        登录
        :return:
        """
        url = 'https://passport.jd.com/uc/loginService'
        data = self.get_login_data()
        headers = {
            'Referer': 'https://passport.jd.com/uc/login?ltype=logout',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0',
            'X-Requested-With': 'XMLHttpRequest'
        }
        content = s.post(url, data=data, headers=headers).text
        result = json.loads(content[1: -1])
        return result

def rush(self):
        print('功能正在赶来的路上,敬请期待。。。')
        pass

def handle():
    print("*************** 菜单列表 **************")
    print('1、抢购')
    print('2、加入购物车')
    num = input('请输入功能编号:')
    if num == '1':
        print('抢购功能正在赶来的路上,敬请期待。。。')
    else:
        print('加入购物车功能正在赶来的路上,敬请期待。。。')
        # print('加入购物车成功!!!')
    pass

username = input('请输入京东账号:')
password = input('请输入京东密码:')
jd = JD(username, password)
result = jd.login()
if result.get('success'):
    print('登录成功')
    handle()
else:
    print('登录失败')

Python模拟京东登录(附完整代码)相关推荐

  1. Python实现自动翻译功能 - 附完整代码

    Python实现自动翻译功能 - 附完整代码 随着全球化的不断深入,越来越多的人需要跨越语言障碍进行交流.机器翻译技术的出现为这一问题提供了有效的解决方案.今天,我们将通过Python实现一个自动翻译 ...

  2. 酷炫的业务看板大屏可以使用 Python 轻松制作( 附完整代码)

    不少公司和学校将信息化手段应用到了日常工作中,数字大屏可以用做数据监控的前端平台,在数据监控与分析中可以起到重要作用. 但是,制作一张大屏可要花费不少精力,如何在一天内快速做好一张数据实时监控大屏?需 ...

  3. 使用Python实现的遗传算法 附完整代码

    遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,它借鉴了达尔文的进化论和孟德尔的遗传学说.其本质是一种高效.并行.全局搜索的方法,它能在搜索过程中自动获取和积累有关搜索空间的知识,并 ...

  4. python 神经网络_推荐 :用Python实现神经网络(附完整代码)!

    Datawhale干货   作者:[美]霍布森·莱恩,科尔·霍华德 在学习神经网络之前,我们需要对神经网络底层先做一个基本的了解.我们将在本节介绍感知机.反向传播算法以及多种梯度下降法以给大家一个全面 ...

  5. 用Python实现神经网络(附完整代码)!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:[美]霍布森·莱恩,科尔·霍华德 在学习神经网络之前,我们需要对神 ...

  6. Python 国务院政策爬虫(附完整代码)+自动更新+写入数据库

    目前在做政策相关的文本分析,手头上现成的数据资源质量较差,就自己写了个爬虫. 对爬虫有几个要求,如下: 1. 获取标签中的内容 2. 获取内容 3. 保留 HTML 文档定义样式信息(用于后期重新展示 ...

  7. Python:制作一个模拟扔硬币的程序(附完整代码)

    Python:制作一个模拟扔硬币的程序(附完整代码) 在这个项目中,我们将编写一个Python程序来模拟扔硬币的方式.我们会使用Python内置的随机模块,实现随机出现正面或反面的效果. 首先,我们需 ...

  8. github的python代码怎么跑_如何利用Python模拟GitHub登录详解

    前言 最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要 ...

  9. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)

    引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟 ...

最新文章

  1. SpringMVC - SpringMVC的概述
  2. python ftp模块_python中的FTP文件模块
  3. cpu烤机工具_MySQL常用工具选择和建议
  4. 《大道至简》第二章 读后感
  5. Django项目与中间件与celery
  6. python字典的键可以是元组吗_python字典的键可以是元组吗
  7. 洛谷 P1162 填涂颜色-dfs染色法
  8. Java 内存泄露总结
  9. mysql主从维护_mysql主从日常管理维护
  10. 如何使用github搭建个人博客
  11. vb 获取系统声音的电平_质量好的背景音乐系统套装效果图
  12. redhat下使用mrtg监控主机流量
  13. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2 1 4
  14. 富人和穷人在面对同一件事情时
  15. 自助BI项目实施可行性分析报告
  16. 小技巧:Win7屏保变梦幻桌面
  17. 数据通路功能——单总线
  18. 个人SEO成长指南:该怎么开启你的SEO业务
  19. jquery的ajax的使用!
  20. java反序列化漏洞分析

热门文章

  1. 不懂就学——什么是input和output?
  2. 实现vue页面下载成word文档
  3. 【单片机】用定时器以间隔500ms在8位数码管上依次显示0、1、2、3、...C、D、E、F,重复
  4. STM8S1003 模拟SPI 驱动 SI4432
  5. 纯CSS3画哆啦A梦
  6. 基于springboot的问卷调查系统的设计与实现
  7. php redis序列化,php session之存储在redis的方法
  8. 中国天气网免费天气预报接口API
  9. 第1部分 基础算法(提高篇)--第1章 贪心算法1425:【例题4】加工生产调度
  10. java图形界面编程视频,mysql数据库引擎面试