diff --git a/your-code/output/API_ssd.py b/your-code/output/API_ssd.py new file mode 100644 index 0000000..1493658 --- /dev/null +++ b/your-code/output/API_ssd.py @@ -0,0 +1,28 @@ +import requests +import pandas as pd + +ruta_archivo = r'..\output\objetos_cercanos.csv' + +url = 'https://ssd-api.jpl.nasa.gov/cad.api?body=all' +res = requests.get(url) +res_json = res.json() + +res_json.keys() + +fields = res_json['fields'] +data = res_json['data'] + +df = pd.DataFrame(data, columns=fields) + +df = df[['des','orbit_id','cd','dist','v_rel','t_sigma_f','body','h']] + +columnas = ['Designacion', 'id_orbita', 'Fecha_aproximacion_cercana', +'Distancia_au', 'Velocidad_relativa_km/s','Incertidumbre_temporal', +'Cuerpo','Mgnitud_absoluta'] + +df.columns = columnas + +print(df.info()) +print(df.head()) + +df.to_csv(ruta_archivo,index=False) \ No newline at end of file diff --git a/your-code/output/README.md b/your-code/output/README.md new file mode 100644 index 0000000..e69de29 diff --git a/your-code/output/api_ssd.ipynb b/your-code/output/api_ssd.ipynb new file mode 100644 index 0000000..e69de29 diff --git a/your-code/output/articulos_electronica.csv b/your-code/output/articulos_electronica.csv new file mode 100644 index 0000000..4636706 --- /dev/null +++ b/your-code/output/articulos_electronica.csv @@ -0,0 +1,49 @@ +articulo,precio +40 Cables Dupont Macho a Macho 20 cm,$ 55.00 +40 Cables Dupont Macho a Hembra 20 cm,$ 40.00 +Arduino Uno R3 ATmega328 Compatible,$ 300.00 +Arduino nano ATmega328 Compatible,$ 140.00 +40 Cables Dupont Hembra a Hembra 20 cm,$ 35.00 +40 Cables Dupont Macho a Macho de 10 cm,$ 30.00 +40 Cables Dupont Macho a Hembra de 10 CM,$ 30.00 +Arduino Mega ATmega2560 compatible,$ 580.00 +40 Cables Dupont Macho a Hembra de 30 cm,$ 50.00 +Convertidor USB A TTL PL2303,$ 35.00 +40 Cables Dupont Macho a Macho 30 cm,$ 50.00 +40 Cables Dupont Hembra a Hembra de 10 cm,$ 30.00 +65 Cables Dupont Macho a Macho,$ 45.00 +Fuente regulada LM2596,$ 40.00 +Ethernet Shield con conector micro SD,$ 520.00 +Kit de arduino básico 263 elementos,"$ 1,400.00" +Arduino Pro Mini 328 - 5V/16MHz,$ 120.00 +40 Cables Dupont Hembra a Hembra 30 cm,$ 50.00 +Carcasa de acrílico para Arduino Uno Talos,$ 80.00 +Arduino Shield L293D,$ 90.00 +Fuente de voltaje ajustable DC-DC 5A,$ 120.00 +Arduino UNO Sensor Shield Edición V5,$ 60.00 +Arduino Leonardo ATmega32u4 Compatible,$ 260.00 +Programador USB ISP 51/AVR,$ 85.00 +Kit sensores Arduino 37pcs,$ 800.00 +Módulo Ethernet ENC28J60 para Arduino,$ 160.00 +CNC Shield V3 para Arduino,$ 95.00 +Kit de Arduino RFID 159 elementos,"$ 1,249.00" +Protoshield para arduino UNO,$ 70.00 +Tornillo Shield V1 para Arduino UNO y Leonardo,$ 150.00 +Carcasa de acrílico para Arduino MEGA Talos,$ 90.00 +LCD y Teclado Shield para Arduino,$ 145.00 +Arduino MEGA Sensor Shield V2.0,$ 110.00 +Módulo Bluetooth XBee FT232RL + Cable USB,$ 195.00 +Game Joystick Arduino Shield,$ 160.00 +Tornillo Shield V2 para Arduino UNO y Leonardo,$ 140.00 +Arduino DUE ATSAM3X8E Compatible + Cable,$ 620.00 +Fuente de voltaje ajustable LM2577,$ 125.00 +Módulo CH340G USB a TTL STC,$ 45.00 +Módulo GPS Neo GPS6MV2,$ 200.00 +Base Arduino MEGA y proto 830pts,$ 115.00 +Carcasa de acrílico para Arduino UNO Tipo B Talos,$ 95.00 +Fuente de voltaje ajustable step-down MP1584,$ 30.00 +Fuente voltaje y corriente Ajustable XL4015,$ 120.00 +Fuente de voltaje ajustable 10-32V a 12-35V,$ 110.00 +Módulo Bluetooh xBee B3.0,$ 280.00 +Carcasa de acrílico para Arduino MEGA Tipo B Talos,$ 110.00 +Carcasa de Plástico ABS para Arduino Uno transparente,$ 120.00 diff --git a/your-code/output/main.ipynb b/your-code/output/main.ipynb new file mode 100644 index 0000000..0d3cb5e --- /dev/null +++ b/your-code/output/main.ipynb @@ -0,0 +1,6879 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Código para entregar una tabla comparatva de los precios de un Arduino UNO (o tarjeta similar genérica) \n", + "# en las tiendas electrónicas de México en archivo CSV\n", + "\n", + "import requests\n", + "from bs4 import BeautifulSoup\n", + "import numpy as np\n", + "import pandas as pd\n", + "import re\n", + "import time\n", + "from selenium import webdriver\n", + "from selenium.webdriver.common.keys import Keys\n", + "from selenium.webdriver.common.action_chains import ActionChains\n", + "import random as rd" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "# Lista de links a los artículos\n", + "ing_maker = 'https://www.ingenieromaker.com/product-page/compatible-arduino-uno-r3-c-cable'\n", + "microbot = 'https://microbot.mx/products/arduino-uno-r3?_pos=1&_sid=f47977e88&_ss=r'\n", + "articles_list = [microbot, ing_maker]\n", + "\n", + "\n", + "url = 'https://www.taloselectronics.com/collections/arduino'" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "html = requests.get(ing_maker)\n", + "html" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\User\\AppData\\Local\\Temp/ipykernel_9988/725772910.py:8: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", + " driver = webdriver.Chrome(path)\n" + ] + } + ], + "source": [ + "# Utilizando el driver para extraer el código fuente de cada pagina de la lista de urls\n", + "path = r'C:\\Program Files\\ChromeDriver\\chromedriver.exe'\n", + "\n", + "def get_source(url):\n", + " ''' Esta función toma una url y regresa el código fuente\n", + " utilizando el driver de Chrome\n", + " '''\n", + " driver = webdriver.Chrome(path)\n", + " driver.get(url)\n", + "\n", + " rand_keys(driver)\n", + "\n", + " page_source = driver.page_source\n", + " \n", + " driver.quit()\n", + "\n", + " return page_source\n", + "\n", + "\n", + "def rand_keys(driver):\n", + " ''' Esta función envía teclas presionadas al driver de Chrome.\n", + " La tecla presionada es aleatoria así como el intervalo de\n", + " tiempo entre cada acción.\n", + " '''\n", + " keys_list = ['END', 'HOME', 'ARROW_DOWN', 'ARROW_UP']\n", + " time.sleep(rd.randint(1,3))\n", + "\n", + " for i in range(rd.randint(1,20)):\n", + " ActionChains(driver).send_keys(Keys.ARROW_DOWN).perform()\n", + " time.sleep(rd.randint(1,3))\n", + " \n", + "\n", + "sources = get_source(url)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n \\n \\n \\n \\n \\n\\n \\n \\n \\n \\n \\n\\n \\n \\n \\n \\n\\n \\n \\n\\n \\n \\n\\n \\n\\n \\n \\n \\n\\n \\n\\n \\n \\n\\n\\n\\n\\n\\n\\n \\n \\n \\n \\n\\n\\n\\n \\n \\n\\n \\n \\n \\n \\n\\n \\n \\n \\n\\n \\n\\n \\n \\n \\n\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n \\n\\n \\n \\n\\n\\n\\n\\n \\n \\n \\n \\n\\n \\n \\n \\n \\n\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\\n \\n \\n\\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n\\n \\n \\n \\n \\n \\n \\n \\n\\n \\n \\n\\n \\n \\n \\n \\n \\n \\n\\n \\n \\n \\n\\n \\n\\n \\n\\n \\n\\n \\n \\n \\n \\n\\n\\n\\n\\n \\n\\n\\n\\n \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCompatible Arduino UNO R3 c/cable | Ingeniero Maker\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n \\n \\n \\n \\n \\n\\n\\n\\n\\n\\n\\n\\n\\n
 
  • \"Icono
  • \"s-facebook\"
  • \"YouTube
