京东试用-自动申请脚本

前端时间我的一个同事给我看了一个软件,提供京东账号,设置一定的条件后,就可以自动申请京东试用的产品,可是他担心提供账号密码不安全,刚好我也在学习Python中,就当做一个训练。


控制台打印信息

0.需要使用到的库

import requests                # 网络请求库
from bs4 import BeautifulSoup  # HTML字符串解析库
import json                    # Json转换库
import random                  # 随机数
import time                    # 时间库
import cookielib               # 处理网络请求Cookie的库

1.登录

1-1.获取验证码

这里我是通过请求 京东登录页面,从html中获取到下载验证码图片的URL,并将验证码图片保存到本地以供查看。

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('请输入验证码(例:\'xxxx\'):')   # input函数将会在打印台接收一个输入
        return code
1-2.登录

登录使用的是 京东登录接口,登录成功后需要使用 cookielib 库将Cookie存下来以供后面所有接口调用。

def login(self):
        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'
        }
        global cookieJar
        # 初始化一个CookieJar来处理Cookie
        cookieJar = cookielib.CookieJar()
        login_re = s.post(url, data=data, headers=headers)
        cookieJar = login_re.cookies
        content = login_re.text
        result = json.loads(content[1: -1])
        return result

2.获取元数据

2-1.获取京东试用列表

获取列表是直接使用的是 列表的获取链接, 通过HTML里面的items获取到商品信息,放在数组中等待筛选

def get_page_html(self, page):
        try:
            url = "https://try.jd.com/activity/getActivityList?page=" + str(page)
            res = requests.get(url, headers=self.headers)
            html_str = res.text
            return html_str
        except Exception as e:
            print("获取使用列表页面:%s"% e)

根据获取到HTML字符串筛选出每一个item,转成对象,存储在数组中

besoup = BeautifulSoup(html_str, features='lxml')
div_str = besoup.find_all('div', attrs={'class': "con"})
items = BeautifulSoup(str(div_str))
uls = items.find_all('li')
# 加入数组/其他操作
2-2.获取商品价格

根据获取到的skuId请求 价格获取接口获取当前商品价格,当skuIds=xxx,xxx,xxx,xxx时,会返回一个对象数组,返回这些id对应商品的价格

def get_sp_prices(self, sku_ids):
        try:
            url = "https://p.3.cn/prices/mgets?skuIds=" + str(sku_ids) +"&origin=2"
            res = requests.get(url, headers=self.headers, cookies=cookieJar)
            jsStr = res.content
            jsonArr = json.loads(jsStr)
            return jsonArr
        except Exception as e:
            print("获取商品价格数组:%s"% e)
2-3.判断是否已经申请过该商品

通过请求 判断申请过与否接口来获取已经申请过的商品,同上当activityIds=xxx,xxx,xxx会返回字典对象数组

def appled_sp_ids(self, ac_ids):
        global cookieJar
        try:
            url = "https://try.jd.com/user/getApplyStateByActivityIds?activityIds=" + str(ac_ids)
            res = requests.post(url, headers=self.headers, cookies=cookieJar)
            jsStr = res.content
            jsonArr = json.loads(jsStr)
            appled_sp_ids = ''
            for dic in jsonArr:
                appled_sp_ids = appled_sp_ids + "," + str(dic['activityId'])
            # 每一个dic的数据{u'activityId': 313130, u'selected': 10}
            appled_sp_ids = appled_sp_ids[1:]
            return appled_sp_ids
        except Exception as e:
            print("获取已经申请过的id接口:%s"% e)
2-4.过滤关键词

通过比较从配置文件获取的用,隔开的关键词和视频名称对比过滤掉包含关键词的商品

def have_key_word(self, sp_title):
        if self.keyWord is '':
            return False
        keyArr = self.keyWord.split(',')
        have = False
        for key in keyArr:
            if key in sp_title:
                have = True
                return have

        return have
2-5.筛选出符合条件的商品

通过本地配置的JSON文件获取到的属性筛选商品数组

for index, child in enumerate(self.canApplyArr):

            soup = BeautifulSoup(str(child))
            sp_activity_id = child.attrs['activity_id']
            # sku_id = child.attrs['sku_id'] # 获取商品编号
            sp_name = soup.find('div', attrs={'class': "p-name"})

            # 无法再列表页获取价格,获取出来都是:暂无报价,所以跳转到详情页获取
            # price = self.goto_sp_price(sku_id)

            # 判断是否已申请
            if (sp_activity_id not in appled_ids) or (appled_ids is ''):
                # 随机等待秒数
                sleep_s = random.randint(self.minSecond, self.maxSecond)
                print("待申请ID为:%s" % sp_activity_id)
                print("申请中,等待%s " % sleep_s)

                # 进行申请
                time.sleep(sleep_s)
                apply_dic = self.apply_sp(sp_activity_id)
                # 后继处理
2-5.申请商品

通过调用 商品申请接口 来申请商品

def apply_sp(self, sp_id):
        global cookieJar
        try:
            url = "https://try.jd.com/migrate/apply?activityId=" + str(sp_id) + "&source=0"
            res = requests.post(url, headers=self.headers, cookies=cookieJar)
            html_str = res.text
            print(html_str)
            dic = json.loads(str(html_str))
            return dic
        except Exception as e:
            print("申请试用页面:%s"% e)

3.调用

通过预先配置好的JSON文件获取需要的参数,依次为:京东用户名、密码、最小/大时间、去除关键词、最低价格


JSON配置文件
    # 从JD_Configer.json文件中读取配置
    jd_configer = open("JD_Configer.json")
    setting = json.load(jd_configer, encoding="utf-8")
    user_name = setting["name"]
    user_password = setting["password"]
    minS = setting["minTime"]
    maxS = setting["maxTime"]
    minP = setting["minPrice"]
    keyW = setting["keyWord"]

    jd_test = JDTestUse(user_name, user_password, minS, maxS, minP, keyW)
    result = jd_test.login()

    jd_test.get_ten_page_of_once(jd_test.page)

小弟Python初学者,如有错误,请大佬指出,谢谢!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容