Yingjie

为你买LV,我拼了

薛英杰 / 2020-06-26


海上月是天上月,眼前人是心上人。 ——张爱玲

恋人之间最好的感情,莫过于此。有求必应,秒回信息,是每一位少女心中的期冀,但人生不如意十之八九,并非事事都能顺心。女朋友好不容易相中一款LV背包,无奈店铺缺货,时不时地需要上网查询是否已上新货,又担心刚上新货被别人秒光,看她一次次刷货无果,萌生了帮她搞定的想法。

这么简单无脑,单调又重复的体力活,让她来做岂不是有点浪费时间。我决定用知识武装头脑,交给计算机来干,以表我存在的实际价值。于是做了如下周密部署:

理想很丰满,现实很骨感。听起来貌似很简单,做起来一点都不容易啊!那就来说说其中的曲折以及我是如何一步步实现的。

首先,会用到爬虫相关的知识,需要从固定的网站中提取相关特征,来判断是否有新货补给,网站截图如下:

网页源代码如下:

如果购物标签为Call for avalability,说明无货物可以利用,否则提醒我们出现货物补给。通过request 请求获得网页源代码,提取购买按钮上的标签文本,实现python代码如下:

import requests  %加载requests模块,用来请求网址以获得网页源代码%
import bs4       %加载bs4模块,用来分析网页源代码,提取定位元素标签文本%

#定义判断函数
def Lv():
    url='https://au.louisvuitton.com/eng-au/products/nano-speedy-monogram-010575' %访问网站网址%
    headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'} %请求浏览器信息%
    r = requests.post(url, headers=headers)  %请求获取网页源代码%
    content = bs4.BeautifulSoup(r.content.decode("utf-8"), "lxml") %解析网页源代码%
    element = content.find(id='callToPurchase').stripped_strings  %获取网页代码文本%
    calls=[i for i in element][0]          %输出文本%
    if not calls=='Call for availability': %判断是否有货物补给,如果是返回True,否则返回False%
        b=True
    else:
        b=False
    return b   

一旦发现有新货补给,那就可以通知我们人工下单。通知方式有千百种,比如,设置声音提醒,邮件提醒、微信提醒和短信提醒。微信几乎成为人们生活的不可或缺的一部分,用它做信息提醒再合适不过了,但2019年7月以后,微信官方关闭了登录网页版微信的功能,导致itchart模块不能使用,可以扫码但不能登录。那怎么办呢?经过浏览各大网站,发现声音和短信提醒相对简单。声音提醒直接下载wav音频文件,触发提醒条件后,通过playsoud模块播放即可,短信提醒可以利用twilio,该网站支持多种编程语言,选择一种自己擅长的,在官方主页注册后会赠送15美元短信服务费,可以满足发送500条短信的需求,具体参考https://www.jianshu.com/p/d1f189d54a63,代码如下:

from twilio.rest import Client
import time
from playsound import playsound

#提取系统当前时间
def GetNowTime():
    return time.strftime("%H:%M:%S",time.localtime(time.time()))

#短信发送函数
def SendMassage():
    # Your Account Sid and Auth Token from twilio.com/console
    account_sid = 'AC83b7590144b3ee932fe17187efb5e4f3'
    auth_token = '0a2edd859236e837dffa4f1861205ad0'
    client = Client(account_sid, auth_token)
    
    message = client.messages.create(
                                  from_='+12054795951',
                                  body='你的LV包包有货啦,抓紧速度拍.....',
                                  to='+8613458731241'
                          )
    print(message.sid)


#货物补给后,发行短消息并播放音乐
def mainfun():   
    while GetNowTime()>'06:00:00' and GetNowTime()<'22:00:00': %六点到晚上十点期间检测网站变化%
        packageinf=Lv()
        if packageinf :
            SendMassage()
            break
        else:
            print("你的LV包包无货,请宝贝耐心等待.....")
            laysound('E:\wav\nm0114.wav')
            time.sleep(300)  %5分钟检测一次%
            

短信发送的测试结果如下:

所有内容已介绍完,你可能会问:

为什么不把下单、付款等一系列的东东全部通过代码实现呢?

那我会告诉你,这是奢侈品,我家亲爱的同一种包包不会买两次的,既然不会重复操作,写代码调试的时间远远超过人工购买的时间,我不傻,这样做得不偿失。最后,附上所有代码,有需要哄女朋友的直接拿走。

import requests
import bs4
from twilio.rest import Client
import time
from playsound import playsound

def Lv():
    url='https://au.louisvuitton.com/eng-au/products/nano-speedy-monogram-010575'
    headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
    r = requests.post(url, headers=headers)
    content = bs4.BeautifulSoup(r.content.decode("utf-8"), "lxml")
    element = content.find(id='callToPurchase').stripped_strings
    calls=[i for i in element][0]
    if not calls=='Call for availability':
        b=True
    else:
        b=False
    return b   


def GetNowTime():
    return time.strftime("%H:%M:%S",time.localtime(time.time()))


def SendMassage():
    # Your Account Sid and Auth Token from twilio.com/console
    account_sid = 'AC83b7590144b3ee932fe17187efb5e4f3'
    auth_token = '0a2edd859236e837dffa4f1861205ad0'
    client = Client(account_sid, auth_token)
    
    message = client.messages.create(
                                  from_='+12054795951',
                                  body='你的LV包包有货啦,抓紧速度拍.....',
                                  to='+8613730829546'
                          )
    print(message.sid)
    
def mainfun():   
    while GetNowTime()>'06:00:00' and GetNowTime()<'22:00:00':
        packageinf=Lv()
        if packageinf :
            SendMassage()
            break
        else:
            print("你的LV包包无货,请宝贝耐心等待.....")
            playsound('E:\wav\nm0114.wav')
            time.sleep(300)
            
if __name__ == '__main__':
    mainfun()