ES
ES
EN
PT
\"\"

Ingeniero Maker

\"bolivia.png\"
\"\"
\"ecuador.png\"

Hacemos entregas personales en el metro o Metrobús 18 de marzo (CDMX)

\"Compatible
\"Compatible
\"Compatible
\"Compatible
La tarjeta compatible con el Arduino UNO R3 es una tarjeta diseñada para cumplir todas las funciones del Arduino UNO R3 pero a un precio accesible para el estudiante o para cualquier persona que quiera disfrutar sus bondades pero a un precio reducido. 

Incluye cable USB (Puede variar en color y/o tamaño según disponibilidad).

Compatible Arduino UNO R3 c/cable

SKU: IM-ARD-009
$200.00 Precio
$180.00Precio de oferta
  • Usa el Microcontrolador ATmega328P

    \\n\\n

    Voltaje de operación: 5V

    \\n\\n

    Voltaje de entrada: 5 a 9V

    \\n\\n

    Voltajes de salida: 5V y 3.3V en los pines indicados

    \\n\\n

    Corriente máxima por pin: 40mA

    \\n\\n

    Memoria flash: 32kB de la cual 5kB es usada por el bootloader

    \\n\\n

    SRAM 2kB

    \\n\\n

    EEPROM: 1kB

    \\n\\n

    Frecuencia del oscilador: 16MHz

    \\n\\n

    14 pines de entrada/salida de los cuales 6 son salidas de PWM

    \\n\\n

    5 canales de entrada analógicos

    \\n

