Skip to content

Instantly share code, notes, and snippets.

@antoniocuga
Created October 2, 2018 17:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save antoniocuga/b3e794caf6e82c128ce86428aa064593 to your computer and use it in GitHub Desktop.
Save antoniocuga/b3e794caf6e82c128ce86428aa064593 to your computer and use it in GitHub Desktop.
Descarga de productos usando un screenscrapper con selenium webdriver, BeautifulSoup y Pandas.
from bs4 import BeautifulSoup as bs
import requests as rq
import json
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pandas as pd
import time
base_path = "http://www.fischelenlinea.com/"
search_url = "Catalogo.aspx?Busqueda=Sqg&Categoria=Sqgnooj"
prices_url = "Catalogo.aspx/_productGetPrecioPresentacion"
productos_final = []
def call_page_pagination():
url = base_path + search_url
# create a new Firefox session
driver = webdriver.Firefox()
driver.get(url)
driver.implicitly_wait(60)
print "--- Init download ---"
for npage in range(1,3):
driver.execute_script("__doPostBack('uc_Paginador$btSiguiente','')")
driver.implicitly_wait(35)
process_page(driver.page_source)
time.sleep(10)
return False
def get_price(producto_id, presentacion_id):
headers = {"X-Requested-With": 'XMLHttpRequest',
"Content-Type": 'application/json; charset=utf-8'}
data = '{"_idProducto":"%s","_idPresentacion":"%s","_signoMoneda":""}' % (producto_id, presentacion_id)
x = rq.post(base_path + prices_url, data=data, headers=headers)
price = json.loads(x.text)
print "Descargando precios para producto %s" % producto_id
return price["d"]
def process_page(response):
#load_page(base_path + search_url)
response = bs(response, 'html.parser')
lista_productos = response.find_all(
"div", class_="catalogoprductos"
)
for p in lista_productos:
values = p.find_all(class_="textocatalogo")
producto_id = p.find("a", class_="texcata")["id"]
producto_id = producto_id.replace("_lbl_NombreProducto", "_hf_CodigoProducto")
producto_id = response.find(id=producto_id)["value"]
npage = response.find(id="uc_Paginador_cont_bot_numeros")
npage = npage.find(class_="b-numero1").text
producto = {
"producto_id": producto_id,
"url": (("%s%s") % (base_path, p.find("a", class_="texcata")["href"])).encode('utf8'),
"nombre":( p.find("a", class_="texcata").text).encode('utf8'),
"imagen": (("%s%s") % (base_path,p.find("img")['src'])).encode('utf8'),
"marca": (values[0].text).encode('utf8'),
"descripcion": (p.find("div", class_="textocatalogo2").text).encode('utf8'),
"pagina": npage,
#"suelto": get_price(producto_id, "2"),
#"caja": get_price(producto_id, "3")
}
productos_final.append(producto)
#Message after download
print("Download page %s" % npage)
def download_products(filename):
#Init download
call_page_pagination()
#Guardar archivos sin precio
pd.DataFrame(productos_final).to_csv(filename, sep=',', na_rep='')
def process_prices(filename):
#Archivo de productos sin precio
lista_productos = pd.read_csv(filename)
#Presentacion_id: 2 para precio suelto
lista_productos['precio_suelto'] = lista_productos.apply(lambda x: get_price(x['producto_id'], "2"), axis=1)
#Presentacion_id: 3 para precio caja
lista_productos['precio_caja'] = lista_productos.apply(lambda x: get_price(x['producto_id'], "3"), axis=1)
#Actualizar nuevo archivo con precios
lista_productos.to_csv("precios_%s" % filename, sep=',', na_rep='')
return False
if __name__ == '__main__':
#Nombre del archivo para guardar los productos descargados
filename = "final_206.csv"
#To download products
#download_products(filename)
#Descargar precios usando la lista de productos descargados. El archivo final sera "precios_(filename)"
process_prices(filename)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment