示例#1
0
 def startFetchingProducts(self):
     start_time = time.time()
     Utils.printMsg(self._name, "Started", Utils.getLineNo())
     success = False
     while success == False:
         try:
             while True:
                 proxy = self._getProxy()
                 try:
                     jumboMainPage = Utils.makeGetRequest(self._session, self._url, proxy)
                     break
                 except requests.ConnectionError:
                     print traceback.format_exc()
                     self._failedProxies.append(proxy)
                     pass
             soupJumbo = BeautifulSoup(jumboMainPage)
             categorias = soupJumbo.findAll("a", {"class": "btCategoria"})
             self._updateViewStateKey(soupJumbo)
             success = True
         except Exception, e:
             Utils.printMsg(self._name, "Nao consegui encontrar categorias!", Utils.getLineNo())
             Utils.printMsg(self._name, str(e), Utils.getLineNo())
示例#2
0
    def startFetchingProducts(self):
        start_time = time.time()

        Utils.printMsg(self._name, "Started", Utils.getLineNo())

        success = False
        while (success == False):
            try:
                while True:
                    proxy = self._getProxy()
                    try:
                        continentMainPage = Utils.makeGetRequest(self._session, self._url, proxy)
                        break
                    except requests.ConnectionError:
                        print traceback.format_exc()
                        self._failedProxies.append(proxy)
                        pass
                soupContinente = BeautifulSoup(continentMainPage, "lxml")
                categorias = soupContinente.find("ul", { "id" : "categoryMenu" }).findAll("li")
                success = True
            except Exception, e:
                Utils.printMsg(self._name, "Nao consegui encontrar categorias!", Utils.getLineNo())
                Utils.printMsg(self._name, str(e), Utils.getLineNo())
示例#3
0
 def _updateViewStateKey(self, soupObj):
     viewStateKeyObj = soupObj.find("input", {"id": "__VIEWSTATE_KEY"})
     try:
         if viewStateKeyObj["value"] != self._viewStateKey:
             self._viewStateKey = viewStateKeyObj["value"]
             Utils.printMsg(self._name, "ViewStateKey updated: " + self._viewStateKey, Utils.getLineNo())
     except:
         pass