Ingeniero Maker Mexico D.F. Todos los derechos reservados

\\n\\n

Teléfono celular: 5540497142  

\\n\\n

e-mail: tony@ingenieromaker.com                                                                                                                                                     Aviso de Privacidad

\\n\\n

Terminos y condiciones de compra y servicio

\\n\\n

Electrónica, sensores, mecatrónica, robótica, etc. 

© 2020

 
\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n \\n \\n \\n \\n \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
'" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# type(sources)\n", + "sources" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Arduino — Talos Electronics\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "Ir a contenido\n", + "
\n", + "
\n", + "
\n", + " Tienda de electrónica en México. Llámanos: 33 27 37 64 13 - Whatsapp. 33 26 13 22 69. Atención de Lunes a Viernes de 9:30am a 5:30pm.\n", + "
\n", + "
\n", + " \n", + " Tienda de electrónica en México. Llámanos: 33 27 37 64 13 - Whatsapp. 33 26 13 22 69. Atención de Lunes a Viernes de 9:30am a 5:30pm.\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "\"Talos\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + " \n", + "\n", + "
\n", + "\n", + " Envíos GRATIS\n", + " \n", + "
\n", + "

en compras

mayores a $750

\n", + "
\n", + "
\n", + "

Compras mayores a $750
Ordena el material de todo tu salón y obtén un descuento.

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Cerrar\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "\n", + "\"Arduino\"\n", + "
\n", + "
\n", + "

\n", + " Arduino\n", + "

\n", + "
\n", + "
\n", + "
\n", + "

\n", + " Filtros\n", + "

\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + " Ordenar por\n", + " \n", + "
    \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
  • \n", + "
  • \n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

\n", + "\n", + "\n", + "\n", + " Añadido a su carrito:\n", + "

\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " ** total_quantity ** | ** unit_price ** / ** unit_measure **\n", + " \n", + "\n", + "
    \n", + "
  • \n", + " \n", + "\n", + " (-)\n", + "
  • \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + " Subtotal del carrito\n", + " \n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "\n", + "
