Subversion Repositories SmartDukaan

Rev

Rev 13569 | Rev 13582 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 13569 Rev 13576
Line 1... Line 1...
1
'''
1
'''
2
Created on Jan 15, 2015
2
Created on Jan 15, 2015
3
 
3
 
4
@author: amit
4
@author: amit
5
'''
5
'''
-
 
6
from BeautifulSoup import BeautifulSoup
6
from bson.binary import Binary
7
from bson.binary import Binary
7
from dtr import main
8
from dtr import main
8
from dtr.dao import AffiliateInfo
9
from dtr.dao import AffiliateInfo, Order, SubOrder
9
from dtr.main import getBrowserObject, ScrapeException, getStore, ParseException
10
from dtr.main import getBrowserObject, ScrapeException, getStore, ParseException
10
from pymongo import MongoClient
11
from pymongo import MongoClient
11
from  BeautifulSoup import BeautifulSoup
-
 
12
import datetime
12
import datetime
13
import json
13
import json
14
import mechanize
-
 
15
import pymongo
14
import pymongo
16
import re
15
import re
17
import urllib
16
import urllib
18
import soupselect;soupselect.monkeypatch()
17
from pprint import pprint
19
 
-
 
20
USERNAME='saholic1@gmail.com'
18
USERNAME='saholic1@gmail.com'
21
PASSWORD='spice@2020'
19
PASSWORD='spice@2020'
22
AFFILIATE_URL='http://affiliate.snapdeal.com'
20
AFFILIATE_URL='http://affiliate.snapdeal.com'
23
POST_URL='https://api-p03.hasoffers.com/v3/Affiliate_Report.json'
21
POST_URL='https://api-p03.hasoffers.com/v3/Affiliate_Report.json'
24
ORDER_TRACK_URL='https://m.snapdeal.com/orderSummary'
22
ORDER_TRACK_URL='https://m.snapdeal.com/orderSummary'
Line 38... Line 36...
38
                      main.Store.ORDER_SHIPPED : ['In Transit'],
36
                      main.Store.ORDER_SHIPPED : ['In Transit'],
39
                      main.Store.ORDER_CANCELLED : ['Closed For Vendor Reallocation']
37
                      main.Store.ORDER_CANCELLED : ['Closed For Vendor Reallocation']
40
                      
38
                      
41
                      }
39
                      }
42
    def __init__(self,store_id):
40
    def __init__(self,store_id):
-
 
41
        client = MongoClient('mongodb://localhost:27017/')
-
 
42
        self.db = client.dtr
43
        super(Store, self).__init__(store_id)
43
        super(Store, self).__init__(store_id)
44
 
44
 
45
    def getName(self):
45
    def getName(self):
46
        return "snapdeal"
46
        return "snapdeal"
47
    
47
    
Line 60... Line 60...
60
        
60
        
61
        allPyOffers = [self.covertToObj(offer).__dict__ for offer in allOffers]
61
        allPyOffers = [self.covertToObj(offer).__dict__ for offer in allOffers]
62
        self._saveToAffiliate(allPyOffers)
62
        self._saveToAffiliate(allPyOffers)
63
    
63
    
64
    
64
    
65
    def parseOrderPage(self, htmlString=None): 
-
 
66
        raise NotImplementedError
-
 
67
 
-
 
68
 
-
 
69
    def parseOrderRawHtml(self, orderId, subtagId, userId, rawHtml, orderSuccessUrl):
65
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
70
        br = getBrowserObject()
66
        br = getBrowserObject()
71
        url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
67
        url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
72
        print url
-
 
73
        response = br.open(url)
68
        response = br.open(url)
74
        page = ungzipResponse(response, br)
69
        page = ungzipResponse(response, br)
75
        #page=page.decode("utf-8")
70
        #page=page.decode("utf-8")
76
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
71
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
77
        #orderHead = soup.find(name, attrs, recursive, text)
