Seguimiento del stock - AMD RX6000

sk1zo85

#630 Bueno va, pero voy a compartir una versión que no hace todo el proceso automático, esa parte me dio bastante faena y me la guardo para mi, el que quiera la puede hacer el mismo a partir de lo que subiré, ya que es mas de lo mismo pero hay que buscar todos los campos del formulario para rellenarlos, y la parte difícil es como controlar una vez has realizado un pedido para que no te compre 20 graficas xD

Subiré una primera versión que hice, que hace exactamente lo mismo pero no tienen el proceso de compra, sino que te manda un mail si el producto esta disponible con la url del producto y el precio que tiene, también muestra por el cmd si esta disponible por si se ejecuta mientras se esta delante del pc.

1 respuesta
DiS4Bl3D

#631 pero por como lo estas explicando creo que para los que no sabemos de programación no vamos ni a saber usarlo ¿no?

1 respuesta
alfaplays

Confirmamos que es a las 3?

1 respuesta
DiS4Bl3D

#633 confirmado no lo sé entiendo que como la semana pasada fue a las 15:00 hoy también. Tu grafica que? ha cambiado el estado del pedido?

1 respuesta
sk1zo85

#632 No, es bastante fácil de usar, solo tendréis de añadir algunos datos para que os mande los mails y haga loggin en pccomponentes, luego se ejecuta desde la consola como cualquier script python (py script.py), lógicamente antes hay que instalar python, pero es muy fácil.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from multiprocessing import Process
import numpy as np
import yagmail
import time

options = Options()
options.page_load_strategy = 'eager'
#options.page_load_strategy = 'normal'

login_url = 'https://www.pccomponentes.com/login'
search_url = 'https://www.pccomponentes.com/buscar/?query=rx+6800+xt'
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)
maxPrice=700   #precio maximo
username= ''   #datos pccomponentes para loggin (no se usa)
password= ''   #datos pccomponentes para loggin (no se usa)
usergmail=''   #datos para yagmail
passgmail=''   #datos para yagmail
mailtosend=''  #mail donde se manda notificacion

def logging(username, password):
   # for logging into amazon
    driver.get(login_url)
    driver.find_element_by_xpath(
        '//*[@name="username"]').send_keys(username)
    driver.find_element_by_xpath(
        '//*[@name="password"]').send_keys(password + Keys.RETURN)
    # end of login code
		
def search():	

driver.get(search_url)

articulos = []
# articulos = driver.find_elements_by_xpath('//div[@id="articleListContent"]')
for i in driver.find_elements_by_xpath('//a[@class="GTM-productClick enlace-superpuesto cy-product-hover-link"]'):
    #print('Modelo:'+i.get_attribute("data-name"))
    #print('Id:'+i.get_attribute("data-id"))
    #print('Precio:'+i.get_attribute("data-price"))
    #print('Stock:'+i.get_attribute("data-stock-web"))
    #print('link:'+i.get_attribute("href"))
	#print('Sku:'+i.get_attribute("data-sku"))
    if float(i.get_attribute("data-price")) < float(maxPrice):
        articulos.append([i.get_attribute("data-price"),i.get_attribute("data-name"),i.get_attribute("href"),i.get_attribute("data-id")])
	#print(mat)

return articulos

def purchase(articulo):

  # for getting into our product page
    driver.get(articulo[2])
    time.sleep(3)

if(len(driver.find_elements_by_xpath('//button[@id="notify-me"]')) == 0):
    print("Disponible "+articulo[2])
    # click en el boton de compra
    #driver.find_element_by_xpath('//button[@class="btn btn-primary btn-lg buy GTM-addToCart buy-button js-article-buy"]').click()

    try:
        #initializing the server connection
        yag = yagmail.SMTP(user=usergmail, password=passgmail)
        #sending the email
        yag.send(to=mailtosend, subject=articulo[1], contents= articulo[2]+"</BR> <h1>Precio:"+articulo[0]+"</h1>")
        print("Email sent successfully")
    except:
        print("Error, email was not sent")

#elif(len(driver.find_elements_by_xpath('//button[@id="notify-me"]')) != 0):
 #   print("No disponible "+articulo[2])



if __name__ == '__main__':
    #logging(username, password)
    
while True: print("Buscando Resultados...") articulos = search() for articulo in articulos: #print("Procesando:"+articulo[1]) purchase(articulo) print("Esperando 30 segundos para nueva busqueda...") time.sleep(30)

Necesitáis tener esto:

https://chromedriver.chromium.org/downloads

Y esto:

https://blog.mailtrap.io/yagmail-tutorial/

En el parámetro : search_url = 'https://www.pccomponentes.com/buscar/?query=rx+6800+xt' es donde metéis la url de búsqueda que queréis .

2 5 respuestas
DiS4Bl3D

#635 muchas gracias

alfaplays

#634 que va, sigue todo igual. Al menos no la han hecho desaparecer...

manuelozanov

#635 muchisimas gracias

DiS4Bl3D

#635 entonces con tu script lo que tenemos que hacer es mirar el correo no?

1 respuesta
manuelozanov

#635 que habría que añadir el gmail y el usuario de pccomponentes nada más?

1 respuesta
sk1zo85

#639 #640

maxPrice=700 #precio maximo que quereis, ya que los que tengan precio mayor ya no os avisara
username= '' #datos pccomponentes para loggin
password= '' #datos pccomponentes para loggin
usergmail='' #datos para yagmail
passgmail='' #datos para yagmail
mailtosend='' #mail donde se manda notificación

yagmail necesita una cuenta gmail para mandar los mails a través de gmail por eso pide user y contraseña de gmail y hay que hacer algún cambio en la cuenta, esta explicado en el link que he añadido con el código.

Podéis mirar el correo, pero si lo ejecutáis el script estando delante el pc también mostrara por pantalla la url de los productos disponibles.

DiS4Bl3D

#635 también habría que cambiar el precio máximo 700 porque las custom creo que costaran mas no?
de todas formas el código que has puesto lo tenemos que poner en un editor de texto y guardarlo con una extensión Python para darle doble click y ya esta o como lo ejecutamos?

Por cierto te sirvió para pillar una?

1 respuesta
sk1zo85

#642 si lo guardas en archivo .py y para ejecutar lo he puesto mas arribar:

Se ejecuta desde la consola (cmd) como cualquier script python (py script.py)

De hecho tal como esta este script la parte del loggin no es necesaria ya que no hace el proceso de compra asi que podeis comentar la linea donde pone:

if name == 'main':
logging(username, password)

Dejad:

if name == 'main':
#logging(username, password)

Así no hacen falta los datos de pccomponentes y saltáis un paso innecesario. Ahora modifico el post de arriba.

2 respuestas
DiS4Bl3D

#643 y si tenemos login en doble paso con gmail afecta?

1 respuesta
alfaplays

Ni la NASA tu. En fin, felices Juegos del Hambre...

manuelozanov

ni idea de programar pero bueno, a intentarlo jajajaj

sk1zo85

#644 Creo que si, yo de hecho tenia una cuenta de gmail que solo uso para chorradas sin 2fa y tal para hacer los envíos.

DiS4Bl3D

#643 si mi intención es ejecutarlo delante del pc, como me sale el resultado por pantalla también puedo omitir todo el tema del correo no? si tengo logeado el usuario en pccomp cuando por pantalla me devuelva una url con el producto pincho y me entrara ya logueado al producto, correcto?

1 respuesta
sk1zo85

#648 Si puedes hacer eso sin problema, hice la parte de gmail pensando en si estaba en el curro y no podía estar siguiendo el tema..

Dejando así el código vale:


from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from multiprocessing import Process
import time

options = Options()
options.page_load_strategy = 'eager'
#options.page_load_strategy = 'normal'

login_url = 'https://www.pccomponentes.com/login'
search_url = 'https://www.pccomponentes.com/buscar/?query=rx+6800+xt'
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)
maxPrice=700   #precio maximo
username= ''   #datos pccomponentes para loggin
password= ''   #datos pccomponentes para loggin

def logging(username, password):
   # for logging into amazon
    driver.get(login_url)
    driver.find_element_by_xpath(
        '//*[@name="username"]').send_keys(username)
    driver.find_element_by_xpath(
        '//*[@name="password"]').send_keys(password + Keys.RETURN)
    # end of login code
		
def search():	

driver.get(search_url)

articulos = []
# articulos = driver.find_elements_by_xpath('//div[@id="articleListContent"]')
for i in driver.find_elements_by_xpath('//a[@class="GTM-productClick enlace-superpuesto cy-product-hover-link"]'):
    #print('Modelo:'+i.get_attribute("data-name"))
    #print('Id:'+i.get_attribute("data-id"))
    #print('Precio:'+i.get_attribute("data-price"))
    #print('Stock:'+i.get_attribute("data-stock-web"))
    #print('link:'+i.get_attribute("href"))
	#print('Sku:'+i.get_attribute("data-sku"))
    if float(i.get_attribute("data-price")) < float(maxPrice):
        articulos.append([i.get_attribute("data-price"),i.get_attribute("data-name"),i.get_attribute("href"),i.get_attribute("data-id")])
	#print(mat)

