Subversion Repositories SmartDukaan

Rev

Rev 14205 | Rev 14207 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13829 kshitij.so 1
import urllib2
2
import simplejson as json
3
import pymongo
4
from dtr.utils.utils import to_java_date
13918 kshitij.so 5
from datetime import datetime, timedelta
13829 kshitij.so 6
from operator import itemgetter
7
from dtr.utils.AmazonPriceOnlyScraper import AmazonScraper
14121 kshitij.so 8
from dtr.utils import FlipkartScraper,NewFlipkartScraper
13829 kshitij.so 9
 
10
con = None
14205 kshitij.so 11
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4}
13829 kshitij.so 12
 
13
headers = { 
14
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
15
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
16
            'Accept-Language' : 'en-US,en;q=0.8',                     
17
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
18
        }
19
 
20
def get_mongo_connection(host='localhost', port=27017):
21
    global con
22
    if con is None:
23
        print "Establishing connection %s host and port %d" %(host,port)
24
        try:
25
            con = pymongo.MongoClient(host, port)
26
        except Exception, e:
27
            print e
28
            return None
29
    return con
30
 
31
def returnLatestPrice(data, source_id):
13918 kshitij.so 32
    now = datetime.now()
13829 kshitij.so 33
    if source_id == 1:
34
        try:
13918 kshitij.so 35
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 36
                return {}
13918 kshitij.so 37
 
38
            try:
13975 kshitij.so 39
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 40
                    print "sku id is already updated",data['_id'] 
13920 kshitij.so 41
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':1,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13918 kshitij.so 42
            except:
43
                pass
44
 
45
 
13829 kshitij.so 46
            url = "http://www.amazon.in/gp/offer-listing/%s/ref=olp_sort_ps"%(data['identifier'])
47
            lowestPrice = 0.0
14189 kshitij.so 48
            scraperAmazon = AmazonScraper()
13829 kshitij.so 49
            lowestPrice = scraperAmazon.read(url)
13929 kshitij.so 50
            print "LowestPrice ",lowestPrice
13829 kshitij.so 51
            inStock = 0
52
            if lowestPrice > 0:
53
                inStock = 1
54
            if lowestPrice > 0:
13971 kshitij.so 55
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
13918 kshitij.so 56
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 57
            else:
13929 kshitij.so 58
                lowestPrice = data['available_price']
13977 kshitij.so 59
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':0,'priceUpdatedOn':to_java_date(now)}}, multi=True)
13918 kshitij.so 60
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0}}, multi=True)
61
 
62
            try:    
63
                recomputeDeal(data['skuBundleId'])
64
            except:
65
                print "Unable to compute deal for ",data['skuBundleId']
66
 
13829 kshitij.so 67
            return {'_id':data['_id'],'available_price':lowestPrice,'in_stock':inStock,'source_id':1,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
68
        except:
13920 kshitij.so 69
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':1,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13829 kshitij.so 70
 
14203 kshitij.so 71
    elif source_id ==4:
72
        try:
73
            if data['identifier'] is None or len(data['identifier'].strip())==0:
74
                return {}
75
 
76
            try:
77
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
78
                    print "sku id is already updated",data['_id'] 
79
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':4,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
80
            except:
81
                pass
82
 
83
            url = "http://109.74.200.220:8080/mobileapi/dtr-pricing?id=%s"%(data['identifier'])
84
            lowestPrice = 0.0
85
            instock = 0
86
            req = urllib2.Request(url,headers=headers)
87
            response = urllib2.urlopen(req)
14205 kshitij.so 88
            print response.read()
14203 kshitij.so 89
            response.close()
90
            json_input = response.read()
91
            priceInfo = json.loads(json_input)
14206 kshitij.so 92
            print priceInfo
14203 kshitij.so 93
            lowestPrice = priceInfo['response']['sellingPrice']
14205 kshitij.so 94
            print "*****"
95
            print lowestPrice
96
            print instock
14203 kshitij.so 97
            if lowestPrice > 0:
98
                instock = 1
99
            if instock  == 1:
100
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
101
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':inStock}}, multi=True)
102
            else:
103
                lowestPrice = data['available_price']
104
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now)}}, multi=True)
105
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
106
 
107
            try:    
108
                recomputeDeal(data['skuBundleId'])
109
            except:
110
                print "Unable to compute deal for ",data['skuBundleId']
111
 
112
            return {'_id':data['_id'],'available_price':lowestPrice,'in_stock':inStock,'source_id':4,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
14206 kshitij.so 113
        except Exception as e:
114
            print e
14203 kshitij.so 115
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':4,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
116
 
117
 
118
 
119
 
120
 
121
 
13829 kshitij.so 122
    elif source_id ==3:
123
        try:
13918 kshitij.so 124
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 125
                return {}
13918 kshitij.so 126
 
127
            try:
13975 kshitij.so 128
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13920 kshitij.so 129
                    print "sku id is already updated",data['_id']
130
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':3,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13919 kshitij.so 131
 
132
            except Exception as e:
13920 kshitij.so 133
                print "Exception snapdeal"
13919 kshitij.so 134
                print e
13918 kshitij.so 135
                pass
136
 
137
 
13829 kshitij.so 138
            url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=175&sort=sellingPrice"%(data['identifier'])
139
            req = urllib2.Request(url,headers=headers)
140
            response = urllib2.urlopen(req)
14188 kshitij.so 141
            response.close()
13829 kshitij.so 142
            json_input = response.read()
143
            vendorInfo = json.loads(json_input)
144
            lowestOfferPrice = 0
145
            inStock = 0
146
            for vendor in vendorInfo:
147
                lowestOfferPrice = float(vendor['sellingPrice'])
148
                stock = vendor['buyableInventory']
149
                if stock > 0 and lowestOfferPrice > 0:
150
                    inStock = 1
151
                    break
152
 
153
            print lowestOfferPrice
154
            print inStock
155
            print "*************"
156
            if inStock  == 1:
13971 kshitij.so 157
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
13918 kshitij.so 158
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 159
            else:
13929 kshitij.so 160
                lowestOfferPrice = data['available_price']
13977 kshitij.so 161
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now)}}, multi=True)
13918 kshitij.so 162
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
163
 
