完成的目标:

  输入搜索的商品 以及 淘宝的已评价数目、店铺的商品描述(包括如实描述、服务态度、快递的5.0打分);

  按要求,晒选出要求数量的结果,并按“物美价廉算法”排序后输出    

思路:

1,利用淘宝搜索'https://s.taobao.com/search?'的价格filter 先进行价格筛选,得到结果的网站

2,用urllib打开结果网站,构造正则表达式匹配出各个商品结果的 价格、已评价数量、店铺的如实描述等信息;

  并把结果保存至二维数组里。

3,利用商品及店铺信息,用“物美价廉算法”给各个商品打分

4,按打分排序, 各个信息总结果按排序输出到新建txt文件里;

  并将各个商品图片下载到文件及建立相同排序开头的txt(其名字包好简要的商品信息),这样图片和商品信息同时能在一个文件夹里用大图排列看到。

5.,可以把输入的参数(价格范围等要求)以函数输入,,用pyinstaller 把整个py程序打包为EXE 就可以发布了。

“物美价廉算法”说明:

  利用商铺顾客的评分作为主要筛选保证质量,价格偏离平均值的幅度筛选便宜的商品,销量热门度以已有评价数度量。具体算法见源代码,参数与函数都是自己调试的,因为抓取的评分5分制分布比较集中,从而算法 提高了评分的重要性,削弱价格、销量的重要性(销量越高,增长一个级别体现的评价统计显著性越不重要,因为二八法则,以及很多消费者是都跟着销量买的,有叠加效应)

  优点就是,结果里商品很少有差评的,都是高分评价

  这样推荐的缺点是,可能会高估销量较少的商铺、新开商铺的商品质量。因为总的评价的人少,打分的体现的价值就不稳定,高分的偶然性也越大,不过是按照淘宝综合排序搜索前多少个满足的,销量还算是比较靠前的,只要不是那些市场份额很少商家也少的商品。另一个问题是 淘宝和天猫没有区分,淘宝的审查没有天猫的严格。

如要求条件为:

reserch_goods='ssd120g' #淘宝搜索词
price_min=22 #价格区间
price_max=400
descripHrequ=0 # % 默认高于average, 输出结果大于此值
servHrequ=0 # % 默认高于average, 输出结果大于此值
descripNrequ=6
counts=10 #要求选出多少个商品

结果显示在results文件里

打包发布的EXE体验版分享在链接:http://pan.baidu.com/s/1boXwjTH 密码:m32i

源代码如下:

 # -*- coding: utf-8 -*-