72
        #orderHead = soup.find(name, attrs, recursive, text)
Line 87... Line 82...
87
        #Pop two section elements
82
        #Pop two section elements
88
        sections.pop(0) 
83
        sections.pop(0) 
89
        sections.pop(0)
84
        sections.pop(0)
90
        subOrders = sections
85
        subOrders = sections
91
        
86
        
92
        merchantOrder = {}
87
         
93
        merchantSubOrders = []
88
        merchantSubOrders = []
94
        merchantOrder["_id"] = orderId
-
 
95
        merchantOrder["userId"] = userId
-
 
-
 
89
 
96
        merchantOrder['subTagId'] = subtagId
90
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
97
        merchantOrder['merchantOderId'] = re.findall(r'\d+', str(soup.find("div", {"class":"deals_heading"})))[1] 
91
        merchantOrder.merchantOderId = re.findall(r'\d+', str(soup.find("div", {"class":"deals_heading"})))[1]
98
        merchantOrder['placedOn'] = placedOn
-
 
99
        for orderTr in orderTrs:
92
        for orderTr in orderTrs:
100
            orderTrString = str(orderTr)
93
            orderTrString = str(orderTr)
101
            if "Total Amount" in orderTrString:
94
            if "Total Amount" in orderTrString:
102
                merchantOrder['totalAmount'] = re.findall(r'\d+', orderTrString)[0]
95
                merchantOrder.totalAmount = re.findall(r'\d+', orderTrString)[0]
103
            elif "Delivery Charges" in orderTrString:
96
            elif "Delivery Charges" in orderTrString:
104
                merchantOrder['deliveryCharges'] = re.findall(r'\d+', orderTrString)[0]
97
                merchantOrder.deliveryCharges = re.findall(r'\d+', orderTrString)[0]
105
            elif "Discount Applied" in orderTrString:
98
            elif "Discount Applied" in orderTrString:
106
                merchantOrder['discountApplied'] = re.findall(r'\d+', orderTrString)[0]
99
                merchantOrder.discountApplied = re.findall(r'\d+', orderTrString)[0]
107
            elif "Paid Amount" in orderTrString:
100
            elif "Paid Amount" in orderTrString:
108
                merchantOrder['paidAmount'] = re.findall(r'\d+', orderTrString)[0]
101
                merchantOrder.paidAmount = re.findall(r'\d+', orderTrString)[0]
109
 
102
 
110
        merchantOrder['closed'] = False        
-
 
111
        
-
 
112
        for subOrderElement in subOrders:
103
        for subOrderElement in subOrders:
113
            productUrl = str(subOrderElement.find("a")['href'])
104
            productUrl = str(subOrderElement.find("a")['href'])
114
            subTable = subOrderElement.find("table", {"class":"lrPad"})
105
            subTable = subOrderElement.find("table", {"class":"lrPad"})
115
            subTrs = subTable.findAll("tr")
106
            subTrs = subTable.findAll("tr")
116
            unitPrice=None
107
            unitPrice=None
Line 133... Line 124...
133
            divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
124
            divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
134
            if len(divs)<=0:
125
            if len(divs)<=0:
135
                raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
126
                raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
136
            
127
            
137
            for div in divs:
128
            for div in divs:
138
                merchantSubOrder = {}
-
 
139
                merchantSubOrder['placedOn'] = placedOn
-
 
140
                merchantSubOrder['productTitle'] = str(subOrderElement.find("a").text)
129
                productTitle = str(subOrderElement.find("a").text)
141
                merchantSubOrder['productUrl'] = "http://m.snapdeal.com/" + productUrl 
130
                productUrl = "http://m.snapdeal.com/" + productUrl 
142
                merchantSubOrder['productCode'] = re.findall(r'\d+$', productUrl)[0]
131
                subOrder = SubOrder(productTitle, productUrl, placedOn, amountPaid)
143
                merchantSubOrder['quantity'] =   1                
-
 