164
            try:    
165
                recomputeDeal(data['skuBundleId'])
166
            except:
167
                print "Unable to compute deal for ",data['skuBundleId']
168
 
13829 kshitij.so 169
            return {'_id':data['_id'],'available_price':lowestOfferPrice,'in_stock':inStock,'source_id':3,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
170
        except:
13920 kshitij.so 171
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':3,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13829 kshitij.so 172
 
173
    elif source_id == 2:
174
        try:
13918 kshitij.so 175
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 176
                return {}
13918 kshitij.so 177
 
178
            try:
13975 kshitij.so 179
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 180
                    print "sku id is already updated",data['_id']
13920 kshitij.so 181
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':2,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']} 
13918 kshitij.so 182
            except:
183
                pass
184
 
185
            lowestSp = 0
186
            inStock = 0
14189 kshitij.so 187
            scraperProductPage = NewFlipkartScraper.FlipkartProductPageScraper()
14121 kshitij.so 188
            try:
189
                if data['marketPlaceUrl']!="" or data['marketPlaceUrl'] !="http://www.flipkart.com/ps/%s"%(data['identifier']):
190
                    result = scraperProductPage.read(data['marketPlaceUrl'])
14124 kshitij.so 191
                    print result
14125 kshitij.so 192
                    if result.get('lowestSp')!=0:
193
                        lowestSp = result.get('lowestSp')
14121 kshitij.so 194
                        inStock = result.get('inStock')
195
            except:
196
                print "Unable to scrape product page ",data['identifier']
197
            if lowestSp ==0:
198
                url = "http://www.flipkart.com/ps/%s"%(data['identifier'])
14189 kshitij.so 199
                scraperFk = FlipkartScraper.FlipkartScraper()
14121 kshitij.so 200
                vendorsData = scraperFk.read(url)
201
                sortedVendorsData = []
202
                sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
203
                print "data",sortedVendorsData
204
                for vData in sortedVendorsData:
205
                    lowestSp = vData['sellingPrice']
206
                    break
207
                if lowestSp > 0:
208
                    inStock = 1
13829 kshitij.so 209
            print lowestSp
210
            print inStock
211
            if lowestSp > 0:
13971 kshitij.so 212
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestSp,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
13918 kshitij.so 213
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestSp , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 214
            else:
13929 kshitij.so 215
                lowestSp = data['available_price']
13977 kshitij.so 216
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now)}}, multi=True)
13918 kshitij.so 217
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
218
 
219
 
220
            try:    
221
                recomputeDeal(data['skuBundleId'])
222
            except:
223
                print "Unable to compute deal for ",data['skuBundleId']
224
 
13829 kshitij.so 225
            return {'_id':data['_id'],'available_price':lowestSp,'in_stock':inStock,'source_id':2,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
226
        except:
13920 kshitij.so 227
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':2,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13829 kshitij.so 228
    else:
229
        return {}
230
 
13918 kshitij.so 231
 
232
def recomputeDeal(skuBundleId):
233
    """Lets recompute deal for this bundle"""
234
    print "Recomputing for bundleId",skuBundleId
13829 kshitij.so 235
 
13918 kshitij.so 236
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
237
    bestPrice = float("inf")
238
    bestOne = None
239
    bestSellerPoints = 0
240
    toUpdate = []
241
    for similarItem in similarItems:
13971 kshitij.so 242
        if similarItem['in_stock'] == 0 or similarItem['maxprice'] is None or similarItem['maxprice'] < similarItem['available_price']:
13918 kshitij.so 243
            get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0 }})
244
            continue
245
        if similarItem['available_price'] < bestPrice:
246
            bestOne = similarItem
247
            bestPrice = similarItem['available_price']
248
            bestSellerPoints = similarItem['bestSellerPoints']
249
        elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
250
            bestOne = similarItem
251
            bestPrice = similarItem['available_price']
252
            bestSellerPoints = similarItem['bestSellerPoints']
253
        else:
254
            pass
255
    if bestOne is not None:
256
        for similarItem in similarItems:
257
            toUpdate.append(similarItem['_id'])
258
        toUpdate.remove(bestOne['_id'])
259
        get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1 }})
260
    if len(toUpdate) > 0:
261
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0 }},upsert=False, multi=True)
13829 kshitij.so 262
 
263
def getLatestPrice(skuBundleId, source_id):
264
    temp = []
265
    itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId,'source_id' : source_id}))
266
    for item in itemIds:
267
        temp.append(returnLatestPrice(item, source_id))
268
    return temp
269
 
13864 kshitij.so 270
def getLatestPriceById(id):
271
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':id}))
13866 kshitij.so 272
    return returnLatestPrice(item[0], item[0]['source_id'])
13829 kshitij.so 273
 
274
 
275
def main():
13929 kshitij.so 276
    print getLatestPriceById(8850)
13829 kshitij.so 277
 
278
if __name__=='__main__':
13971 kshitij.so 279
    main()
280
 
281
"""21.06$"""