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()
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()
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()
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))