Exemplo n.º 1
0
    def __init__(self):
        self._name = "Continente"
        self._domain = "http://www.continente.pt"
        self._mainPath = "stores/continente/pt-pt/public/Pages/homepage.aspx"
        self._url = Utils.toStr(self._domain + "/" + self._mainPath)

        hiper.Hiper.__init__(self, name=self._name, domain=self._domain, mainPath=self._mainPath)

        # Save to DB
        hiperDB = models.Hiper(nome=self._name, domain=self._domain, mainPath=self._mainPath, latest_update=timezone.now())
        Utils.saveObjToDB(hiperDB)

        self._hiperRef = hiperDB

        self._session = requests.Session()

        self._useProxies = False

        self._resetProxies()
Exemplo n.º 2
0
    def __init__(self):
        self._name = "Jumbo"
        self._domain = "http://www.jumbo.pt"
        self._mainPath = "Frontoffice/ContentPages/JumboNetWelcome.aspx"
        self._url = Utils.toStr(self._domain + "/" + self._mainPath)

        hiper.Hiper.__init__(self, name=self._name, domain=self._domain, mainPath=self._mainPath)

        # Save to DB
        hiperDB = models.Hiper(
            nome=self._name, domain=self._domain, mainPath=self._mainPath, latest_update=timezone.now()
        )
        Utils.saveObjToDB(hiperDB)

        self._hiperRef = hiperDB

        self._session = requests.Session()
        self._viewStateKey = ""

        self._useProxies = False

        self._resetProxies()
Exemplo n.º 3
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()
Exemplo n.º 4
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))