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