144
                merchantSubOrder['status'] = 'Order Placed'
-
 
-
 
132
 
145
                merchantSubOrder['amountPaid'] = amountPaid
133
                subOrder.amountPaid = amountPaid
146
                merchantSubOrder['deliveryCharges'] = deliveryCharges
134
                subOrder.deliveryCharges = deliveryCharges
147
                merchantSubOrder['offerDiscount'] = offerDiscount
135
                subOrder.offerDiscount = offerDiscount
148
                merchantSubOrder['unitPrice'] = unitPrice
136
                subOrder.unitPrice = unitPrice
-
 
137
                subOrder.productCode = re.findall(r'\d+$', productUrl)[0]
149
                
138
                
150
                trackAnchor = div.find("a")   
139
                trackAnchor = div.find("a")   
151
                if trackAnchor is not None:
140
                if trackAnchor is not None:
152
                    merchantSubOrder['tracingkUrl'] = str(trackAnchor['href'])
141
                    subOrder.tracingkUrl = str(trackAnchor['href'])
153
                
142
                
154
                divStr = str(div)
143
                divStr = str(div)
155
                divStr = divStr.replace("\n","").replace("\t", "")
144
                divStr = divStr.replace("\n","").replace("\t", "")
156
                
145
                
157
                for line in divStr.split("<br />"):
146
                for line in divStr.split("<br />"):
158
                    if "Suborder ID" in line:
147
                    if "Suborder ID" in line:
159
                        merchantSubOrder['merchantSubOrderId'] = re.findall(r'\d+', line)[0]   
148
                        subOrder.merchantSubOrderId = re.findall(r'\d+', line)[0]   
160
                    elif "Status" in line:
149
                    elif "Status" in line:
161
                        merchantSubOrder['detailedStatus'] = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
150
                        subOrder.detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
162
                    elif "Est. Shipping Date" in line:
151
                    elif "Est. Shipping Date" in line:
163
                        merchantSubOrder['estimatedShippingDate'] = line.split(":")[1].strip()
152
                        subOrder.estimatedShippingDate = line.split(":")[1].strip()
164
                    elif "Est. Delivery Date" in line:
153
                    elif "Est. Delivery Date" in line:
165
                        merchantSubOrder['estimatedDeliveryDate'] = line.split(":")[1].strip()
154
                        subOrder.estimatedDeliveryDate = line.split(":")[1].strip()
166
                    elif "Courier Name" in line:
155
                    elif "Courier Name" in line:
167
                        merchantSubOrder['courierName'] = line.split(":")[1].strip()
156
                        subOrder.courierName = line.split(":")[1].strip()
168
                    elif "Tracking No" in line:
157
                    elif "Tracking No" in line:
169
                        merchantSubOrder['trackingNumber'] = line.split(":")[1].strip()
158
                        subOrder.trackingNumber = line.split(":")[1].strip()
170
                           
159
                           
171
            merchantSubOrders.append(merchantSubOrder)   
160
            merchantSubOrders.append(subOrder)   
-
 
161
        
-
 
162
        merchantOrder.subOrders = merchantSubOrders
-
 
163
        #print merchantOrder
-
 
164
        
-
 
165
        self._saveToOrder(todict(merchantOrder))
172
        
166
        
173
        merchantOrder['subOrders'] = merchantSubOrders
-
 
174
        print merchantOrder
-
 
175
        #soup = BeautifulSoup(rawHtml,convertEntities=BeautifulSoup.HTML_ENTITIES)
167
        #soup = BeautifulSoup(rawHtml,convertEntities=BeautifulSoup.HTML_ENTITIES)
176
        #soup.find(name, attrs, recursive, text)
168
        #soup.find(name, attrs, recursive, text)
177
    
169
    
178
    
170
                      
179
    
171
 
-
 
172
    def _getStatusFromDetailedStatus(self, detailedStatus):
-
 
173
        for key, value in Store.OrderStatusMap.iteritems():
