Subversion Repositories SmartDukaan

Rev

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