" + ] + }, + "execution_count": 192, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Generando conexión con la url y la sopa\n", + "def give_me_soup(source):\n", + " \"\"\" Esta función toma un listado de urls y devuelve un listado de contenidos html\n", + " en forma de sopa.\n", + " \"\"\"\n", + " soup = BeautifulSoup(source, 'html')\n", + " return soup\n", + "\n", + "soup = give_me_soup(sources)\n", + "soup" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\User\\AppData\\Local\\Temp/ipykernel_9988/725772910.py:8: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", + " driver = webdriver.Chrome(path)\n" + ] + } + ], + "source": [ + "articulo = soup.select('ul div a')\n", + "# articulo = articulo[0].text\n", + "links = [articulo[i]['href'] for i in range(len(articulo))]\n", + "links_href = []\n", + "for link in links:\n", + " if link not in links_href:\n", + " links_href.append(link)\n", + "\n", + "art_links = ['https://www.taloselectronics.com/'+link for link in links_href if link.startswith('/collections/arduino')]\n", + "# art_links\n", + "\n", + "articles = [get_source(art_link)for art_link in art_links]\n", + "# len(articles)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "24" + ] + }, + "execution_count": 202, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "art_soups = [give_me_soup(art) for art in articles]\n", + "\n", + "len(art_soups)" + ] + }, + { + "cell_type": "code", + "execution_count": 249, + "metadata": {}, + "outputs": [], + "source": [ + "# maruchan = art_soups[23]\n", + "# articulo = maruchan.select('h1')\n", + "# articulo = articulo[0].text.strip()\n", + "\n", + "# maruchan = art_soups[23]\n", + "# precio = maruchan.select('article span[class=\"money\"]')\n", + "# precio[1].text.strip()\n", + "\n", + "articles_name = []\n", + "articles_price = []\n", + "for art_soup in art_soups:\n", + " articulo = art_soup.select('h1')\n", + " articulo = articulo[0].text.strip()\n", + " articles_name.append(articulo)\n", + " precio = art_soup.select('article span[class=\"money\"]')\n", + " precio = precio[1].text.strip() \n", + " articles_price.append(precio)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 253, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'40 Cables Dupont Macho a Macho 20 cm': '$ 55.00',\n", + " '40 Cables Dupont Macho a Hembra 20 cm': '$ 40.00',\n", + " 'Arduino Uno R3 ATmega328 Compatible': '$ 300.00',\n", + " 'Arduino nano ATmega328 Compatible': '$ 140.00',\n", + " '40 Cables Dupont Hembra a Hembra 20 cm': '$ 35.00',\n", + " '40 Cables Dupont Macho a Macho de 10 cm': '$ 30.00',\n", + " '40 Cables Dupont Macho a Hembra de 10 CM': '$ 30.00',\n", + " 'Arduino Mega ATmega2560 compatible': '$ 580.00',\n", + " '40 Cables Dupont Macho a Hembra de 30 cm': '$ 50.00',\n", + " 'Convertidor USB A TTL PL2303': '$ 35.00',\n", + " '40 Cables Dupont Macho a Macho 30 cm': '$ 50.00',\n", + " '40 Cables Dupont Hembra a Hembra de 10 cm': '$ 30.00',\n", + " '65 Cables Dupont Macho a Macho': '$ 45.00',\n", + " 'Fuente regulada LM2596': '$ 40.00',\n", + " 'Ethernet Shield con conector micro SD': '$ 520.00',\n", + " 'Kit de arduino básico 263 elementos': '$ 1,400.00',\n", + " 'Arduino Pro Mini 328 - 5V/16MHz': '$ 120.00',\n", + " '40 Cables Dupont Hembra a Hembra 30 cm': '$ 50.00',\n", + " 'Carcasa de acrílico para Arduino Uno Talos': '$ 80.00',\n", + " 'Arduino Shield L293D': '$ 90.00',\n", + " 'Fuente de voltaje ajustable DC-DC 5A': '$ 120.00',\n", + " 'Arduino UNO Sensor Shield Edición V5': '$ 60.00',\n", + " 'Arduino Leonardo ATmega32u4 Compatible': '$ 260.00',\n", + " 'Programador USB ISP 51/AVR': '$ 85.00'}" + ] + }, + "execution_count": 253, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "art_dict = {}\n", + "for name,price in zip(articles_name, articles_price):\n", + " art_dict[name] = price\n", + "\n", + "art_dict\n" + ] + }, + { + "cell_type": "code", + "execution_count": 272, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
articuloprecio
040 Cables Dupont Macho a Macho 20 cm$ 55.00
140 Cables Dupont Macho a Hembra 20 cm$ 40.00
2Arduino Uno R3 ATmega328 Compatible$ 300.00
3Arduino nano ATmega328 Compatible$ 140.00
440 Cables Dupont Hembra a Hembra 20 cm$ 35.00
540 Cables Dupont Macho a Macho de 10 cm$ 30.00
640 Cables Dupont Macho a Hembra de 10 CM$ 30.00
7Arduino Mega ATmega2560 compatible$ 580.00
840 Cables Dupont Macho a Hembra de 30 cm$ 50.00
9Convertidor USB A TTL PL2303$ 35.00
1040 Cables Dupont Macho a Macho 30 cm$ 50.00
1140 Cables Dupont Hembra a Hembra de 10 cm$ 30.00
1265 Cables Dupont Macho a Macho$ 45.00
13Fuente regulada LM2596$ 40.00
14Ethernet Shield con conector micro SD$ 520.00
15Kit de arduino básico 263 elementos$ 1,400.00
16Arduino Pro Mini 328 - 5V/16MHz$ 120.00
1740 Cables Dupont Hembra a Hembra 30 cm$ 50.00
18Carcasa de acrílico para Arduino Uno Talos$ 80.00
19Arduino Shield L293D$ 90.00
20Fuente de voltaje ajustable DC-DC 5A$ 120.00
21Arduino UNO Sensor Shield Edición V5$ 60.00
22Arduino Leonardo ATmega32u4 Compatible$ 260.00
23Programador USB ISP 51/AVR$ 85.00
\n", + "
" + ], + "text/plain": [ + " articulo precio\n", + "0 40 Cables Dupont Macho a Macho 20 cm $ 55.00\n", + "1 40 Cables Dupont Macho a Hembra 20 cm $ 40.00\n", + "2 Arduino Uno R3 ATmega328 Compatible $ 300.00\n", + "3 Arduino nano ATmega328 Compatible $ 140.00\n", + "4 40 Cables Dupont Hembra a Hembra 20 cm $ 35.00\n", + "5 40 Cables Dupont Macho a Macho de 10 cm $ 30.00\n", + "6 40 Cables Dupont Macho a Hembra de 10 CM $ 30.00\n", + "7 Arduino Mega ATmega2560 compatible $ 580.00\n", + "8 40 Cables Dupont Macho a Hembra de 30 cm $ 50.00\n", + "9 Convertidor USB A TTL PL2303 $ 35.00\n", + "10 40 Cables Dupont Macho a Macho 30 cm $ 50.00\n", + "11 40 Cables Dupont Hembra a Hembra de 10 cm $ 30.00\n", + "12 65 Cables Dupont Macho a Macho $ 45.00\n", + "13 Fuente regulada LM2596 $ 40.00\n", + "14 Ethernet Shield con conector micro SD $ 520.00\n", + "15 Kit de arduino básico 263 elementos $ 1,400.00\n", + "16 Arduino Pro Mini 328 - 5V/16MHz $ 120.00\n", + "17 40 Cables Dupont Hembra a Hembra 30 cm $ 50.00\n", + "18 Carcasa de acrílico para Arduino Uno Talos $ 80.00\n", + "19 Arduino Shield L293D $ 90.00\n", + "20 Fuente de voltaje ajustable DC-DC 5A $ 120.00\n", + "21 Arduino UNO Sensor Shield Edición V5 $ 60.00\n", + "22 Arduino Leonardo ATmega32u4 Compatible $ 260.00\n", + "23 Programador USB ISP 51/AVR $ 85.00" + ] + }, + "execution_count": 272, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame.from_dict(articles_name)\n", + "df2= pd.DataFrame.from_dict(articles_price)\n", + "df = pd.concat([df, df2], axis=1)\n", + "df.columns = ['articulo','precio']\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'$ 85.00'" + ] + }, + "execution_count": 245, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "maruchan = art_soups[23]\n", + "precio = maruchan.select('article span[class=\"money\"]')\n", + "precio[1].text.strip()" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'$180.00'" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Seleccionando de la sopa\n", + "articulo = soup.select('h1')\n", + "articulo = articulo[0].text\n", + "\n", + "precio = soup.select('article span[data-hook=\"formatted-primary-price\"]')\n", + "precio = precio[0].text\n", + "precio\n", + "\n", + "# nombre_art = soup.select('article h1')\n", + "# nombre_art\n", + "# precio = soup.select('article span[data-hook=\"formatted-primary-price\"]')\n", + "# precio = precio[0].text\n", + "# precio" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Func select y select_plus\n", + "def select_content():\n", + " \n", + " pass" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "2647ea34e536f865ab67ff9ddee7fd78773d956cec0cab53c79b32cd10da5d83" + }, + "kernelspec": { + "display_name": "Python 3.9.7 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/your-code/output/objetos_cercanos.csv b/your-code/output/objetos_cercanos.csv new file mode 100644 index 0000000..b5ff42d --- /dev/null +++ b/your-code/output/objetos_cercanos.csv @@ -0,0 +1,53 @@ +Designacion,id_orbita,Fecha_aproximacion_cercana,Distancia_au,Velocidad_relativa_km/s,Incertidumbre_temporal,Cuerpo,Mgnitud_absoluta +2016 JG12,41,2021-Nov-20 00:23,0.0369165706489928,7.47734218550301,< 00:01,Earth,22.53 +2021 TR15,8,2021-Nov-20 00:29,0.030454045218752,6.98300523232658,< 00:01,Earth,24.63 +2021 VP10,3,2021-Nov-20 02:34,0.00462916619015841,7.88689125321877,00:07,Moon,27.869 +2021 VP10,3,2021-Nov-20 14:53,0.00514387234391849,8.2777401127482,00:07,Earth,27.869 +2021 KH2,7,2021-Nov-21 00:25,0.0494202303118363,6.51253949996388,< 00:01,Earth,25.29 +1999 XK136,29,2021-Nov-21 13:30,0.0165573454149366,12.6764985548603,00:03,Venus,20.3 +2021 VW5,4,2021-Nov-21 16:17,0.0400456526289211,3.42660310556936,00:07,Earth,26.62 +3361,172,2021-Nov-21 19:20,0.0385607791994219,8.13939947244608,< 00:01,Earth,19.24 +2021 VQ26,2,2021-Nov-22 11:58,0.0118682501245768,10.4225693967833,00:05,Earth,24.109 +2021 VL16,1,2021-Nov-23 22:28,0.0366069671769688,8.36758405318245,00:06,Earth,26.331 +2014 WF201,12,2021-Nov-24 22:45,0.0336679602889608,5.45672976550807,13:25,Earth,25.6 +2021 VR4,2,2021-Nov-25 03:25,0.00548712837324514,7.72342766651524,00:55,Earth,26.558 +2002 JE9,51,2021-Nov-25 04:30,0.00494076941567594,13.6924553471742,< 00:01,Venus,21.4 +2021 VR4,2,2021-Nov-25 06:26,0.00768975581826847,6.76357508997615,01:07,Moon,26.558 +2009 WB105,25,2021-Nov-25 06:31,0.0386856183293863,18.8886414731086,< 00:01,Earth,23.5 +2021 VF11,2,2021-Nov-25 16:05,0.0475764229872822,1.34810119116721,00:02,Earth,27.096 +2019 BB5,5,2021-Nov-25 17:18,0.0480110478137196,8.34811069174473,06:13,Earth,26.7 +2021 VM,3,2021-Nov-27 03:24,0.0239730092258416,8.93845285548012,00:15,Earth,25.38 +2020 TZ5,4,2021-Nov-27 16:14,0.0298935942626182,4.00520585755241,2_01:16,Mars,23.3 +2021 VO12,2,2021-Nov-28 15:39,0.0187515506370561,13.4915828610281,00:10,Earth,24.171 +1994 WR12,25,2021-Nov-29 06:03,0.0411219670941506,8.82373124453306,00:01,Earth,22.3 +2021 JB,6,2021-Dec-03 07:16,0.0396412654577259,6.69950605562626,09:18,Venus,26.69 +2021 UP4,2,2021-Dec-04 19:43,0.0356233448734544,8.31529986298527,00:15,Earth,24.15 +2019 JD7,13,2021-Dec-05 04:59,0.0285227461613564,8.90769885132612,00:02,Venus,21.90 +2020 XR1,5,2021-Dec-05 22:11,0.0322123051786317,29.4429833179663,11:36,Mercury,23.8 +2021 VX7,6,2021-Dec-06 02:25,0.037941077149092,6.14228152706662,00:04,Earth,24.668 +2018 YG,3,2021-Dec-06 08:11,0.0454136316438688,32.3442488879733,00:04,Mercury,24.3 +4660,181,2021-Dec-11 13:51,0.0262988224542705,6.57822864352711,< 00:01,Earth,18.35 +2019 QM5,7,2021-Dec-12 12:54,0.0243807953480248,17.9498220806853,1_00:40,Mars,21.6 +2019 XQ1,4,2021-Dec-13 13:51,0.0361183020857895,9.13438529798828,01:40,Earth,25.4 +2016 NR,12,2021-Dec-14 02:29,0.0256632719449654,11.6985791276465,00:05,Venus,23.8 +2021 VT6,4,2021-Dec-14 10:19,0.0197834720231418,6.9443963334251,02:01,Earth,24.037 +2004 YC,9,2021-Dec-15 20:01,0.0472060962949736,8.12429775498109,3_01:05,Earth,25.6 +163899,144,2021-Dec-17 17:26,0.0362814859394219,5.61061834995688,< 00:01,Earth,17.56 +2016 YY10,3,2021-Dec-21 07:31,0.028808458733509,9.24235782762831,4_11:39,Earth,25.9 +2017 XQ60,8,2021-Dec-21 08:58,0.0351743548406297,15.7427570921525,< 00:01,Earth,24.4 +2016 TR54,23,2021-Dec-24 06:30,0.0432458901998697,15.5301379579902,< 00:01,Earth,22.1 +2019 WN2,6,2021-Dec-25 02:21,0.00796383534663379,5.08168014019648,02:59,Mars,27.6 +2018 AH,12,2021-Dec-27 16:27,0.0303977239041108,12.7037995422583,3_14:40,Earth,22.5 +2017 AE3,10,2021-Dec-29 01:54,0.0236956837788724,19.0836225730656,6_06:03,Earth,21.8 +2021 BD,2,2022-Jan-01 12:53,0.0358458435867939,46.4118421763132,18:25,Mercury,26.9 +2013 GV68,34,2022-Jan-01 20:07,0.0458371118078146,28.1882731881133,00:01,Mercury,18.9 +2014 YE15,11,2022-Jan-06 03:54,0.0494909337316518,6.37967766581341,00:08,Earth,28.3 +2019 CH1,5,2022-Jan-06 05:36,0.0493138172102694,25.1981280966746,00:03,Venus,21.0 +2020 AP1,2,2022-Jan-07 17:32,0.0116565977792099,5.65179413914172,8_20:07,Earth,29.6 +2013 YD48,23,2022-Jan-11 23:39,0.0373977429962872,14.770440845013,02:25,Earth,22.6 +2008 QU3,26,2022-Jan-14 22:45,0.0347076231924351,13.3861945062755,< 00:01,Venus,20.61 +2021 BA,6,2022-Jan-18 07:54,0.0251227022635361,9.09593847332264,00:50,Earth,26.01 +480934,47,2022-Jan-18 09:31,0.0157326058413912,12.5713343835922,< 00:01,Mars,17.57 +388188,78,2022-Jan-18 12:50,0.0191587250173642,30.292528856863,< 00:01,Venus,18.9 +2015 DR215,18,2022-Jan-18 15:22,0.0396553214560677,18.7833943672152,00:01,Venus,20.44 +7482,144,2022-Jan-18 21:51,0.0132450566543752,19.5554663946525,< 00:01,Earth,16.56 diff --git a/your-code/output/web_scrapper_electronica.py b/your-code/output/web_scrapper_electronica.py new file mode 100644 index 0000000..4504544 --- /dev/null +++ b/your-code/output/web_scrapper_electronica.py @@ -0,0 +1,138 @@ +from bs4 import BeautifulSoup +import pandas as pd +import time +from selenium import webdriver +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.action_chains import ActionChains +import random as rd +from selenium.webdriver.chrome.options import Options + +url1 = 'https://www.taloselectronics.com/collections/arduino?page=1&grid_list=grid-view' +url2 = 'https://www.taloselectronics.com/collections/arduino?page=2&grid_list=grid-view' +url3 = 'https://www.taloselectronics.com/collections/arduino?page=3&grid_list=grid-view' + +path = r'C:\Program Files\ChromeDriver\chromedriver.exe' +ruta_archivo = r'..\output\articulos_electronica.csv' + +def get_source(url): + ''' Esta función toma una url y regresa el código fuente + utilizando el driver de Chrome + ''' + chrome_options = Options() + chrome_options.add_argument("--headless") + + driver = webdriver.Chrome(path, options=chrome_options) + driver.get(url) + + rand_keys(driver) + + page_source = driver.page_source + print('Extracción terminada') + driver.quit() + + return page_source + + +def rand_keys(driver): + ''' Esta función envía teclas presionadas al driver de Chrome. + La tecla presionada es aleatoria así como el intervalo de + tiempo entre cada acción. + ''' + keys_list = ['END', 'HOME', 'ARROW_DOWN', 'ARROW_UP'] + time.sleep(rd.randint(1,3)) + + for i in range(rd.randint(1,20)): + ActionChains(driver).send_keys(Keys.ARROW_DOWN).perform() + print('Presionando tecla') + time.sleep(rd.randint(1,3)) + +# Generando la sopa +def give_me_soup(source): + """ Esta función toma un listado de urls y devuelve un listado de contenidos html + en forma de sopa. + """ + soup = BeautifulSoup(source, 'html') + return soup + +page_to_scrap = input('Ingresa el número de la página que vamos a scrapear: 1, 2 o 3') +while page_to_scrap not in ['1','2','3']: + page_to_scrap = input('Ese numero no es válido. 1, 2 o 3') + +if page_to_scrap == '1': + url = url1 +elif page_to_scrap == '2': + url = url2 +elif page_to_scrap == '3': + url = url3 + +sources = get_source(url) +soup = give_me_soup(sources) + +articulo = soup.select('ul div a') + +# Extrayendo el link de su tag y almacenandolo en una lista +links = [articulo[i]['href'] for i in range(len(articulo))] +links_href = [] +for link in links: + if link not in links_href: + links_href.append(link) + +# Purgando la lista de links para dejar sólo artículos +art_links = ['https://www.taloselectronics.com/'+link for link in links_href if link.startswith('/collections/arduino')] + +# Entrando a cada url de los artículos de la página y extrayendo su contenido +# articles = [get_source(art_link) for art_link in art_links] +articles = [] +for i,art_link in enumerate(art_links): + print(f'obteniendo el artículo num. {i} de {art_link}\n') + get_source(art_link) + +# Obteniendo el HTML de cada artículo +art_soups = [give_me_soup(art) for art in articles] + +# Extrayendo nombre y precio de cada artíciulo en una lista +articles_name = [] +articles_price = [] +for art_soup in art_soups: + articulo = art_soup.select('h1') + articulo = articulo[0].text.strip() + articles_name.append(articulo) + precio = art_soup.select('article span[class="money"]') + precio = precio[1].text.strip() + articles_price.append(precio) + +# Creando un dataframe vació con dos columnas +df = pd.DataFrame(columns=['articulo','precio']) + +# Creando dos tablas con nombres y precios c/u y concatenandolos en el dataframe +articulos = pd.DataFrame(articles_name) +precios= pd.DataFrame(articles_price) +df = pd.concat([articulos, precios], axis=1) + +if page_to_scrap == '1': + # Guardar primera tabla + df.to_csv(ruta_archivo, index=False) + print('archivo CSV actualizado') + df_anterior = df + print(f'Tabla de articulos en {url1}: \n') + df_anterior + + +elif page_to_scrap == '2': + + df_anterior = pd.read_csv(ruta_archivo) + nuevo_df = df_anterior + nuevo_df = pd.concat([df]) + nuevo_df.to_csv(ruta_archivo, index=False) + print(f'Tabla de articulos en {url1} y {url2}: \n') + print('archivo CSV actualizado') + nuevo_df + +else: + df_anterior = pd.read_csv(ruta_archivo) + nuevo_df = df_anterior + nuevo_df = pd.concat([df]) + nuevo_df.to_csv(ruta_archivo, index=False) + print(f'Tabla de articulos en {url1}, {url2} y {url3}: \n') + print('archivo CSV actualizado') + nuevo_df \ No newline at end of file