#!/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()
模拟京东登录
最新推荐文章于 2023-01-01 12:44:57 发布