Subversion Repositories SmartDukaan

Rev

Rev 12314 | Rev 15484 | 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()
12314 kshitij.so 41
                sendMail(request)
12256 kshitij.so 42
            close_session()
12279 kshitij.so 43
            collected = gc.collect()
44
            print "Garbage collector: collected %d objects." % (collected)
12292 kshitij.so 45
            print locals()
46
            print globals()
12279 kshitij.so 47
            requests = []
12256 kshitij.so 48
    except Exception as e:
49
        print e
50
        sys.exit(2)
51
 
52
def fetchDetails(request):
12297 kshitij.so 53
    import threading
12256 kshitij.so 54
    login_url = "https://sellercentral.amazon.in/gp/homepage.html"
55
    br = login(login_url)
56
    items = session.query(CompetitorPricing).filter(CompetitorPricing.competitorPricing_requestId==request.requestId).all()
57
    print items
58
    snapdeal, flipkart, amazon =[],[],[]
59
    for item in items:
60
        if item.snapdealScraping:
61
            snapdeal.append(item)
62
        if item.flipkartScraping:
63
            flipkart.append(item)
64
        if item.amazonScraping:
65
            amazon.append(item)
66
    threads = []
67
    t1 = threading.Thread(target=scrapSnapdeal, args = (snapdeal,))
68
    t1.daemon = True
69
    t1.start()
70
    t2 = threading.Thread(target=scrapFlipkart, args = (flipkart,))
71
    t2.daemon = True
72
    t2.start()
12278 kshitij.so 73
    t3 = threading.Thread(target=scrapAmazon, args = (amazon,br))
74
    t3.daemon = True
75
    t3.start()
12256 kshitij.so 76
    threads.append(t1)
77
    threads.append(t2)
78
    threads.append(t3)
79
    for th in threads:
80
        th.join()
12284 kshitij.so 81
    br,t1,t2,t3 =None,None,None,None
82
    items[:],snapdeal[:],flipkart[:],amazon[:],threads[:]=[],[],[],[],[]
12256 kshitij.so 83
 
84
def scrapSnapdeal(snapdealItems):
12297 kshitij.so 85
    import simplejson as json
86
    import urllib2
87
    from shop2020.model.v1.catalog.impl.DataService import SnapdealItem
12256 kshitij.so 88
    for snapdealItem in snapdealItems:
89
        sdItem = SnapdealItem.get_by(item_id=snapdealItem.item_id)
90
        if sdItem is None:
91
            continue
92
        try:
93
            url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=91&sort=sellingPrice"%(sdItem.supc)
94
            print url
95
            time.sleep(1)
96
            req = urllib2.Request(url)
97
            response = urllib2.urlopen(req)
98
            json_input = response.read()
99
            vendorInfo = json.loads(json_input)
100
            lowestSp, iterator, ourInventory, lowestSellerInventory,ourSp,ourOfferPrice,lowestSp,lowestOfferPrice   = (0,)*8
101
            lowestSellerName = ''
102
            for vendor in vendorInfo:
103
                if iterator == 0:
104
                    lowestSellerName = vendor['vendorDisplayName']
105
                    try:
106
                        lowestSp = vendor['sellingPriceBefIntCashBack']
107
                    except:
108
                        lowestSp = vendor['sellingPrice']
109
                    lowestOfferPrice = vendor['sellingPrice']
110
                    lowestSellerInventory = vendor['buyableInventory']
111
 
112
                if vendor['vendorDisplayName'] == 'MobilesnMore':
113
                    ourInventory = vendor['buyableInventory']
114
                    try:
115
                        ourSp = vendor['sellingPriceBefIntCashBack']
116
                    except:
117
                        ourSp = vendor['sellingPrice']
118
                    ourOfferPrice = vendor['sellingPrice']
119
                iterator+=1
120
        except:
121
            continue
12286 kshitij.so 122
        finally:
12287 kshitij.so 123
            sdItem =None
12256 kshitij.so 124
        snapdealItem.ourSnapdealPrice = ourSp
125
        snapdealItem.ourSnapdealOfferPrice = ourOfferPrice
126
        snapdealItem.ourSnapdealInventory = ourInventory
127
        snapdealItem.lowestSnapdealPrice = lowestSp
128
        snapdealItem.lowestSnapdealOfferPrice = lowestOfferPrice
129
        snapdealItem.lowestSnapdealSeller = lowestSellerName 
12314 kshitij.so 130
        snapdealItem.lowestSnapdealSellerInventory = lowestSellerInventory
131
    snapdealItems[:]=[]  
12256 kshitij.so 132
 
133
def scrapFlipkart(flipkartItems):
12297 kshitij.so 134
    from shop2020.model.v1.catalog.script import FlipkartScraper
