Subversion Repositories SmartDukaan

Rev

Rev 12278 | Rev 12281 | 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....."
39
                time.sleep(600)
40
            for request in requests:
41
                fetchDetails(request)
42
                request.isProcessed = True
43
                session.commit()
44
            close_session()
12279 kshitij.so 45
            collected = gc.collect()
46
            print "Garbage collector: collected %d objects." % (collected)
47
            requests = []
12256 kshitij.so 48
    except Exception as e:
49
        print e
50
        sys.exit(2)
51
 
52
def fetchDetails(request):
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()
80
 
12272 kshitij.so 81
 
12256 kshitij.so 82
def scrapSnapdeal(snapdealItems):
83
    for snapdealItem in snapdealItems:
84
        sdItem = SnapdealItem.get_by(item_id=snapdealItem.item_id)
85
        if sdItem is None:
86
            continue
87
        try:
88
            url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=91&sort=sellingPrice"%(sdItem.supc)
89
            print url
90
            time.sleep(1)
91
            req = urllib2.Request(url)
92
            response = urllib2.urlopen(req)
93
            json_input = response.read()
94
            vendorInfo = json.loads(json_input)
95
            lowestSp, iterator, ourInventory, lowestSellerInventory,ourSp,ourOfferPrice,lowestSp,lowestOfferPrice   = (0,)*8
96
            lowestSellerName = ''
97
            for vendor in vendorInfo:
98
                if iterator == 0:
99
                    lowestSellerName = vendor['vendorDisplayName']
100
                    try:
101
                        lowestSp = vendor['sellingPriceBefIntCashBack']
102
                    except:
103
                        lowestSp = vendor['sellingPrice']
104
                    lowestOfferPrice = vendor['sellingPrice']
105
                    lowestSellerInventory = vendor['buyableInventory']
106
 
107
                if vendor['vendorDisplayName'] == 'MobilesnMore':
108
                    ourInventory = vendor['buyableInventory']
109
                    try:
110
                        ourSp = vendor['sellingPriceBefIntCashBack']
111
                    except:
112
                        ourSp = vendor['sellingPrice']
113
                    ourOfferPrice = vendor['sellingPrice']
114
                iterator+=1
115
        except:
116
            continue
117
        snapdealItem.ourSnapdealPrice = ourSp
118
        snapdealItem.ourSnapdealOfferPrice = ourOfferPrice
119
        snapdealItem.ourSnapdealInventory = ourInventory
120
        snapdealItem.lowestSnapdealPrice = lowestSp
121
        snapdealItem.lowestSnapdealOfferPrice = lowestOfferPrice
122
        snapdealItem.lowestSnapdealSeller = lowestSellerName 
123
        snapdealItem.lowestSnapdealSellerInventory = lowestSellerInventory  
124
 
125
def scrapFlipkart(flipkartItems):
12276 kshitij.so 126
    scraperFk = FlipkartScraper.FlipkartScraper()
12256 kshitij.so 127
    for flipkartItem in flipkartItems:
128
        fkItem = FlipkartItem.get_by(item_id=flipkartItem.item_id)
129
        if fkItem is None:
130
            continue
131
        try:
132
            url = "http://www.flipkart.com/ps/%s"%(fkItem.flipkartSerialNumber)
133
            vendorsData = scraperFk.read(url)
134
            sortedVendorsData = []
135
            sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
136
            lowestSellerSp, iterator, ourSp = (0,)*3
137
            lowestSellerName = ''
138
            for data in sortedVendorsData:
139
                if iterator == 0:
140
                    lowestSellerName = data['sellerName']
141
                    lowestSellerSp = data['sellingPrice']
142
 
143
                if data['sellerName'] == 'Saholic':
144
                    ourSp = data['sellingPrice']
145
 
146
                iterator+=1
147
        except:
148
            continue
149
 
150
        try:
151
            request_url = "https://api.flipkart.net/sellers/skus/%s/listings"%(str(fkItem.flipkartSerialNumber))
152
            r = httpRequest.get(request_url, auth=('m2z93iskuj81qiid', '0c7ab6a5-98c0-4cdc-8be3-72c591e0add4'))
153
            print "Inventory info",r.json()
154
            stock_count = int((r.json()['attributeValues'])['stock_count'])
155
        except:
156
            stock_count = 0
157
        finally:
158
                r={}
159
        flipkartItem.ourFlipkartPrice = ourSp
160
        flipkartItem.ourFlipkartInventory = stock_count
161
        flipkartItem.lowestFlipkartPrice = lowestSellerSp
162
        flipkartItem.lowestFlipkartSeller =  lowestSellerName
163
 
164
 
165
 
166
def close_session():
167
    if session.is_active:
168
        print "session is active. closing it."
169
        session.close()
170
 
171
def scrapAmazon(amazonItems,br):
12277 kshitij.so 172
    print "Inside amazonitems ",amazonItems
