周末看到苏宁易购的抢购,研究了一下如果利用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多的信息,而且购物车中价格肯定是字符串的