135
    from operator import itemgetter
136
    import requests as httpRequest
137
    from shop2020.model.v1.catalog.impl.DataService import FlipkartItem
12276 kshitij.so 138
    scraperFk = FlipkartScraper.FlipkartScraper()
12256 kshitij.so 139
    for flipkartItem in flipkartItems:
140
        fkItem = FlipkartItem.get_by(item_id=flipkartItem.item_id)
141
        if fkItem is None:
142
            continue
143
        try:
144
            url = "http://www.flipkart.com/ps/%s"%(fkItem.flipkartSerialNumber)
145
            vendorsData = scraperFk.read(url)
146
            sortedVendorsData = []
147
            sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
148
            lowestSellerSp, iterator, ourSp = (0,)*3
149
            lowestSellerName = ''
150
            for data in sortedVendorsData:
151
                if iterator == 0:
152
                    lowestSellerName = data['sellerName']
153
                    lowestSellerSp = data['sellingPrice']
154
 
155
                if data['sellerName'] == 'Saholic':
156
                    ourSp = data['sellingPrice']
157
 
158
                iterator+=1
159
        except:
160
            continue
12286 kshitij.so 161
        finally:
12287 kshitij.so 162
            fkItem=None
12256 kshitij.so 163
        try:
164
            request_url = "https://api.flipkart.net/sellers/skus/%s/listings"%(str(fkItem.flipkartSerialNumber))
165
            r = httpRequest.get(request_url, auth=('m2z93iskuj81qiid', '0c7ab6a5-98c0-4cdc-8be3-72c591e0add4'))
166
            print "Inventory info",r.json()
167
            stock_count = int((r.json()['attributeValues'])['stock_count'])
168
        except:
169
            stock_count = 0
170
        finally:
171
                r={}
172
        flipkartItem.ourFlipkartPrice = ourSp
173
        flipkartItem.ourFlipkartInventory = stock_count
174
        flipkartItem.lowestFlipkartPrice = lowestSellerSp
175
        flipkartItem.lowestFlipkartSeller =  lowestSellerName
12283 kshitij.so 176
    scraperFk = None
12314 kshitij.so 177
    flipkartItems[:] =[] 
12256 kshitij.so 178
 
179
 
180
def close_session():
181
    if session.is_active:
182
        print "session is active. closing it."
183
        session.close()
184
 
185
def scrapAmazon(amazonItems,br):
12297 kshitij.so 186
    from shop2020.model.v1.catalog.script import AmazonScraper, SellerCentralScraper
12277 kshitij.so 187
    print "Inside amazonitems ",amazonItems
188
    print "len amazon items ",len(amazonItems)
189
    time.sleep(5)
12276 kshitij.so 190
    sc = SellerCentralScraper.SellerCentralScraper()
12285 kshitij.so 191
    scraperAmazon = AmazonScraper.AmazonScraper()
12256 kshitij.so 192
    for amazonItem in amazonItems:
193
        skuUrlMfn = "https://sellercentral.amazon.in/myi/search/ProductSummary?keyword=%d" %(amazonItem.item_id)
194
        skuUrlFba =  "https://sellercentral.amazon.in/myi/search/ProductSummary?keyword=FBA%d" %(amazonItem.item_id)
195
        try:
196
            asin, mfnInventory, mfnPrice= sc.requestSku(br, skuUrlMfn)
197
            fbaAsin, fbaInventory, fbaPrice= sc.requestSku(br, skuUrlFba)
198
        except Exception as e:
199
            print e
200
            print "Unable to fetch details from Seller Central for ",amazonItem.item_id
201
            continue
202
        try:
203
            if len(asin)==0 and len(fbaAsin)==0:
204
                print "No asin found for ",amazonItem.item_id
205
                continue
206
            if len(asin)==0:
207
                asin=fbaAsin
208
            url = "http://www.amazon.in/gp/offer-listing/%s/ref=olp_sort_ps"%(asin)
209
            scraperAmazon.read(url,True)
210
            lowestSp,lowestSeller = scraperAmazon.createData()
211
            amazonItem.lowestAmazonPrice = lowestSp
12271 kshitij.so 212
            amazonItem.ourMfnPrice = float(str(mfnPrice).replace("Rs.","").replace(",",""))
213
            amazonItem.ourFbaPrice = float(str(fbaPrice).replace("Rs.","").replace(",",""))
12256 kshitij.so 214
            amazonItem.ourMfnInventory = int(mfnInventory)
215
            amazonItem.ourFbaInventory = int(fbaInventory)
216
            amazonItem.lowestAmazonPrice = float(lowestSp)
217
            amazonItem.lowestAmazonSeller = lowestSeller
218
 