return articulos

def purchase(articulo):

  # for getting into our product page
    driver.get(articulo[2])
    time.sleep(3)

if(len(driver.find_elements_by_xpath('//button[@id="notify-me"]')) == 0):
    print("Disponible "+articulo[2])
    # click en el boton de compra
    #driver.find_element_by_xpath('//button[@class="btn btn-primary btn-lg buy GTM-addToCart buy-button js-article-buy"]').click()

if __name__ == '__main__':
    logging(username, password)
    
while True: print("Buscando Resultados...") articulos = search() for articulo in articulos: #print("Procesando:"+articulo[1]) purchase(articulo) print("Esperando 30 segundos para nueva busqueda...") time.sleep(30)

He quitado toda la parte de gmail así no necesitáis ni el yagmail ni los datos.

1
xPipOx

Cuanto es el precio recomendado por una 6800xt custom? 710?

Vamos despues de la guarra que esta haciendo PCC y demas tiendas si hay sobreprecio paso, contando que el precio de la referencia son 660 cuanto de mas suelen costar las custom en estas gamas?

2 respuestas
DiS4Bl3D

#650 pues yo creo que van a ir a los 750/800 pavos porque estamos muy faltos de stock y hay mucha demanda

1 respuesta
xPipOx

#651 Cabron pero eso no responde a mi pregunta, cual suele ser el sobreprecio de una grafica custom top respecto su precio recomendado de las referencia. Supongo que en muchos casos el mismo incluso pero algo asi un poco mas chulo 40-50e mas ¿no?

1 respuesta
DiS4Bl3D

#652 esque no creo que haya un precio estipulado para eso, si de normal puedes decir que de media son 50-100€ de más (inventado) no creo que en la situación actual valga esa media. En resumen estamos viendo como inflan precios en procesadores y graficas por la falta de stock, lo de las graficas custom es una incógnita pero no te asustes si ves 800€ frente a los 670€ de las normales del primer día que salieron.

B

#650 el recomendado es aquel que estes dispuesto a pagar,

no hay precio recomendado de custom. solo de referencia. ademas es recomendado, de precio pondran lo que quieran

1
alfaplays

Nos van a limpiar las cuentas ;-;

1 respuesta
B

#655 tu mete tu password que no pasa nada

1 respuesta
sk1zo85

Como veo que algunos tenéis problemas, he subido una versión super simple del script, no hace nada del mail ni loggin, solo muestra cuando hay un producto disponible, solo tenéis de cambiar el precio max que queréis.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
import time

options = Options()
options.page_load_strategy = 'eager'

search_url = 'https://www.pccomponentes.com/buscar/?query=rx+6800+xt'
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)
maxPrice=700   #precio maximo
		
def search():	

driver.get(search_url)

articulos = []
for i in driver.find_elements_by_xpath('//a[@class="GTM-productClick enlace-superpuesto cy-product-hover-link"]'):

    if float(i.get_attribute("data-price")) < float(maxPrice):
        articulos.append([i.get_attribute("data-price"),i.get_attribute("data-name"),i.get_attribute("href"),i.get_attribute("data-id")])

return articulos

def purchase(articulo):

  # for getting into our product page
    driver.get(articulo[2])
    time.sleep(3)

if(len(driver.find_elements_by_xpath('//button[@id="notify-me"]')) == 0):
    print("Disponible "+articulo[2])


if __name__ == '__main__':
 
while True:

    print("Buscando Resultados...")
    articulos = search()      
    for articulo in articulos:
        #print("Procesando:"+articulo[1])
        purchase(articulo)

    print("Esperando 30 segundos para nueva busqueda...")
    time.sleep(30)

http://www.mediafire.com/file/jw9ni89lzp09821/autobuy.py/file

Eso si requiere igualmente el webdriver de chrome que hay que copiarlo en la carpeta c:\windows

2 respuestas
Prava

Habría que cambiarle el título al hilo: "SEGUIMIENTO STOCK AMD RX6000 - APRENDIENDO A PROGRAMAR" (aunque quizá no quepa).

4 1 respuesta
BLZKZ

#657 Prava intensifies

DiS4Bl3D

#657 muchas gracias, aunque me sigue dando un error