173
    print "len amazon items ",len(amazonItems)
174
    time.sleep(5)
12276 kshitij.so 175
    sc = SellerCentralScraper.SellerCentralScraper()
12256 kshitij.so 176
    for amazonItem in amazonItems:
177
        skuUrlMfn = "https://sellercentral.amazon.in/myi/search/ProductSummary?keyword=%d" %(amazonItem.item_id)
178
        skuUrlFba =  "https://sellercentral.amazon.in/myi/search/ProductSummary?keyword=FBA%d" %(amazonItem.item_id)
179
        try:
180
            print type(sc.requestSku(br, skuUrlMfn))
181
            asin, mfnInventory, mfnPrice= sc.requestSku(br, skuUrlMfn)
182
            fbaAsin, fbaInventory, fbaPrice= sc.requestSku(br, skuUrlFba)
183
        except Exception as e:
184
            print e
185
            print "Unable to fetch details from Seller Central for ",amazonItem.item_id
186
            continue
187
        scraperAmazon = AmazonScraper.AmazonScraper()
188
        try:
189
            if len(asin)==0 and len(fbaAsin)==0:
190
                print "No asin found for ",amazonItem.item_id
191
                continue
192
            if len(asin)==0:
193
                asin=fbaAsin
194
            url = "http://www.amazon.in/gp/offer-listing/%s/ref=olp_sort_ps"%(asin)
195
            scraperAmazon.read(url,True)
196
            lowestSp,lowestSeller = scraperAmazon.createData()
197
            amazonItem.lowestAmazonPrice = lowestSp
198
 
199
            print "Details of Item id ",amazonItem.item_id
200
            print "ASIN ",asin
201
            print "MFN INVENTORY ",mfnInventory
202
            print "FBA INVENTORY ",fbaInventory
203
            print "MFN PRICE ",mfnPrice
204
            print "FBA PRICE ",fbaPrice
205
            print "Lowest Seller SP ",lowestSp
206
            print "LOWEST SELLER NAME ",lowestSeller
207
 
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
219
 
220
def getBrowserObject():
221
        br = mechanize.Browser(factory=mechanize.RobustFactory())
222
        cj = cookielib.LWPCookieJar()
223
        br.set_cookiejar(cj)
224
        br.set_handle_equiv(True)
225
        br.set_handle_redirect(True)
226
        br.set_handle_referer(True)
227
        br.set_handle_robots(False)
228
        br.set_debug_http(False)
229
        br.set_debug_redirects(False)
230
        br.set_debug_responses(False)
231
 
232
        br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
233
 
234
        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'),
235
                         ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
236
                         ('Accept-Encoding', 'gzip,deflate,sdch'),                  
237
                         ('Accept-Language', 'en-US,en;q=0.8'),                     
238
                         ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
239
        return br
240
 
241
def ungzipResponse(r,b):
242
    headers = r.info()
243
    if headers['Content-Encoding']=='gzip':
244
        import gzip
245
        print "********************"
246
        print "Deflating gzip response"
247
        print "********************"
248
        gz = gzip.GzipFile(fileobj=r, mode='rb')
249
        html = gz.read()
250
        gz.close()
251
        headers["Content-type"] = "text/html; charset=utf-8"
252
        r.set_data( html )
253
        b.set_response(r)
254
 
255
 
256
def login(url):
257
    br = getBrowserObject()
258
    br.open(url)
259
    response = br.open(url)
260
    ungzipResponse(response, br)
261
    #html = response.read()
262
    #print html
263
    br.select_form(name="signinWidget")
264
    br.form['username'] = "kshitij.sood@saholic.com"
265
    br.form['password'] = "pioneer"
266
    response = br.submit()
267
    print "********************"
268
    print "Attempting to Login"
269
    print "********************"
270
    #ungzipResponse(response, br)
271
    return br
272
 
273
 
274
 
275
if __name__ == "__main__":
276
    parser = optparse.OptionParser()
277
    parser.add_option("-l", "--logfile", dest="logfile",
278
                      type="string",
279
                      help="Log all output to LOG_FILE",
280
                      )
281
    parser.add_option("-i", "--pidfile", dest="pidfile",
282
                      type="string",
283
                      help="Write the PID to pidfile")
284
    (options, args) = parser.parse_args()
285
    daemon = CompetitorScraping(options.logfile, options.pidfile)
286
    if len(args) == 0:
287
        daemon.run()
288
    elif len(args) == 1:
289
        if 'start' == args[0]:
290
            daemon.start()
291
        elif 'stop' == args[0]:
292
            daemon.stop()
293
        elif 'restart' == args[0]:
294
            daemon.restart()
295
        else:
296
            print "Unknown command"
297
            sys.exit(2)
298
        sys.exit(0)
299
    else:
300
        print "usage: %s start|stop|restart" % sys.argv[0]
301
        sys.exit(2)