Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
12256 kshitij.so 1
from elixir import session
12268 kshitij.so 2
from shop2020.config.client.ConfigClient import ConfigClient
12256 kshitij.so 3
from sqlalchemy.sql import asc
4
from sqlalchemy.sql.expression import or_
5
from shop2020.utils.daemon import Daemon
6
import optparse
7
import sys
8
import mechanize
9
import time
10
from shop2020.model.v1.catalog.impl import DataService
12297 kshitij.so 11
from shop2020.model.v1.catalog.impl.DataService import CompetitorPricing, CompetitorPricingRequest
12272 kshitij.so 12
import gc 
12256 kshitij.so 13
 
12268 kshitij.so 14
config_client = ConfigClient()
15
host = config_client.get_property('staging_hostname')
16
DataService.initialize(db_hostname=host)
12256 kshitij.so 17
 
18
class CompetitorScraping(Daemon):
19
    def __init__(self, logfile='/var/log/services/competitorScraping.log', pidfile='/var/run/competitor-scraper.pid'):
20
        Daemon.__init__(self, pidfile, stdout=logfile, stderr=logfile)
21
 
22
    def run(self):
23
        start()
24
 
25
def start():
26
    try:
27
        while True:
28
            requests = session.query(CompetitorPricingRequest).filter(or_(CompetitorPricingRequest.isProcessed==False,CompetitorPricingRequest.isProcessed==None)).order_by(asc(CompetitorPricingRequest.requestId)).all()
29
            if requests ==[] or requests is None:
30
                print "No new request to process, sleeeeeeping....."
12281 kshitij.so 31
                close_session()
32
                collected = gc.collect()
12292 kshitij.so 33
                print locals()
34
                print globals()
12281 kshitij.so 35
                print "Garbage collector: collected %d objects." % (collected)
12256 kshitij.so 36
                time.sleep(600)
37
            for request in requests:
38
                fetchDetails(request)
39
                request.isProcessed = True
40
                session.commit()
41
            close_session()
12279 kshitij.so 42
            collected = gc.collect()
43
            print "Garbage collector: collected %d objects." % (collected)
12292 kshitij.so 44
            print locals()
45
            print globals()
12279 kshitij.so 46
            requests = []
12256 kshitij.so 47
    except Exception as e:
48
        print e
49
        sys.exit(2)
50
 
51
def fetchDetails(request):
12297 kshitij.so 52
    import threading
12256 kshitij.so 53
    login_url = "https://sellercentral.amazon.in/gp/homepage.html"
54
    br = login(login_url)
55
    items = session.query(CompetitorPricing).filter(CompetitorPricing.competitorPricing_requestId==request.requestId).all()
56
    print items
57
    snapdeal, flipkart, amazon =[],[],[]
58
    for item in items:
59
        if item.snapdealScraping:
60
            snapdeal.append(item)
61
        if item.flipkartScraping:
62
            flipkart.append(item)
63
        if item.amazonScraping:
64
            amazon.append(item)
65
    threads = []
66
    t1 = threading.Thread(target=scrapSnapdeal, args = (snapdeal,))
67
    t1.daemon = True
68
    t1.start()
69
    t2 = threading.Thread(target=scrapFlipkart, args = (flipkart,))
70
    t2.daemon = True
71
    t2.start()
12278 kshitij.so 72
    t3 = threading.Thread(target=scrapAmazon, args = (amazon,br))
73
    t3.daemon = True
74
    t3.start()
12256 kshitij.so 75
    threads.append(t1)
76
    threads.append(t2)
77
    threads.append(t3)
78
    for th in threads:
79
        th.join()
12284 kshitij.so 80
    br,t1,t2,t3 =None,None,None,None
81
    items[:],snapdeal[:],flipkart[:],amazon[:],threads[:]=[],[],[],[],[]
12256 kshitij.so 82
 
83
def scrapSnapdeal(snapdealItems):
12297 kshitij.so 84
    import simplejson as json
85
    import urllib2
86
    from shop2020.model.v1.catalog.impl.DataService import SnapdealItem
12256 kshitij.so 87
    for snapdealItem in snapdealItems:
88
        sdItem = SnapdealItem.get_by(item_id=snapdealItem.item_id)
89
        if sdItem is None:
90
            continue
91
        try:
92
            url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=91&sort=sellingPrice"%(sdItem.supc)
93
            print url
94
            time.sleep(1)
95
            req = urllib2.Request(url)
96
            response = urllib2.urlopen(req)
97
            json_input = response.read()
98
            vendorInfo = json.loads(json_input)
99
            lowestSp, iterator, ourInventory, lowestSellerInventory,ourSp,ourOfferPrice,lowestSp,lowestOfferPrice   = (0,)*8