'''
author : willowj
http://www.cnblogs.com/willowj
注意robots 协议,别给网站带来较多负载
''' import urllib
import urllib2
import re
import time
import random
import os
from math import log
from math import log10
from math import sqrt
import sys '''在Python自己IDE上要注释掉一下两行'''
reload(sys)
sys.setdefaultencoding('utf8') # python2.x的的defaultencoding是ascii class counter(object):
#计数器
def __init__(self):
self.count = 0
self.try_time = 0
self.fail_time = 0
self.url_list = []
self.new_flag = True
self.results=[]
self.p=0
self.d=0 def print_counter(self):
print 'try_time:', self.try_time, " get_count:" , self.count, " fail_time:",self.fail_time counter1 = counter() def post_request(url):
'''
#使用代理
proxy = {'http':'27.24.158.155:84'}
proxy_support = urllib2.ProxyHandler(proxy)
# opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler(debuglevel=1))
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
''' #构造随机头部文件访问请求
User_Agents=["Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", #
"Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11O"
]
random_User_Agent = random.choice(User_Agents)
#print random_User_Agent req =urllib2.Request(url) #!! req.add_header("User-Agent",random_User_Agent)
req.add_header("GET",url)
req.add_header("Referer",url)
return req def recommend_rate(price,description,delivery,service,comments):
#描述为绝对值
av_p=counter1.p/counter1.count
av_d=counter1.d/counter1.count
rate=(description/av_d)**20*(description+delivery+service)*(av_p/(price))**0.1+log((comments+5),1000)
#print 'all count=',counter1.count
#print "avrage price=",av_p,';',av_p/(price),';price',price,';comments=',comments,';descrip=',description
#print 'rate=',rate,'(price)yinzi',(av_p/(price))**0.1,'descrip_yinzi',(description/av_d)**20,'comments_factor=',log((comments+50),100)
return rate def product_rank(list):
for x in list:
#0开始为 x0商品名 、x1图片链接、x2商品链接、x3价格、x4评论数、 x5店铺名、 x6快递情况、x7描述相符情况3个、x8服务情况
rate=recommend_rate(x[3],x[7],x[6],x[8],x[4])
x.append(rate) def get_user_rate(item_url):
#暂时未使用该功能
'''获取卖家信用情况;未登录情况不能访问,或者需要在头部文件中加入cookie。。。;'''
html=urllib2.urlopen(item_url)
#"//rate.taobao.com/user-rate-282f910f3b70f2128abd0ee9170e6428.htm"
regrex_rate='"(//.*?user\-rate.*?)"'
codes= re.findall(regrex_rate,html.read())
html.close() user_rate_url= 'http:'+codes[0]
print 'uu', user_rate_url user_rate_html = urllib2.urlopen(user_rate_url)
print user_rate_html.read()
#title="4.78589分"
desc_regex=u'title="(4.[0-9]{5}).*?'
de_pat=re.compile(desc_regex) descs = re.findall(de_pat,user_rate_html.read())
print len(descs)
item_url='https://item.taobao.com/item.htm?id=530635294653&ns=1&abbucket=0#detail'
#get_user_rate(item_url)
'''获取卖家信用情况;未登录情况不能访问。。。暂时 无用''' def makeNewdir(savePath):
while os.path.exists(savePath):
savePath = savePath+'%s'%random.randrange(1,10)
#print "the path exist,we'll make a new one"
try:
os.makedirs(savePath)
print 'ok,file_path we reserve results: %s'%savePath
print '保存的路径为:'.decode('utf-8')
except:
print "failed to make file path\nplease restart program"
print '创建文件夹失败,请重新启动程序'.decode('utf-8') def get_praised_good(url, file_open, keyword, counts, descripHrequ, servHrequ, descripNrequ):
#从给定的淘宝链接中 获取符合条件的商品list
html = urllib2.urlopen(post_request(url))
code = html.read()
html.close() regrex2=ur'raw_title":"(.*?)","pic_url":"(.*?)","detail_url":"(.*?)","view_price":"(.*?)".*?"comment_count":"(.*?)".*?"nick":"(.*?)".*?"delivery":\[(.*?),(.*?),(.*?)\],"description":\[(.*?),(.*?),(.*?)\],"service":\[(.*?),(.*?),(.*?)\]'
#每一个匹配项 返回 15个 字符串
#x[0]开始为 x0商品名 、x1图片链接、x2商品链接、x3价格、x4评论数、 x5店铺名、 x6快递情况3个、x9描述相符情况3个、x12服务情况3个
pat = re.compile(regrex2)
meet_code = re.findall(regrex2,code)# for x in meet_code:
if counter1.count>=counts :
print "have get enough pruducts"
break
description_higher=int(x[10])*float(x[11])/100
service_higher=int(x[13])*float(x[14])/100
try:
x4=int(x[4]) #description_count
except:
x4=0
if (description_higher>=descripHrequ) and (service_higher>=servHrequ) and x4>=descripNrequ:
if re.findall(keyword,x[0]) : # 中文keyword在结果中匹配问题暂时没有解决,,直接加在搜索词里吧
x0=x[0].replace(' ','').replace('/','')
detail_url='http:'+x[2].decode('unicode-escape').encode('utf-8')
x1='http:'+x[1].decode('unicode-escape').encode('utf-8')
#print type(x)
if detail_url in counter1.url_list:
counter1.new_flag=False
print 'no more new met products'
print counter1.url_list
print detail_url
break
counter1.url_list.append(detail_url)
counter1.try_time+=1
counter1.count+=1 x11=float(x[11])/100
x9=float(x[9])/100
x12=float(x[12])/100
x6=float(x[6])/100
x3=float(x[3])
counter1.p+=x3
counter1.d+=x9
x5=unicode(x[5],'utf-8') result_list=[]
result_list.append(x0)
result_list.append(x1)
result_list.append(detail_url)
result_list.append(x3)
result_list.append(x4)
result_list.append(x5)
result_list.append(x6)
result_list.append(x9)
result_list.append(x12)
#0开始为 x0商品名 、x1图片链接、x2商品链接、x3价格、x4评论数、 x5店铺名、 x6快递情况、x7描述相符情况、x8服务情况
counter1.results.append(result_list) def save_downpic(lis,file_open,savePath):
'''从商品list下载图片到reserve_file_path,并写入信息至fileopen'''
#0开始为 x0商品名 、x1图片链接、x2商品链接、x3价格、x4评论数、 x5店铺名、 x6快递情况、x7描述相符情况、x8服务情况、x9:rate
len_list=len(lis)
print len_list
cc=0
for x in lis:
try :
urllib.urlretrieve(x[1],savePath+'\\%s___'%cc +unicode(x[0],'utf-8')+'.jpg') txt_name = savePath+'\\'+ '%s__'%cc+ 'custome_description_%s __'%x[7] +'__comments_%s_'%x[4]+ '___price_%srmb___'%x[3] +x[5] +'.txt' file_o = open(txt_name,'a')
file_o.write(x[2])
file_o.close() print '\nget_one_possible_fine_goods:\n','good_name:',x[0].decode('utf-8')
print 'rate=',x[9]
print 'price:',x[3],x[5].decode('utf-8')
print 'custome_description:',x[7],'--','described_number:',x[4],' service:',x[8]
print x[2].decode('utf-8'),'\ngood_pic_url:',x[1].decode('utf-8') print txt_name
print cc+1,"th" file_open.write(u'%s__'%cc +u'%s'%x[0]+'\nprice:'+str(x[3])+'¥,'+'\n'+str(x[2])+' \n'+str(x[5])+'\ncustomer_description:'+str(x[7])+'described_number:'+str(x[4])+'\n\n\n') print 'get one -^-'
except :
print "failed to down picture or creat txt"
counter1.fail_time += 1
cc+=1
time.sleep(0.5) def get_all_praised_goods(serchProd,counts,savePath ,keyword, price_min=0,price_max=0,descripHrequ =0,servHrequ=0 ,descripNrequ=0):
#边里搜索结果每一页
#initial url and page number
initial_url='https://s.taobao.com/search?q='+serchProd
if price_min :
if price_min < price_max :
initial_url = initial_url+'&filter=reserve_price%5B'+'%s'%price_min+'%2C' +'%s'%price_max initial_url = initial_url +'%5D&s=' #tian_mall = 'https://list.tmall.com/search_product.htm?q=' print "initial_url",initial_url
page_n=0
reserve_file=savePath+r'\found_goods.txt'
file_open=open(reserve_file,'a') file_open.write('****************************\n')
file_open.write(time.ctime())
file_open.write('\n****************************\n') while counter1.new_flag and counter1.count<counts : url_1=initial_url+'%s'%(44*page_n)
#print initial_url
print 'url_1:', url_1
#print 'ss',initial_url+'%s'%(44*page_n)
page_n += 1 get_praised_good(url_1,file_open,keyword,counts,descripHrequ,servHrequ ,descripNrequ)
print "let web network rest for 2s lest make traffic jams "
time.sleep(2)
# except:
print "%s"%page_n,"pages have been searched"
if page_n >=11 :
print "check keyword,maybe too restrict"
break
print url_1
product_rank(counter1.results) counter1.results.sort(key=lambda x :x[9],reverse=True) save_downpic(counter1.results,file_open,savePath) #
for a in counter1.results:
for b in a :
file_open.write(unicode(str(b),'utf-8'))
file_open.write('\t')
file_open.write('\n\n') file_open.close()
counter1.print_counter() def main(serchProd):
''' 用户选择是否自定义要求,根据要求进行获取商品,并按推荐排序输出'''
if serchProd: print "if customise price_range ,decriptiom require .etc.\ninput Y/N \n default by : no price limit avarage than descriptiom,get 30 products \n 默认要求为:无价格限制,商品描述、快递、服务高于均值,获取30个商品。自定义要求请输入 ‘Y’ (区分大小写)".decode('utf-8')
if raw_input() == 'Y':
print "\nplease input _minimal price and _maximal price; \ndefault by 0,10000\nnext by 'enter'key input nothing means by default,the same below "
print '请输入价格范围 ;默认0-10000 ;两项用半角逗号","分隔 按回车键确认;什么也不输入代表使用默认值 '.decode('utf-8')
try:
price_min, price_max=input()
except:
print 'not input or wrong number,use default range'
price_min, price_max = 0 ,10000
#
# #
print "please input _keyword that goods name must include:\n(more than one keyword must use Regular Expression); default by no kewords"
try:
keyword=raw_input().decode("gbk").encode("utf-8") #个人限定词,商品名字必须包含,防止淘宝推荐了其他相关词 (正则表达式). 为任意表示不作限制
except:
keyword=''
# print "\nplease input _description_higher_percent_require and _service_higher__percent_require\n range:(-100,100) ; \ndefault by 0,0 I.e better than average"
print '请输入商品描述、服务高于平均值的百分比-100 ~100'.decode('utf-8')
# % 默认高于average, 输出结果大于此值
try:
descripHrequ,servHrequ=input()
except:
print 'not input or wrong number,use default range'
descripHrequ = 0 # % 默认高于average, 输出结果大于此值
servHrequ = 0 #
print "\nplease input description count limit, default more than 5\n" ,'输入最低商品评价数,默认大于5'.decode('utf-8')
try:
descripNrequ=input()
except :
print 'not input or wrong number,use default range'
descripNrequ=5
# # print "\nIF customise file reserve path, Y or N \ndefault/sample as: C:\\Users\\Administrator\\Desktop\\find_worthy_goods\\results "
# print '是否自定义保存文件目录 Y or N'.decode('utf-8')
# if raw_input()=='Y':
# print "please input path that you want to reserve; \n "
# savePath = raw_input()
# else:
# #savePath=r"C:\Users\Administrator\Desktop\find_worthy_goods\results"#结果保存路径
#
print "\nplease input how many results you want, default by 30\n" ,'您要获取的商品数目,默认30'.decode('utf-8')
try:
counts=input()
except :
counts=30
else :
counts =30
keyword = ''
price_min ,price_max ,descripHrequ ,servHrequ ,descripNrequ = 0,0,0,0,0 #
savePath='results'
makeNewdir(savePath) get_all_praised_goods(serchProd, counts, savePath, keyword, price_min ,price_max ,descripHrequ ,servHrequ ,descripNrequ) print '\n'
counter1.print_counter()
print "finished,please look up in %s"%savePath
print '下载完成'.decode('utf-8') input()
else:
print "no search goods,please restart"
print '没有输入商品名称,请重新启动程序'.decode('utf-8') def input_para_inner():
serchProd='ssd120g' #淘宝搜索词
keyword='非240' #raw_input().decode("gbk").encode("utf-8") #个人限定词,商品名字必须包含,防止淘宝推荐了其他相关词 (正则表达式). 为任意表示不作限制
price_min=22 #价格区间
price_max=400
descripHrequ=0 # % 默认高于average, 输出结果大于此值
servHrequ=0 # % 默认高于average, 输出结果大于此值
descripNrequ=6
counts=10
#要求选出多少个商品
#savePath=r"C:\Users\Administrator\Desktop\Python scrapy\find_worthy_goods\results"#结果保存路径
savePath=r"results" #结果保存路径
makeNewdir(savePath) get_all_praised_goods(serchProd, counts, savePath, keyword, price_min, price_max ,descripHrequ ,servHrequ ,descripNrequ) if __name__=="__main__" :
x = 2
if x==1:
input_para_inner() #自己在源代码中输入 筛选要求
else:
print '说明:\n本程序用于在淘宝上搜索商品时主动通过 价格范围、商品描述、服务态度、评论数来筛选商品;\n筛选出来的商品图片下载保存到磁盘(默认桌面新建find_worty_goods文件夹)并建立同序号开头的txt文件,图片显示商品,其旁的txt文件名显示价格等关键信息,txt里保存商品的淘宝链接'.decode('utf-8')
print "please input reserch _goods_name"
serchProd=raw_input().replace(' ','') #淘宝搜索词 ,并去除中间意外输入的空格
main(serchProd) #保存图片,以文件名为商品图片名字,并以序号开头
#同时,输出 价格、商家名,商品描述、服务等 到 txt文本
#在商品图片看中后,便可按序号查找
#按描述、服务评价高于平均,购物体验应该可以的