-
 
174
            if detailedStatus in value:
180
    
175
                return key
-
 
176
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
181
    
177
    
182
    def scrapeStoreOrders(self,):
178
    def scrapeStoreOrders(self,):
-
 
179
        orders = self._getActiveOrders()
-
 
180
        br = getBrowserObject()
183
        
181
        for order in orders:
-
 
182
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', order['orderSuccessUrl'],re.IGNORECASE)[0]
-
 
183
            response = br.open(url)
-
 
184
            page = ungzipResponse(response, br)
-
 
185
            #page=page.decode("utf-8")
-
 
186
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
-
 
187
            sections = soup.findAll("section")
184
        pass
188
            sections.pop(0)
185
    
189
            sections.pop(0)
186
    
190
            
-
 
191
            subOrders = sections
-
 
192
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
-
 
193
            for subOrderElement in subOrders:
-
 
194
                closed = True
-
 
195
                divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
-
 
196
                if len(divs)<=0:
-
 
197
                    raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
187
    
198
                
-
 
199
                for div in divs:
-
 
200
                    trackAnchor = div.find("a")   
-
 
201
                    if trackAnchor is not None:
-
 
202
                        tracingkUrl = str(trackAnchor['href'])
188
    
203
                    
-
 
204
                    divStr = str(div)
-
 
205
                    divStr = divStr.replace("\n","").replace("\t", "")
-
 
206
                    updateMap = {}
-
 
207
                    for line in divStr.split("<br />"):
-
 
208
                        if "Suborder ID" in line:
-
 
209
                            merchantSubOrderId = re.findall(r'\d+', line)[0]   
-
 
210
                            findMap = {"id": order['id'], "subOrders.merchantSubOrderId": merchantSubOrderId}
-
 
211
                        elif "Status" in line:
-
 
212
                            detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
-
 
213
                            detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
-
 
214
                            updateMap["subOrders.$.detailedStatus"] = detailedStatus
-
 
215
                            status = self._getStatusFromDetailedStatus(detailedStatus) 
-
 
216
                            if closed:
-
 
217
                                closed = status in [Store.ORDER_PLACED, Store.ORDER_CANCELLED]
-
 
218
                        elif "Est. Shipping Date" in line:
-
 
219
                            estimatedShippingDate = line.split(":")[1].strip()
-
 
220
                            updateMap["subOrders.$.estimatedShippingDate"] = estimatedShippingDate
-
 
221
                        elif "Est. Delivery Date" in line:
-
 
222
                            estimatedDeliveryDate = line.split(":")[1].strip()
-
 
223
                            updateMap["subOrders.$.estimatedDeliveryDate"] = estimatedDeliveryDate
-
 
224
                        elif "Courier Name" in line:
-
 
225
                            courierName = line.split(":")[1].strip()
-
 
226
                            updateMap["subOrders.$.courierName"] = courierName
-
 
227
                        elif "Tracking No" in line:
-
 
228
                            trackingNumber = line.split(":")[1].strip()
-
 
229
                            updateMap["subOrders.$.trackingNumber"] = trackingNumber
189
    
230
                            
-
 
231
                    updateMap["subOrders.$.closed"] = closed
-
 
232
                    bulk.find(findMap).update({'$set' : updateMap})
-
 
233
            result = bulk.execute()
-
 
234
            pprint(result)        
190
    
235
            
191
    """
236
    """
192
    This will insert records with changes only 
237
    This will insert records with changes only 
193
    """
238
    """
-
 
239
    
-
 
240
    def _getActiveOrders(self):
-
 
241
        collection = self.db.merchantOrder
-
 
242
        stores = collection.find({"closed": False, "storeId" : self.store_id}, {"orderSuccessUrl":1, "id":1})
-
 
243
        return [store for store in stores]
-
 
244
        
-
 
245
        
-
 
246
        
194
    def _saveToAffiliate(self, offers):