219
        except Exception as e:
220
            print e
221
            print "Unable to fetch details from Amazon Listing page for ",amazonItem.item_id
222
            continue
12283 kshitij.so 223
    sc =None
12285 kshitij.so 224
    scraperAmazon = None
12314 kshitij.so 225
    amazonItems[:] =[] 
12256 kshitij.so 226
 
227
def getBrowserObject():
12297 kshitij.so 228
        import cookielib
12256 kshitij.so 229
        br = mechanize.Browser(factory=mechanize.RobustFactory())
230
        cj = cookielib.LWPCookieJar()
231
        br.set_cookiejar(cj)
232
        br.set_handle_equiv(True)
233
        br.set_handle_redirect(True)
234
        br.set_handle_referer(True)
235
        br.set_handle_robots(False)
236
        br.set_debug_http(False)
237
        br.set_debug_redirects(False)
238
        br.set_debug_responses(False)
239
 
240
        br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
241
 
242
        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'),
243
                         ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
244
                         ('Accept-Encoding', 'gzip,deflate,sdch'),                  
245
                         ('Accept-Language', 'en-US,en;q=0.8'),                     
246
                         ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
247
        return br
248
 
249
def ungzipResponse(r,b):
250
    headers = r.info()
251
    if headers['Content-Encoding']=='gzip':
252
        import gzip
253
        print "********************"
254
        print "Deflating gzip response"
255
        print "********************"
256
        gz = gzip.GzipFile(fileobj=r, mode='rb')
257
        html = gz.read()
258
        gz.close()
259
        headers["Content-type"] = "text/html; charset=utf-8"
260
        r.set_data( html )
261
        b.set_response(r)
262
 
263
 
264
def login(url):
265
    br = getBrowserObject()
266
    br.open(url)
267
    response = br.open(url)
268
    ungzipResponse(response, br)
269
    #html = response.read()
270
    #print html
271
    br.select_form(name="signinWidget")
272
    br.form['username'] = "kshitij.sood@saholic.com"
273
    br.form['password'] = "pioneer"
274
    response = br.submit()
275
    print "********************"
276
    print "Attempting to Login"
277
    print "********************"
278
    #ungzipResponse(response, br)
279
    return br
280
 
12314 kshitij.so 281
def sendMail(request):
282
    import smtplib
283
    from email.mime.text import MIMEText
284
    from email.mime.multipart import MIMEMultipart
285
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
286
    mailServer.ehlo()
287
    mailServer.starttls()
288
    mailServer.ehlo()
289
    recipients = []
290
    recipients.append(request.user)
291
    message = "Your Request has been processed.Visit dashboard to check & download report" 
292
    msg = MIMEMultipart()
12329 kshitij.so 293
    msg['Subject'] = "Competition Scraping.Upload Id" + ' - ' + str(request.requestId)
12314 kshitij.so 294
    msg['From'] = ""
295
    msg['To'] = ",".join(recipients)
296
    msg.preamble = "Competition Scraping" + ' - ' + str(request.requestId)
297
    html_msg = MIMEText(message, 'html')
298
    msg.attach(html_msg)
299
    try:
300
        mailServer.login("build@shop2020.in", "cafe@nes")
301
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
302
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
303
    except Exception as e:
304
        print e
305
        print "Unable to send mail.Lets try with local SMTP."
306
        smtpServer = smtplib.SMTP('localhost')
307
        smtpServer.set_debuglevel(1)
308
        sender = 'build@shop2020.in'
309
        try:
310
            smtpServer.sendmail(sender, recipients, msg.as_string())
311
            print "Successfully sent email"
312
        except:
313
            print "Error: unable to send email."
314
 
12256 kshitij.so 315
 
316
 
317
if __name__ == "__main__":
318
    parser = optparse.OptionParser()
319
    parser.add_option("-l", "--logfile", dest="logfile",
320
                      type="string",
321
                      help="Log all output to LOG_FILE",
322
                      )
323
    parser.add_option("-i", "--pidfile", dest="pidfile",
324
                      type="string",
325
                      help="Write the PID to pidfile")
326
    (options, args) = parser.parse_args()
327
    daemon = CompetitorScraping(options.logfile, options.pidfile)
328
    if len(args) == 0:
329
        daemon.run()
330
    elif len(args) == 1:
331
        if 'start' == args[0]:
332
            daemon.start()
333
        elif 'stop' == args[0]:
334
            daemon.stop()
335
        elif 'restart' == args[0]:
336
            daemon.restart()
337
        else:
338
            print "Unknown command"
339
            sys.exit(2)
340
        sys.exit(0)
341
    else:
342
        print "usage: %s start|stop|restart" % sys.argv[0]
343
        sys.exit(2)