Subversion Repositories SmartDukaan

Rev

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