100
            lowestSellerName = ''
101
            for vendor in vendorInfo:
102
                if iterator == 0:
103
                    lowestSellerName = vendor['vendorDisplayName']
104
                    try:
105
                        lowestSp = vendor['sellingPriceBefIntCashBack']
106
                    except:
107
                        lowestSp = vendor['sellingPrice']
108
                    lowestOfferPrice = vendor['sellingPrice']
109
                    lowestSellerInventory = vendor['buyableInventory']
110
 
111
                if vendor['vendorDisplayName'] == 'MobilesnMore':
112
                    ourInventory = vendor['buyableInventory']
113
                    try:
114
                        ourSp = vendor['sellingPriceBefIntCashBack']
115
                    except:
116
                        ourSp = vendor['sellingPrice']
117
                    ourOfferPrice = vendor['sellingPrice']
118
                iterator+=1
119
        except:
120
            continue
12286 kshitij.so 121
        finally:
12287 kshitij.so 122
            sdItem =None
12256 kshitij.so 123
        snapdealItem.ourSnapdealPrice = ourSp
124
        snapdealItem.ourSnapdealOfferPrice = ourOfferPrice
125
        snapdealItem.ourSnapdealInventory = ourInventory
126
        snapdealItem.lowestSnapdealPrice = lowestSp
127
        snapdealItem.lowestSnapdealOfferPrice = lowestOfferPrice
128
        snapdealItem.lowestSnapdealSeller = lowestSellerName 
129
        snapdealItem.lowestSnapdealSellerInventory = lowestSellerInventory  
130
 
131
def scrapFlipkart(flipkartItems):
12297 kshitij.so 132
    from shop2020.model.v1.catalog.script import FlipkartScraper
133
    from operator import itemgetter
134
    import requests as httpRequest
135
    from shop2020.model.v1.catalog.impl.DataService import FlipkartItem
12276 kshitij.so 136
    scraperFk = FlipkartScraper.FlipkartScraper()
12256 kshitij.so 137
    for flipkartItem in flipkartItems:
138
        fkItem = FlipkartItem.get_by(item_id=flipkartItem.item_id)
139
        if fkItem is None:
140
            continue
141
        try:
142
            url = "http://www.flipkart.com/ps/%s"%(fkItem.flipkartSerialNumber)
143
            vendorsData = scraperFk.read(url)
144
            sortedVendorsData = []
145
            sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
146
            lowestSellerSp, iterator, ourSp = (0,)*3
147
            lowestSellerName = ''
148
            for data in sortedVendorsData:
149
                if iterator == 0:
150
                    lowestSellerName = data['sellerName']
151
                    lowestSellerSp = data['sellingPrice']
152
 
153
                if data['sellerName'] == 'Saholic':
154
                    ourSp = data['sellingPrice']
155
 
156
                iterator+=1
157
        except:
158
            continue
12286 kshitij.so 159
        finally:
12287 kshitij.so 160
            fkItem=None
12256 kshitij.so 161
        try:
162
            request_url = "https://api.flipkart.net/sellers/skus/%s/listings"%(str(fkItem.flipkartSerialNumber))
163
            r = httpRequest.get(request_url, auth=('m2z93iskuj81qiid', '0c7ab6a5-98c0-4cdc-8be3-72c591e0add4'))
164
            print "Inventory info",r.json()
165
            stock_count = int((r.json()['attributeValues'])['stock_count'])
166
        except:
167
            stock_count = 0
168
        finally:
169
                r={}
170
        flipkartItem.ourFlipkartPrice = ourSp
171
        flipkartItem.ourFlipkartInventory = stock_count
172
        flipkartItem.lowestFlipkartPrice = lowestSellerSp
173
        flipkartItem.lowestFlipkartSeller =  lowestSellerName
12283 kshitij.so 174
    scraperFk = None
12256 kshitij.so 175
 
176
 
177
def close_session():
178
    if session.is_active:
179
        print "session is active. closing it."
180
        session.close()
181
 
182
def scrapAmazon(amazonItems,br):
12297 kshitij.so 183
    from shop2020.model.v1.catalog.script import AmazonScraper, SellerCentralScraper
12277 kshitij.so 184
    print "Inside amazonitems ",amazonItems
185
    print "len amazon items ",len(amazonItems)
186
    time.sleep(5)
12276 kshitij.so 187
    sc = SellerCentralScraper.SellerCentralScraper()
12285 kshitij.so 188
    scraperAmazon = AmazonScraper.AmazonScraper()
12256 kshitij.so 189
    for amazonItem in amazonItems:
190
        skuUrlMfn = "https://sellercentral.amazon.in/myi/search/ProductSummary?keyword=%d" %(amazonItem.item_id)