示例#4
0
    def _getProdutosFromCat(self, catDB):

        if not Utils.validUrl(catDB.url):
            return False

        currentPage = ""
        nextPage = "1"
        singlePage = False
        while nextPage != "" and nextPage != currentPage and singlePage == False:
            productsPage = self._getProdutsPage(nextPage, catDB.url)
            productsPageSoup = BeautifulSoup(productsPage)
            self._updateViewStateKey(productsPageSoup)
            # update current page and next page
            paginasSoup = productsPageSoup.find("div", {"class": "pag"})
            if paginasSoup is None:
                # aqui nao ha produtos, sai do ciclo
                break
            paginas = paginasSoup.find("div", {"class": "num"}).findChildren()
            if len(paginas) == 0:
                singlePage = True
                currentPage = "1"
            for pagina in paginas:
                try:
                    if pagina["class"][0] == "pagSelec":
                        currentPage = pagina.string
                        break
                except:
                    nextPage = pagina.string
                    pass

            # we have currentPage and NextPage

            # parse products for this page
            nrProdutosParsed = 0
            products = productsPageSoup.findAll("div", {"class": "produtoLista"})
            for product in products:

                # Produto - Nome
                try:
                    nome = Utils.strip(product.find("a", {"class": "titProd"}).text)
                    if nome == "":
                        raise Exception("")
                except:
                    nome = None
                    # Skip this product if it is ineligable
                    continue

                # Produto - URL
                try:
                    urlProduto = Utils.strip(product.find("a", {"class": "titProd"})["href"])
                except:
                    urlProduto = None

                # Produto - Preco
                try:
                    precoTxt = Utils.strip(product.find("div", {"class": "preco"}).text)
                    precos = re.findall(r"\d+", precoTxt)
                    precoProduto = (float(precos[0]) * 100 + float(precos[1])) / 100
                except:
                    precoProduto = None

                # Produto - Preco/Kg
                try:
                    precoKgTxt = Utils.strip(product.find("div", {"class": "prodkg"}).text)
                    precoKg = float(re.findall(ur"\d{1,4}[,.]\d{1,4}", precoKgTxt)[0].replace(",", "."))
                except:
                    precoKg = None

                # Produto - Peso
                try:
                    peso = Utils.strip(product.find("div", {"class": "gr"}).text)
                except:
                    peso = None

                # Produto - ID
                try:
                    idProduto = Utils.strip(re.findall(ur"\d+$", url)[0])
                except:
                    idProduto = -1

                # Produto - Imagem
                try:
                    imagem = self._domain + Utils.strip(product.find("a", {"id": "lProdDetail"}).find("img")["src"])
                except:
                    imagem = None

                # Produto - Marca
                try:
                    marca = Utils.strip(product.find("div", {"class": "titMarca"}).text).lower()
                except:
                    marca = None

                # Save to DB
                produtoDB = models.Produto(
                    nome=nome,
                    marca=marca,
                    preco=precoProduto,
                    preco_kg=precoKg,
                    peso=peso,
                    url_pagina=urlProduto,
                    url_imagem=imagem,
                    desconto=None,
                    categoria_pai=catDB,
                    hiper=self._hiperRef,
                    latest_update=timezone.now(),
                )
                Utils.saveObjToDB(produtoDB)

                Utils.logProdutos(
                    self._name,
                    Utils.toStr(nome)
                    + Utils.logSeparator
                    + Utils.toStr(marca)
                    + Utils.logSeparator
                    + Utils.toStr(precoProduto)
                    + Utils.logSeparator
                    + Utils.toStr(precoKg)
                    + Utils.logSeparator
                    + Utils.toStr("")
                    + Utils.logSeparator
                    + Utils.toStr(peso)
                    + Utils.logSeparator
                    + Utils.toStr(idProduto)
                    + Utils.logSeparator
                    + Utils.toStr(urlProduto)
                    + Utils.logSeparator
                    + Utils.toStr(imagem),
                )

                nrProdutosParsed += 1

            Utils.printMsg(
                self._name,
                catDB.nome + "-" + "Pagina [" + currentPage + "]: " + str(nrProdutosParsed) + " produtos",
                Utils.getLineNo(),
            )

        # new page, reset session
        self._session = requests.Session()
示例#5
0
                                hiper=self._hiperRef,
                                latest_update=timezone.now(),
                            )
                            Utils.saveObjToDB(subSubCatDB)

                            # SubSubCategoria - Produtos
                            self._getProdutosFromCat(subSubCatDB)

                    currentSubSubCat += 1
                currentSubCat += 1
            currentCat += 1

            Utils.printMsg(self._name, "Finished fetching products of: " + Utils.toStr(catName), Utils.getLineNo())

        Utils.printMsg(
            self._name, "-" + "Finished - Elapsed: " + str(time.time() - start_time) + " seconds", Utils.getLineNo()
        )

    def _getProdutosFromCat(self, catDB):

        if not Utils.validUrl(catDB.url):
            return False

        currentPage = ""
        nextPage = "1"
        singlePage = False
        while nextPage != "" and nextPage != currentPage and singlePage == False:
            productsPage = self._getProdutsPage(nextPage, catDB.url)
            productsPageSoup = BeautifulSoup(productsPage)
            self._updateViewStateKey(productsPageSoup)
            # update current page and next page
