1. 程式人生 > >python在網購中的小應用

python在網購中的小應用

        週末看到蘇寧易購的搶購,研究了一下如果利用python做機器人來搶購

1.  搶購

        先人工試驗了一下,結果太低估了秒殺的設計了,不僅有複雜的驗證碼,而且還有問題回答,

回答問題:"千金算盡還?來",其中?是什麼字;沒點文學修養,還沒辦法搶購了,徹底絕望

        看命中的結果:

xiaoyueyue****@163.com1個 驗證成功 2011-12-17 11:00:15.021

hfhs**@yahoo.com.cn1個 驗證成功 2011-12-17 11:00:15.028

158****68191個 驗證成功 2011-12-17 11:00:15.036

137****53591個 驗證成功 2011-12-17 11:00:15.06

        大概都花了15秒多,說明機器人的作用已經很小了

        網上找了一下資料,大概是用BeautifulSoup或者mechanize做網頁資料採集(使用mechanize和BeautifulSoup輕鬆收集Web資料),拿到驗證碼圖片

        先研究了一下驗證碼的自動識別

        驗證碼的破解組合有ImageMagick+tesseract,或者pytesser+tesseract+PIL,或者captchacker+LibSVM+PIL

        測試了一下前面兩種組合,一般數字英文都沒問題,但是對於淘寶,京東的驗證碼,成功率0%,第三種組合一直編譯不過,看說明,hotmail/taobao驗證碼通過率50%,主要得益於LibSVM這個人工智慧庫

        captchacker README中提到:

LibSVM Pythonwrapper (not tested with latest version)

        編譯不過估計是版本不對的原因

2.  價格監測

        搶購是無能為力了,寫點簡單的學習python,如果中意的一件商品降價了,而等到自己發現的時候,卻銷售一空了,非常可惜,下面程式碼就可以做到,實時監控價格,價格降到合適價位,傳送郵件到郵箱,最終手機簡訊通知

        url是商品連結,price_accpet是可接受的價格,比如想買喬布斯傳,先檢視蘇寧商品書籍“喬布斯傳”的HTML原始碼,找到促銷價

<divclass="fridout_price02">易購價:<em>169 元</em></div>  

        總體流程就是每隔60S,利用urllib2拿到HTML,再用強大的BeautifulSoup解析HTML,拿到價格資料,對比心理價格,當價格到了心裡價位的時候,就發郵件;這裡傳送到自己的139郵箱,而且在139郵箱中開通手機簡訊通知,如果商品價格調低了,馬上就會發送郵件到139郵箱,順便傳送手機簡訊通知

'''
Created on 2011-12-17


@author: yhuang
'''
#!/usr/bin/python 
import os
import sys
import urllib2
from BeautifulSoup import BeautifulSoup
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import utils


COUNTER = 1
mail_server = "smtp.139.com"
mail_port = 25
use_tls = False
mail_username = "136758333**@139.com"
mail_password = "****"
mail_from = "136758333**@139.com"
mail_to = "136758333**@139.com"
subject_header = "price down"


def send_mail(msg):
    try:
        msg = MIMEText(msg.encode(),_charset='utf-8')
        msg['From'] = mail_from
        msg['To'] = mail_to
        msg['Subject'] = subject_header
        msg['Date'] = utils.formatdate(localtime=1)
        mailServer = smtplib.SMTP(mail_server, mail_port)
        if use_tls:
            mailServer.starttls()
        mailServer.login(mail_username, mail_password)
        mailServer.sendmail(mail_from,mail_to,msg.as_string())
        mailServer.close()
    except:
        print("send mail fail!")    
     
def monitor(url, price_accpet): 
    idx = 0
    timenow = time.strftime("%Y-%m-%d %X", time.localtime())
    while True:
    #for idx in range(COUNTER):
        try:
            page = urllib2.urlopen(url)
        except:
            print "timenow:%s,couldnot open this %s" %(timenow, url)
            continue
        page = unicode(page.read(),"gb2312","ignore").encode("gb2312","ignore")   
        soup = BeautifulSoup(page, fromEncoding="gb18030")  
          
        price_promotion_info = soup.find('div',{'class':'fridout_price02'}).em 
        price_promotion = price_promotion_info.string 
        #print price_promotion
        
        if price_promotion < price_accpet:
            send_mail(price_promotion)                             
        time.sleep(60)          
    print "program end"
                 
if __name__ == "__main__":                  
    monitor("http://www.suning.com/webapp/wcs/stores/servlet/prd_10052_10051_-7_439939_1.html", 100) 
     

3.  小結

        (1)如果把它放到google pythonapp上,這樣就不用開自己電腦了,(2)如果遇到價格是轉換過的,是一個png圖片,就必須藉助上面組合庫來解析出價格來,(3)如果可以採集到購物車中價格最好,因為可以同時關注N多的資訊,而且購物車中價格肯定是字串的