191
        skuUrlFba =  "https://sellercentral.amazon.in/myi/search/ProductSummary?keyword=FBA%d" %(amazonItem.item_id)
192
        try:
193
            asin, mfnInventory, mfnPrice= sc.requestSku(br, skuUrlMfn)
194
            fbaAsin, fbaInventory, fbaPrice= sc.requestSku(br, skuUrlFba)
195
        except Exception as e:
196
            print e
197
            print "Unable to fetch details from Seller Central for ",amazonItem.item_id
198
            continue
199
        try:
200
            if len(asin)==0 and len(fbaAsin)==0:
201
                print "No asin found for ",amazonItem.item_id
202
                continue
203
            if len(asin)==0:
204
                asin=fbaAsin
205
            url = "http://www.amazon.in/gp/offer-listing/%s/ref=olp_sort_ps"%(asin)
206
            scraperAmazon.read(url,True)
207
            lowestSp,lowestSeller = scraperAmazon.createData()
208
            amazonItem.lowestAmazonPrice = lowestSp
12271 kshitij.so 209
            amazonItem.ourMfnPrice = float(str(mfnPrice).replace("Rs.","").replace(",",""))
210
            amazonItem.ourFbaPrice = float(str(fbaPrice).replace("Rs.","").replace(",",""))
12256 kshitij.so 211
            amazonItem.ourMfnInventory = int(mfnInventory)
212
            amazonItem.ourFbaInventory = int(fbaInventory)
213
            amazonItem.lowestAmazonPrice = float(lowestSp)
214
            amazonItem.lowestAmazonSeller = lowestSeller
215
 
216
        except Exception as e:
217
            print e
218
            print "Unable to fetch details from Amazon Listing page for ",amazonItem.item_id
219
            continue
12283 kshitij.so 220
    sc =None
12285 kshitij.so 221
    scraperAmazon = None
12256 kshitij.so 222
 
223
def getBrowserObject():
12297 kshitij.so 224
        import cookielib
12256 kshitij.so 225
        br = mechanize.Browser(factory=mechanize.RobustFactory())
226
        cj = cookielib.LWPCookieJar()
227
        br.set_cookiejar(cj)
228
        br.set_handle_equiv(True)
229
        br.set_handle_redirect(True)
230
        br.set_handle_referer(True)
231
        br.set_handle_robots(False)
232
        br.set_debug_http(False)
233
        br.set_debug_redirects(False)
234
        br.set_debug_responses(False)
235
 
236
        br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
237
 
238
        br.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
239
                         ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
240
                         ('Accept-Encoding', 'gzip,deflate,sdch'),                  
241
                         ('Accept-Language', 'en-US,en;q=0.8'),                     
242
                         ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
243
        return br
244
 
245
def ungzipResponse(r,b):
246
    headers = r.info()
247
    if headers['Content-Encoding']=='gzip':
248
        import gzip
249
        print "********************"
250
        print "Deflating gzip response"
251
        print "********************"
252
        gz = gzip.GzipFile(fileobj=r, mode='rb')
253
        html = gz.read()
254
        gz.close()
255
        headers["Content-type"] = "text/html; charset=utf-8"
256
        r.set_data( html )
257
        b.set_response(r)
258
 
259
 
260
def login(url):
261
    br = getBrowserObject()
262
    br.open(url)
263
    response = br.open(url)
264
    ungzipResponse(response, br)
265
    #html = response.read()
266
    #print html
267
    br.select_form(name="signinWidget")
268
    br.form['username'] = "kshitij.sood@saholic.com"
269
    br.form['password'] = "pioneer"
270
    response = br.submit()
271
    print "********************"
272
    print "Attempting to Login"
273
    print "********************"
274
    #ungzipResponse(response, br)
275
    return br
276
 
277
 
278
 
279
if __name__ == "__main__":
280
    parser = optparse.OptionParser()
281
    parser.add_option("-l", "--logfile", dest="logfile",
282
                      type="string",
283
                      help="Log all output to LOG_FILE",
284
                      )
285
    parser.add_option("-i", "--pidfile", dest="pidfile",
286
                      type="string",
287
                      help="Write the PID to pidfile")
288
    (options, args) = parser.parse_args()
289
    daemon = CompetitorScraping(options.logfile, options.pidfile)
290
    if len(args) == 0:
291
        daemon.run()
292
    elif len(args) == 1:
293
        if 'start' == args[0]:
294
            daemon.start()
295
        elif 'stop' == args[0]:
296
            daemon.stop()
297
        elif 'restart' == args[0]:
298
            daemon.restart()
299
        else:
300
            print "Unknown command"
301
            sys.exit(2)
302
        sys.exit(0)
303
    else:
304
        print "usage: %s start|stop|restart" % sys.argv[0]
305
        sys.exit(2)