示例#6
0
    def _getProdutosFromCat(self, catDB, pagina=1, nrPages=None):

        if not Utils.validUrl(catDB.url):
            return True

        if pagina != 1 and nrPages+1 == pagina:
            return True

        payload = {
                    '__EVENTTARGET': 'ProductsMain1:DataListPages:_ctl'+str((pagina - 1) * 2)+':linkButton',
                    'ProductsMain1:cmbPaginacao':'48'
                    }
        while True:
            proxy = self._getProxy()
            try:
                request = Utils.makePostRequest(self._session, catDB.url, payload, proxy)
                break
            except requests.ConnectionError:
                self._failedProxies.append(proxy)
                print traceback.format_exc()
        soupPagina = BeautifulSoup(request)
        error = soupPagina.find("span",{"id":"Error1_lblErrorDescription"})
        if error:
            Utils.printMsg(self._name, "ERROR IN REQUEST", Utils.getLineNo())
            return False

        #parse Produtos
        produtos = soupPagina.findAll("div",{"class":"product-view"})

        nrProdutosParsed = 0

        for produto in produtos:

            # Produto - Nome
            try:
                nome = Utils.strip(produto.find("a", {"class":"product-view-text-item"}).find(text=True))
                if nome == "":
                    raise Exception("")
            except:
                nome = None
                #Skip this product if it is ineligable
                continue

            # Produto - URL
            try:
                urlProduto = Utils.strip(produto.find("a")["href"])
                urlProduto = self._domain + "/" + urlProduto
                if urlProduto == "":
                    raise Exception("")
            except:
                urlProduto = None

            # Produto - Preco
            try:
                precoProduto = float(re.findall(r'\d*[.,]\d*', Utils.strip(produto.find("div",{"class":"product-view-price"}).text).replace(",","."))[0])
            except:
                precoProduto = None

            # Produto - Preco/Kg
            try:
                precoKg = float(re.findall(r'\d*[.,]\d*', Utils.strip(produto.find("span",{"class":"produtoListaPrecoUnit"}).text).replace(",","."))[0])
            except:
                precoKg = None

            # Produto - Peso
            try:
                peso = Utils.strip(produto.find("span",{"class":"product-package"}).text)
            except:
                peso = None

            # Produto - ID
            try:
                idProduto = int(re.findall(r'productId=\d+', urlProduto, re.IGNORECASE)[0].replace("productId=",""))
            except:
                idProduto = -1

            # Produto - Imagem
            try:
                imagem = self._domain + Utils.strip(produto.find("img")["src"].replace("\\","/").replace("/med/","/lar/").replace("/Med/","/Lar/").replace("_med","_lar").replace("_Med","_Lar"))
                if imagem == "":
                    raise Exception("")
            except:
                imagem = None

            # Produto - Marca
            try:
                marca = Utils.strip(produto.find("span",{"class":"product-logo"}).text)
                if marca == "":
                    raise Exception("")
            except:
                marca = None

            # Produto - Desconto
            try:
                fraseDesconto = re.findall(r'desconto\s*.*\d*[.,]\d*', Utils.strip(produto.text), re.IGNORECASE)[0]
                desconto = float(re.findall(r'\d*[.,]\d*', fraseDesconto)[0].replace(",","."))
            except:
                desconto = None

            # Save to DB
            produtoDB = models.Produto( nome=nome,
                                        marca=marca,
                                        preco=precoProduto,
                                        preco_kg=precoKg,
                                        peso=peso,
                                        url_pagina=urlProduto,
                                        url_imagem=imagem,
                                        desconto=desconto,
                                        categoria_pai=catDB,
                                        hiper=self._hiperRef,
                                        latest_update=timezone.now())
            Utils.saveObjToDB(produtoDB)

            Utils.logProdutos(self._name, Utils.toStr(nome) + Utils.logSeparator + Utils.toStr(marca) + Utils.logSeparator + Utils.toStr(precoProduto) + Utils.logSeparator + Utils.toStr(precoKg) + Utils.logSeparator + Utils.toStr(desconto) + Utils.logSeparator + Utils.toStr(peso) + Utils.logSeparator + Utils.toStr(idProduto) + Utils.logSeparator + Utils.toStr(urlProduto) + Utils.logSeparator + Utils.toStr(imagem))

            nrProdutosParsed += 1

        Utils.printMsg(self._name, catDB.nome+"-"+"Pagina [" + str(pagina) + "]: " + str(nrProdutosParsed) + " produtos", Utils.getLineNo())

        try:
            paginas = soupPagina.find("span",{"id":"ProductsMain1_DataListPages"}).findAll(id=re.compile('.*_DataListPages__.*'))
        except:
            return True

        self._getProdutosFromCat(catDB, pagina+1, len(paginas))