247
    def _saveToAffiliate(self, offers):
195
        client = MongoClient('mongodb://localhost:27017/')
-
 
196
        db = client.dtr
-
 
197
        collection = db.snapdealOrderAffiliateInfo
248
        collection = self.db.snapdealOrderAffiliateInfo
198
        try:
249
        try:
199
            collection.insert(offers,continue_on_error=True)
250
            collection.insert(offers,continue_on_error=True)
200
        except pymongo.errors.DuplicateKeyError as e:
251
        except pymongo.errors.DuplicateKeyError as e:
201
            print e.details
252
            print e.details
202
            
253
            
-
 
254
    def _saveToOrder(self, order):
-
 
255
        collection = self.db.merchantOrder
-
 
256
        try:
-
 
257
            order = collection.insert(order)
-
 
258
            #merchantOder 
-
 
259
        except Exception as e:
-
 
260
            print todict(e)
203
    
261
    
204
    def _getAllOffers(self, br, token):
262
    def _getAllOffers(self, br, token):
205
        allOffers = []
263
        allOffers = []
206
        nextPage = 1  
264
        nextPage = 1  
207
        while True:
265
        while True:
Line 252... Line 310...
252
    )
310
    )
253
    #Encode the parameters
311
    #Encode the parameters
254
    return urllib.urlencode(parameters)
312
    return urllib.urlencode(parameters)
255
 
313
 
256
def main():
314
def main():
257
    print "hello"
-
 
258
    store = getStore(3)
315
    store = getStore(3)
-
 
316
    store.scrapeStoreOrders()
259
    #store.scrapeAffiliate()
317
    #store.scrapeAffiliate()
260
    #with open ("data.txt", "r") as myfile:
318
    #with open ("data.txt", "r") as myfile:
261
    #    data=myfile.read()
319
    #    data=myfile.read()
262
    #    myfile.close()
320
    #    myfile.close()
263
    
321
    
264
    store.parseOrderRawHtml(12345, "subtagId", 122323,  "html", 'https://m.snapdeal.com/purchaseMobileComplete?code=1f4166d13ea799b65aa9dea68b3e9e70&order=4509499363')
322
    #store.parseOrderRawHtml(12345, "subtagId", 122323,  "html", 'https://m.snapdeal.com/purchaseMobileComplete?code=1f4166d13ea799b65aa9dea68b3e9e70&order=4509499363')
265
 
323
 
266
def ungzipResponse(r,b):
324
def ungzipResponse(r,b):
267
    headers = r.info()
325
    headers = r.info()
268
    if headers['Content-Encoding']=='gzip':
326
    if headers['Content-Encoding']=='gzip':
269
        import gzip
327
        import gzip
Line 275... Line 333...
275
        gz.close()
333
        gz.close()
276
        return html
334
        return html
277
 
335
 
278
if __name__ == '__main__':
336
if __name__ == '__main__':
279
    main()
337
    main()
-
 
338
 
-
 
339
def todict(obj, classkey=None):
-
 
340
    if isinstance(obj, dict):
-
 
341
        data = {}
-
 
342
        for (k, v) in obj.items():
-
 
343
            data[k] = todict(v, classkey)
-
 
344
        return data
-
 
345
    elif hasattr(obj, "_ast"):
-
 
346
        return todict(obj._ast())
-
 
347
    elif hasattr(obj, "__iter__"):
-
 
348
        return [todict(v, classkey) for v in obj]
-
 
349
    elif hasattr(obj, "__dict__"):
-
 
350
        data = dict([(key, todict(value, classkey)) 
-
 
351
            for key, value in obj.__dict__.iteritems() 
-
 
352
            if not callable(value) and not key.startswith('_')])
-
 
353
        if classkey is not None and hasattr(obj, "__class__"):
-
 
354
            data[classkey] = obj.__class__.__name__
-
 
355
        return data
-
 
356
    else:
-
 
357
        return obj