预计可添加功能:

  交互界面

  MySQL的数据存储,以实现价格变动的比较

python推荐淘宝物美价廉商品的更多相关文章

  1. python推荐淘宝物美价廉商品 2.0

    改动: 新增功能 :可选择只看天猫或淘宝 代码模块化封装,参数配置或输入单独在一个py文件管理,主函数功能只留出参数传入在setting配置的py文件里. main.py代码: # -*- codin ...

  2. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  3. python爬虫-淘宝商品密码(图文教程附源码)

    今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...

  4. 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...

  5. python课件-淘宝-目录.txt

    卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python课件-淘宝-目录.txt│ ├─01python核心编程阶段-linux基础(│ linux_h ...

  6. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  7. iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页

      公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...

  8. selenium+PhantomJS 抓取淘宝搜索商品

    最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...

  9. Python网页信息采集:使用PhantomJS采集淘宝天猫商品内容

    1,引言 最近一直在看Scrapy 爬虫框架,并尝试使用Scrapy框架写一个可以实现网页信息采集的简单的小程序.尝试过程中遇到了很多小问题,希望大家多多指教. 本文主要介绍如何使用Scrapy结合P ...

随机推荐

  1. 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...

  2. 支付宝web支付

    过程 1. 用户下单 2. 商户后台产生订单 3. 请求支付宝web支付页面(将订单信息返回给用户---放在form里面---隐藏起来-----并通过脚本自动提交此form到支付宝web支付页) 4. ...

  3. DDD设计中的Unitwork与DomainEvent如何相容?

    最近在开发过程中,遇到了一个场景,甚是棘手,在这里分享一下.希望大家脑洞大开一起来想一下解决思路.鄙人也想了一个方案拿出来和大家一起探讨一下是否合理. 一.简单介绍一下涉及的对象概念 工作单元:维护变 ...

  4. Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇

    目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...

  5. Fedora 21 安装 Nvidia 驱动以及失败后的补救方法

    在 Linux 桌面系统下玩了这么久,大部分时间都是使用 Ubuntu,偶尔使用一下 Fedora.我的电脑中安装有多个 Linux 发行版,见这里<在同一个硬盘上安装多个Linux发行版及Fe ...

  6. WebEssentials 在vs2013 update5安装报错的解决方法.

    WebEssentials 最高支持到update4 如果更新到了update5 RC, 则无法直接安装. 解决方法是 1,下载WebEssentials2013.vsix 文件. 2, 安装7zip ...

  7. 关于apue.3e中apue.h的使用

    关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...

  8. BootStrap_03之组件(手风琴、导航)

    1.BootStrap组件--按钮组: .btn-group>.btn*5: .btn-group-justified: .btn-group-lg/sm/xs: .btn-group-vert ...

  9. lr文件下载脚本(文件参数化重命名)

    http://wenku.baidu.com/link?url=6oiIadyF9eFS4VshKbfJDnxrBh2IX919ndi0JO8yoqTRNRNIpavFrZJ9LPVb-FBSfbRY ...

  10. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...