Subversion Repositories SmartDukaan

Rev

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