{"id":45890,"date":"2026-06-24T11:19:06","date_gmt":"2026-06-24T11:19:06","guid":{"rendered":"https:\/\/floppydata.com\/sin-categoria\/guia-para-extraer-datos-de-ebay-como-extraer-datos-de-ebay\/"},"modified":"2026-06-24T11:19:06","modified_gmt":"2026-06-24T11:19:06","slug":"ebay-scraper-guide-how-to-extract-data-from-ebay","status":"publish","type":"post","link":"https:\/\/floppydata.com\/es\/blog\/ebay-scraper-guide-how-to-extract-data-from-ebay\/","title":{"rendered":"Gu\u00eda para extraer datos de eBay: c\u00f3mo extraer datos de eBay"},"content":{"rendered":"<p>eBay cuenta con una mina de oro de datos p\u00fablicos sobre precios. Millones de anuncios activos de art\u00edculos de colecci\u00f3n, electr\u00f3nica, piezas descatalogadas\u2026 lo que se te ocurra: todos ellos \u00fatiles para el seguimiento de precios, la investigaci\u00f3n de mercado o el an\u00e1lisis de la competencia. El problema es acceder a esos datos de forma fiable. Con un sencillo script de Python quiz\u00e1 consigas ver unas cuantas p\u00e1ginas antes de que eBay empiece a lanzarte CAPTCHAs.   <\/p>\n<p>As\u00ed que, en esta gu\u00eda, te explicar\u00e9 paso a paso c\u00f3mo extraer datos de eBay correctamente utilizando Web Unlocker de Floppydata y conseguir resultados reales.<\/p>\n<div style=\"border-left: 3px solid #e5e7eb; padding-left: 16px; margin: 24px 0;\">\n<div style=\"font-size: 11px; font-weight: 600; color: #9ca3af; text-transform: uppercase; margin-bottom: 8px;\">TL;DR<\/div>\n<p style=\"font-size: 14px; line-height: 1.6; color: #6b7280; font-style: italic; margin: 0;\">C\u00f3mo extraer datos de los anuncios de eBay sin perder tiempo con los CAPTCHA y los selectores que no funcionan<\/p>\n<p style=\"font-size: 14px; line-height: 1.6; color: #6b7280; margin: 8px 0 0 0;\">\u2022 eBay bloquea r\u00e1pidamente los rastreadores b\u00e1sicos: CAPTCHAs, l\u00edmites de velocidad, detecci\u00f3n de bots\u2026 todo eso. Una simple solicitud en Python no es suficiente. <\/p>\n<p style=\"font-size: 14px; line-height: 1.6; color: #6b7280; margin: 8px 0 0 0;\">\u2022 La opci\u00f3n m\u00e1s sencilla es el Web Unlocker de Floppydata: se encarga de la capa antibots y te devuelve un c\u00f3digo HTML limpio.<\/p>\n<p style=\"font-size: 14px; line-height: 1.6; color: #6b7280; margin: 8px 0 0 0;\">\u2022 A partir de ah\u00ed, solo necesitas Python y BeautifulSoup para extraer los datos de los anuncios con el fin de realizar un seguimiento de los precios, investigar y analizar.<\/p>\n<p style=\"font-size: 14px; line-height: 1.6; color: #6b7280; margin: 8px 0 0 0;\">\u2022 La mayor\u00eda de los tutoriales sobre scraping que hay por ah\u00ed ya no funcionan: eBay cambi\u00f3 de <code>li.s-item<\/code> a <code>li.s-card<\/code> y muchos selectores nunca se actualizaron.<\/p>\n<p style=\"font-size: 14px; line-height: 1.6; color: #6b7280; margin: 8px 0 0 0;\">\u2022 Las nuevas cuentas de Floppydata disponen de cinco extracciones gratuitas, por lo que puedes seguir esta gu\u00eda sin tener que gastar nada por adelantado.<\/p>\n<\/div>\n<h2>Entonces, \u00bfen qu\u00e9 consiste realmente el \u00abscraping\u00bb en eBay?<\/h2>\n<p>La verdad es que es bastante sencillo. Solo tienes que extraer los datos de los anuncios disponibles p\u00fablicamente de las p\u00e1ginas de eBay y convertirlos en un formato con el que puedas trabajar: un archivo CSV, un archivo JSON o lo que sea. En lugar de ir haciendo clic en los anuncios uno por uno, un rastreador recoge toda esa informaci\u00f3n de forma masiva.  <\/p>\n<p>Hay dos tipos de p\u00e1gina que conviene conocer antes de entrar en el c\u00f3digo propiamente dicho:<\/p>\n<ul>\n<li><strong>P\u00e1ginas de resultados de b\u00fasqueda<\/strong>: vista resumida con t\u00edtulo, precio, estado, gastos de env\u00edo y un enlace al anuncio.<\/li>\n<li><strong>Las p\u00e1ginas de detalles de los art\u00edculos<\/strong>, es decir, las URL del tipo <code>\/itm\/ITEM_ID<\/code>, donde se encuentra la informaci\u00f3n m\u00e1s detallada, como las descripciones completas, las valoraciones de los vendedores, las caracter\u00edsticas espec\u00edficas de los art\u00edculos y las opciones de variantes.<\/li>\n<\/ul>\n<p>En este tutorial nos centraremos en las p\u00e1ginas de resultados de b\u00fasqueda, ya que es por ah\u00ed por donde empieza la mayor\u00eda de la gente.<\/p>\n<h2>\u00bfPor qu\u00e9 extraer datos de eBay?<\/h2>\n<p>As\u00ed que, una vez que tengas estos datos, la verdad es que hay un mont\u00f3n de cosas que puedes hacer con ellos. Las que yo utilizo son: <\/p>\n<ol>\n<li><strong>Seguimiento de precios.<\/strong>  Puedes ver de un solo vistazo a qu\u00e9 precio se est\u00e1n vendiendo realmente las cosas en miles de anuncios activos y vendidos, y los que est\u00e1n vendidos son el oro, porque ese es el precio que la gente ha pagado de verdad, no una cifra idealista que el vendedor ha puesto con la esperanza de que se vendiera.<\/li>\n<li><strong>An\u00e1lisis de la competencia.<\/strong>  Puedes ver exactamente qu\u00e9 se est\u00e1 vendiendo, en qu\u00e9 estado se encuentra el art\u00edculo, qui\u00e9n lo est\u00e1 vendiendo y cu\u00e1nto pide por \u00e9l, as\u00ed que, en lugar de tener que adivinar a qu\u00e9 precio ponerlo, simplemente lo sabes.<\/li>\n<li><strong>Reventa y arbitraje.<\/strong>  Esta es la parte que te permite pagar las facturas, porque ahora mismo hay propiedades a la venta a precios muy bajos, y los datos te permiten encontrarlas y hacerte con ellas antes incluso de que otra persona se d\u00e9 cuenta de su existencia.<\/li>\n<li><strong>Investigaci\u00f3n de productos.<\/strong>  Antes de invertir dinero real en abastecer una categor\u00eda, puedes analizar las cifras y determinar en un par de minutos si existe una demanda real o si simplemente estar\u00edas invirtiendo dinero en productos que nunca se venden.<\/li>\n<li><strong>Seguimiento de los vendedores.<\/strong>  Y cuando quieras echar un vistazo a un vendedor concreto, el procedimiento es exactamente el mismo: solo tienes que introducir la URL de su tienda en lugar de realizar una b\u00fasqueda y, de repente, tendr\u00e1s todo su cat\u00e1logo y sus precios justo delante de ti.<\/li>\n<\/ol>\n<p>Si tu trabajo tiene que ver, aunque sea de forma indirecta, con la reventa, el comercio electr\u00f3nico o la fijaci\u00f3n de precios, este tipo de datos te ahorra una cantidad incre\u00edble de tiempo y te ayuda a tomar decisiones m\u00e1s acertadas con mucha mayor rapidez.<\/p>\n<h2>\u00bfPor qu\u00e9 no utilizar simplemente la API oficial?<\/h2>\n<p>La verdad es que no es una mala opci\u00f3n para cosas sencillas. La API de Browse gestiona bastante bien las consultas de volumen moderado sobre anuncios activos. Pero hay que pasar primero por <strong>un proceso de aprobaci\u00f3n<\/strong>, tiene l\u00edmites de frecuencia que se activan bastante r\u00e1pido y, sencillamente, no te ofrece todo lo que necesitas.  <\/p>\n<p>No aparecen los anuncios vendidos, no aparecen las rese\u00f1as, ni tampoco los datos completos de las variantes tal y como se muestran en la p\u00e1gina real. As\u00ed que, cuando necesitas tener una visi\u00f3n completa, es decir, el tipo de datos que ve un usuario real al cargar la p\u00e1gina, <strong>el scraping es, sencillamente, la opci\u00f3n m\u00e1s pr\u00e1ctica<\/strong>. <\/p>\n<p>Si eres nuevo en este \u00e1mbito, Floppydata ofrece una buena introducci\u00f3n sobre <a href=\"https:\/\/floppydata.com\/blog\/what-is-a-web-unblocker\/\">c\u00f3mo funciona realmente un \u00abweb unlocker<\/a>\u00bb.<\/p>\n<h2>\u00bfPor qu\u00e9 resulta tan dif\u00edcil extraer datos de eBay?<\/h2>\n<p>No es imposible, pero sin duda hay factores que juegan en tu contra. Hay dos cosas concretas con las que se encuentra la mayor\u00eda de la gente. <\/p>\n<p>Una de ellas es la detecci\u00f3n de bots. eBay utiliza CAPTCHAs y limitaci\u00f3n de frecuencia, y una IP de baja confianza te dar\u00e1 errores 403 muy r\u00e1pidamente. Adem\u00e1s, a principios de 2026 endurecieron las medidas, as\u00ed que s\u00e9 responsable: utiliza solo datos p\u00fablicos, mant\u00e9n una frecuencia de solicitudes normal y no realices ninguna acci\u00f3n relacionada con pedidos ni nada por el estilo. Necesitas direcciones IP residenciales y un comportamiento que se parezca realmente al de un navegador; de lo contrario, no obtendr\u00e1s respuestas correctas.   <\/p>\n<p>El segundo es el margen de beneficio, y este es un poco enga\u00f1oso. Mientras preparaba esto, me di cuenta de que eBay ya se hab\u00eda trasladado de <code>li.s-item<\/code> a <code>li.s-card<\/code>, junto con todo el contenido de <code>.s-card__title<\/code>, <code>.s-card__price<\/code> y <code>.s-card__subtitle<\/code> que hab\u00eda en \u00e9l. La mayor\u00eda de las gu\u00edas en l\u00ednea siguen apuntando a la estructura antigua, por lo que ahora ya no funcionan. Tus selectores quedar\u00e1n obsoletos en alg\u00fan momento; as\u00ed es como funciona eBay, as\u00ed que incorpora desde el principio algunas comprobaciones preventivas para detectar campos que falten.   <\/p>\n<p>En fin, por eso lo gestiono todo a trav\u00e9s del Web Unlocker de Floppydata en lugar de lidiar directamente con eBay.<\/p>\n<h2>Requisitos previos<\/h2>\n<p>Tres cosas:<\/p>\n<ul>\n<li>Python 3.10 o superior<\/li>\n<li>Una cuenta de Floppydata con una clave API de Web Unlocker. Cada nueva cuenta incluye cinco extracciones gratuitas, por lo que podr\u00e1s seguir toda esta gu\u00eda sin tener que pagar nada. La clave se encuentra en el panel de control de Web Unlocker.  <\/li>\n<li>Dos bibliotecas: <code>requests<\/code> y  <code>beautifulsoup4<\/code><\/li>\n<\/ul>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-45827\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image3-3.png\" alt=\"Configuraci\u00f3n de la cuenta e informaci\u00f3n sobre la clave API\" width=\"1785\" height=\"839\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image3-3.png 1785w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image3-3-300x141.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image3-3-1024x481.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image3-3-768x361.png 768w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image3-3-1536x722.png 1536w\" sizes=\"(max-width: 1785px) 100vw, 1785px\" \/><\/p>\n<p>Instala primero las dos bibliotecas:<\/p>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code>pip install requests beautifulsoup4\n<\/code><\/pre>\n<p>A continuaci\u00f3n, la carpeta de tu proyecto:<\/p>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code>mkdir ebay-scraper\n<span style=\"color: #008000;\">cd<\/span> ebay-scraper\ntouch ebay_scraper.py\n<\/code><\/pre>\n<h2>Env\u00edo de la primera solicitud<\/h2>\n<p>Lo primero que prob\u00e9 fue una solicitud b\u00e1sica para ver qu\u00e9 pasaba:<\/p>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #008000; font-weight: bold;\">import<\/span> <span style=\"color: #00f; font-weight: bold;\">requests<\/span>\n\nurl <span style=\"color: #666;\">=<\/span> <span style=\"color: #ba2121;\">\"https:\/\/www.ebay.com\/sch\/i.html?_nkw=mechanical+keyboard\"<\/span>\nresponse <span style=\"color: #666;\">=<\/span> requests<span style=\"color: #666;\">.<\/span>get(url)\n\n<span style=\"color: #008000;\">print<\/span>(response<span style=\"color: #666;\">.<\/span>status_code)\n<span style=\"color: #008000;\">print<\/span>(response<span style=\"color: #666;\">.<\/span>text[:<span style=\"color: #666;\">500<\/span>])\n<\/code><\/pre>\n<p>Bloquear p\u00e1gina. No son anuncios, simplemente no hay nada \u00fatil. eBay detecta al instante una solicitud sencilla en Python: sin huella digital, sin IP de confianza&#8230; simplemente no va a funcionar. As\u00ed que, en lugar de perder el tiempo con eso, utilizo el Web Unlocker.   <\/p>\n<h2>Extracci\u00f3n de datos de eBay con Floppydata Web Unlocker<\/h2>\n<p>Se encarga de todo lo molesto: la IP residencial, la huella digital del navegador y la visualizaci\u00f3n de la p\u00e1gina, y te devuelve un c\u00f3digo HTML limpio. Adem\u00e1s, solo cobra por los rastreos que se realizan con \u00e9xito, as\u00ed que no pierdes cr\u00e9ditos en los que fallan. <\/p>\n<p>Siempre hago pruebas en el entorno de pruebas del panel de control (<a href=\"https:\/\/app.floppydata.com\/tools\/scrape\">entorno de pruebas de Web Unlocker sin c\u00f3digo<\/a>) antes de escribir nada. Pega la URL de b\u00fasqueda, pulsa \u00abScrape\u00bb y f\u00edjate en los resultados. Es mucho m\u00e1s f\u00e1cil crear un analizador sint\u00e1ctico cuando ya sabes con qu\u00e9 est\u00e1s trabajando.  <\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-45836\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image1-3.png\" alt=\"Captura de pantalla de la interfaz de una herramienta de web scraping\" width=\"1400\" height=\"817\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image1-3.png 1400w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image1-3-300x175.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image1-3-1024x598.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image1-3-768x448.png 768w\" sizes=\"(max-width: 1400px) 100vw, 1400px\" \/><\/p>\n<p>Ya tenemos el c\u00f3digo HTML, as\u00ed que pasemos a programar.<\/p>\n<h3>Paso 1: Preparar la solicitud<\/h3>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #008000; font-weight: bold;\">import<\/span> <span style=\"color: #00f; font-weight: bold;\">requests<\/span>\n<span style=\"color: #008000; font-weight: bold;\">import<\/span> <span style=\"color: #00f; font-weight: bold;\">json<\/span>\n<span style=\"color: #008000; font-weight: bold;\">from<\/span> <span style=\"color: #00f; font-weight: bold;\">bs4<\/span> <span style=\"color: #008000; font-weight: bold;\">import<\/span> BeautifulSoup\n\nAPI_URL <span style=\"color: #666;\">=<\/span> <span style=\"color: #ba2121;\">\"https:\/\/api.floppydata.net\/v1\/webUnlocker\"<\/span>\nAPI_KEY <span style=\"color: #666;\">=<\/span> <span style=\"color: #ba2121;\">\"YOUR_API_KEY\"<\/span>\n\nSEARCH_URL <span style=\"color: #666;\">=<\/span> <span style=\"color: #ba2121;\">\"https:\/\/www.ebay.com\/sch\/i.html?_nkw=mechanical+keyboard&_pgn=1\"<\/span>\nOUTPUT_FILE <span style=\"color: #666;\">=<\/span> <span style=\"color: #ba2121;\">\"ebay_listings.json\"<\/span>\n<\/code><\/pre>\n<p>Sustituye <code>YOUR_API_KEY<\/code> por la clave que aparece en tu panel de control.<\/p>\n<p>Adem\u00e1s, <code>_pgn=1<\/code> es simplemente el n\u00famero de p\u00e1gina. Si quieres la segunda p\u00e1gina, c\u00e1mbialo por <code>_pgn=2<\/code>. La tercera p\u00e1gina, <code>_pgn=3<\/code>. As\u00ed de sencillo.   <\/p>\n<h3>Paso 2: Obtener la p\u00e1gina a trav\u00e9s de Web Unlocker<\/h3>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #008000; font-weight: bold;\">def<\/span> <span style=\"color: #00f;\">fetch_html<\/span>(url):\n    response <span style=\"color: #666;\">=<\/span> requests<span style=\"color: #666;\">.<\/span>post(\n        API_URL,\n        headers<span style=\"color: #666;\">=<\/span>{\n            <span style=\"color: #ba2121;\">\"Content-Type\"<\/span>: <span style=\"color: #ba2121;\">\"application\/json\"<\/span>,\n            <span style=\"color: #ba2121;\">\"X-Api-Key\"<\/span>: API_KEY,\n        },\n        json<span style=\"color: #666;\">=<\/span>{\n            <span style=\"color: #ba2121;\">\"url\"<\/span>: url,\n            <span style=\"color: #ba2121;\">\"country\"<\/span>: <span style=\"color: #ba2121;\">\"US\"<\/span>,\n            <span style=\"color: #ba2121;\">\"city\"<\/span>: <span style=\"color: #ba2121;\">\"New York\"<\/span>,\n            <span style=\"color: #ba2121;\">\"difficulty\"<\/span>: <span style=\"color: #ba2121;\">\"medium\"<\/span>,\n            <span style=\"color: #ba2121;\">\"expiration\"<\/span>: <span style=\"color: #666;\">0<\/span>,\n        },\n        timeout<span style=\"color: #666;\">=120<\/span>,\n    )\n\n    response<span style=\"color: #666;\">.<\/span>raise_for_status()\n\n    data <span style=\"color: #666;\">=<\/span> response<span style=\"color: #666;\">.<\/span>json()\n    html <span style=\"color: #666;\">=<\/span> data<span style=\"color: #666;\">.<\/span>get(<span style=\"color: #ba2121;\">\"html\"<\/span>)\n\n    <span style=\"color: #008000; font-weight: bold;\">if<\/span> <span style=\"color: #a2f; font-weight: bold;\">not<\/span> html:\n        <span style=\"color: #008000; font-weight: bold;\">raise<\/span> <span style=\"color: #cb3f38; font-weight: bold;\">ValueError<\/span>(<span style=\"color: #ba2121;\">\"Unlocker response did not include an 'html' field.\"<\/span>)\n\n    <span style=\"color: #008000; font-weight: bold;\">return<\/span> html\n<\/code><\/pre>\n<p>El pa\u00eds y la ciudad garantizan que la solicitud se redirija a trav\u00e9s de una IP residencial de EE. UU., lo que afecta tanto a los precios como a los anuncios que realmente aparecen. La dificultad <code>medium<\/code> es la configuraci\u00f3n adecuada para eBay espec\u00edficamente, ya que cuenta con una protecci\u00f3n antibots muy estricta. Si se establece un valor inferior, simplemente te bloquear\u00e1n. La caducidad <code>0<\/code> obliga a cargar una p\u00e1gina nueva cada vez, en lugar de recuperar una respuesta almacenada en cach\u00e9. El c\u00f3digo HTML generado aparece en el campo <code>html<\/code> del JSON, y eso es lo que BeautifulSoup analiza en el siguiente paso. Si quieres ver todos los par\u00e1metros disponibles, la <a href=\"https:\/\/floppydata.com\/docs\/api-reference\/endpoint\/web-unlocker\">referencia de la API de Web Unlocker<\/a> los recoge todos.     <\/p>\n<h3>Paso 3: Extraer los listados<\/h3>\n<p>Cada resultado de la p\u00e1gina de b\u00fasqueda es un  <code>li.s-card<\/code>  contenedor. Para extraer los anuncios de eBay de forma limpia, recorremos todas las tarjetas y extraemos los campos que nos interesan, utilizando comprobaciones preventivas para que la ausencia de un campo nunca provoque un error en la ejecuci\u00f3n: <\/p>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #008000; font-weight: bold;\">def<\/span> <span style=\"color: #00f;\">extract_listings<\/span>(html):\n    soup <span style=\"color: #666;\">=<\/span> BeautifulSoup(html, <span style=\"color: #ba2121;\">\"html.parser\"<\/span>)\n    cards <span style=\"color: #666;\">=<\/span> soup<span style=\"color: #666;\">.<\/span>select(<span style=\"color: #ba2121;\">\"li.s-card\"<\/span>)\n    listings <span style=\"color: #666;\">=<\/span> []\n\n    <span style=\"color: #008000; font-weight: bold;\">for<\/span> card <span style=\"color: #a2f; font-weight: bold;\">in<\/span> cards:\n        title_el <span style=\"color: #666;\">=<\/span> card<span style=\"color: #666;\">.<\/span>select_one(<span style=\"color: #ba2121;\">\".s-card__title\"<\/span>)\n        title <span style=\"color: #666;\">=<\/span> title_el<span style=\"color: #666;\">.<\/span>get_text(<span style=\"color: #ba2121;\">\" \"<\/span>, strip<span style=\"color: #666;\">=<\/span><span style=\"color: #008000; font-weight: bold;\">True<\/span>) <span style=\"color: #008000; font-weight: bold;\">if<\/span> title_el <span style=\"color: #008000; font-weight: bold;\">else<\/span> <span style=\"color: #008000; font-weight: bold;\">None<\/span>\n\n        <span style=\"color: #008000; font-weight: bold;\">if<\/span> title:\n            <span style=\"color: #3d7b7b; font-style: italic;\"># eBay appends this as accessibility text<\/span>\n            title <span style=\"color: #666;\">=<\/span> title<span style=\"color: #666;\">.<\/span>replace(<span style=\"color: #ba2121;\">\"Opens in a new window or tab\"<\/span>, <span style=\"color: #ba2121;\">\"\"<\/span>)<span style=\"color: #666;\">.<\/span>strip()\n\n        <span style=\"color: #3d7b7b; font-style: italic;\"># Skip the placeholder card at the top of search results<\/span>\n        <span style=\"color: #008000; font-weight: bold;\">if<\/span> <span style=\"color: #a2f; font-weight: bold;\">not<\/span> title <span style=\"color: #a2f; font-weight: bold;\">or<\/span> title <span style=\"color: #666;\">==<\/span> <span style=\"color: #ba2121;\">\"Shop on eBay\"<\/span>:\n            <span style=\"color: #008000; font-weight: bold;\">continue<\/span>\n\n        price_el <span style=\"color: #666;\">=<\/span> card<span style=\"color: #666;\">.<\/span>select_one(<span style=\"color: #ba2121;\">\".s-card__price\"<\/span>)\n        condition_el <span style=\"color: #666;\">=<\/span> card<span style=\"color: #666;\">.<\/span>select_one(<span style=\"color: #ba2121;\">\".s-card__subtitle\"<\/span>)\n\n        <span style=\"color: #3d7b7b; font-style: italic;\"># Shipping info sits inside attribute rows<\/span>\n        shipping <span style=\"color: #666;\">=<\/span> <span style=\"color: #008000; font-weight: bold;\">None<\/span>\n\n        <span style=\"color: #008000; font-weight: bold;\">for<\/span> row <span style=\"color: #a2f; font-weight: bold;\">in<\/span> card<span style=\"color: #666;\">.<\/span>select(<span style=\"color: #ba2121;\">\".s-card__attribute-row\"<\/span>):\n            text <span style=\"color: #666;\">=<\/span> row<span style=\"color: #666;\">.<\/span>get_text(<span style=\"color: #ba2121;\">\" \"<\/span>, strip<span style=\"color: #666;\">=<\/span><span style=\"color: #008000; font-weight: bold;\">True<\/span>)\n\n            <span style=\"color: #008000; font-weight: bold;\">if<\/span> <span style=\"color: #008000;\">any<\/span>(word <span style=\"color: #a2f; font-weight: bold;\">in<\/span> text<span style=\"color: #666;\">.<\/span>lower() <span style=\"color: #008000; font-weight: bold;\">for<\/span> word <span style=\"color: #a2f; font-weight: bold;\">in<\/span> (<span style=\"color: #ba2121;\">\"ship\"<\/span>, <span style=\"color: #ba2121;\">\"free\"<\/span>, <span style=\"color: #ba2121;\">\"delivery\"<\/span>)):\n                shipping <span style=\"color: #666;\">=<\/span> text\n                <span style=\"color: #008000; font-weight: bold;\">break<\/span>\n\n        <span style=\"color: #3d7b7b; font-style: italic;\"># Grab the first link that points to an item detail page<\/span>\n        url <span style=\"color: #666;\">=<\/span> <span style=\"color: #008000; font-weight: bold;\">None<\/span>\n\n        <span style=\"color: #008000; font-weight: bold;\">for<\/span> a <span style=\"color: #a2f; font-weight: bold;\">in<\/span> card<span style=\"color: #666;\">.<\/span>select(<span style=\"color: #ba2121;\">\"a.s-card__link\"<\/span>):\n            href <span style=\"color: #666;\">=<\/span> a<span style=\"color: #666;\">.<\/span>get(<span style=\"color: #ba2121;\">\"href\"<\/span>)\n\n            <span style=\"color: #008000; font-weight: bold;\">if<\/span> href <span style=\"color: #a2f; font-weight: bold;\">and<\/span> <span style=\"color: #ba2121;\">\"\/itm\/\"<\/span> <span style=\"color: #a2f; font-weight: bold;\">in<\/span> href:\n                url <span style=\"color: #666;\">=<\/span> href<span style=\"color: #666;\">.<\/span>split(<span style=\"color: #ba2121;\">\"?\"<\/span>)[<span style=\"color: #666;\">0<\/span>]\n                <span style=\"color: #008000; font-weight: bold;\">break<\/span>\n\n        listings<span style=\"color: #666;\">.<\/span>append({\n            <span style=\"color: #ba2121;\">\"title\"<\/span>: title,\n            <span style=\"color: #ba2121;\">\"price\"<\/span>: price_el<span style=\"color: #666;\">.<\/span>get_text(<span style=\"color: #ba2121;\">\" \"<\/span>, strip<span style=\"color: #666;\">=<\/span><span style=\"color: #008000; font-weight: bold;\">True<\/span>) <span style=\"color: #008000; font-weight: bold;\">if<\/span> price_el <span style=\"color: #008000; font-weight: bold;\">else<\/span> <span style=\"color: #008000; font-weight: bold;\">None<\/span>,\n            <span style=\"color: #ba2121;\">\"condition\"<\/span>: condition_el<span style=\"color: #666;\">.<\/span>get_text(<span style=\"color: #ba2121;\">\" \"<\/span>, strip<span style=\"color: #666;\">=<\/span><span style=\"color: #008000; font-weight: bold;\">True<\/span>) <span style=\"color: #008000; font-weight: bold;\">if<\/span> condition_el <span style=\"color: #008000; font-weight: bold;\">else<\/span> <span style=\"color: #008000; font-weight: bold;\">None<\/span>,\n            <span style=\"color: #ba2121;\">\"shipping\"<\/span>: shipping,\n            <span style=\"color: #ba2121;\">\"url\"<\/span>: url,\n        })\n\n    <span style=\"color: #008000; font-weight: bold;\">return<\/span> listings\n<\/code><\/pre>\n<p>Hay dos aspectos que conviene tener en cuenta.<\/p>\n<ul>\n<li>eBay siempre coloca una <strong>tarjeta de marcador de posici\u00f3n de \u00abShop on eBay\u00bb<\/strong> en la parte superior de los resultados de b\u00fasqueda. Si no la omites, el primer elemento de la lista de resultados no es m\u00e1s que basura inservible. <\/li>\n<li>El t\u00edtulo tambi\u00e9n extrae \u00abSe abre en una nueva ventana o pesta\u00f1a\u00bb como <strong>texto de accesibilidad<\/strong> de la etiqueta de enlace, de modo que la l\u00ednea de sustituci\u00f3n lo depura antes de que se a\u00f1ada nada.<\/li>\n<\/ul>\n<h3>Paso 4: Guardar los resultados<\/h3>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #008000; font-weight: bold;\">def<\/span> <span style=\"color: #00f;\">main<\/span>():\n    <span style=\"color: #008000;\">print<\/span>(<span style=\"color: #ba2121;\">f\"Fetching data from: <\/span><span style=\"color: #a45a77; font-weight: bold;\">{<\/span>SEARCH_URL<span style=\"color: #a45a77; font-weight: bold;\">}<\/span><span style=\"color: #ba2121;\">\"<\/span>)\n\n    html <span style=\"color: #666;\">=<\/span> fetch_html(SEARCH_URL)\n    listings <span style=\"color: #666;\">=<\/span> extract_listings(html)\n\n    <span style=\"color: #008000; font-weight: bold;\">if<\/span> <span style=\"color: #a2f; font-weight: bold;\">not<\/span> listings:\n        <span style=\"color: #008000; font-weight: bold;\">raise<\/span> <span style=\"color: #cb3f38; font-weight: bold;\">SystemExit<\/span>(<span style=\"color: #ba2121;\">\"No listings found. eBay may have changed its markup.\"<\/span>)\n\n    <span style=\"color: #008000; font-weight: bold;\">with<\/span> <span style=\"color: #008000;\">open<\/span>(OUTPUT_FILE, <span style=\"color: #ba2121;\">\"w\"<\/span>, encoding<span style=\"color: #666;\">=<\/span><span style=\"color: #ba2121;\">\"utf-8\"<\/span>) <span style=\"color: #008000; font-weight: bold;\">as<\/span> file:\n        json<span style=\"color: #666;\">.<\/span>dump(listings, file, indent<span style=\"color: #666;\">=2<\/span>)\n\n    <span style=\"color: #008000;\">print<\/span>(<span style=\"color: #ba2121;\">f\"Found <\/span><span style=\"color: #a45a77; font-weight: bold;\">{<\/span><span style=\"color: #008000;\">len<\/span>(listings)<span style=\"color: #a45a77; font-weight: bold;\">}<\/span><span style=\"color: #ba2121;\"> listings\"<\/span>)\n    <span style=\"color: #008000;\">print<\/span>(<span style=\"color: #ba2121;\">f\"Saved results to <\/span><span style=\"color: #a45a77; font-weight: bold;\">{<\/span>OUTPUT_FILE<span style=\"color: #a45a77; font-weight: bold;\">}<\/span><span style=\"color: #ba2121;\">\"<\/span>)\n\n\n<span style=\"color: #008000; font-weight: bold;\">if<\/span> <span style=\"color: #19177c;\">__name__<\/span> <span style=\"color: #666;\">==<\/span> <span style=\"color: #ba2121;\">\"__main__\"<\/span>:\n    main()\n<\/code><\/pre>\n<p>Ejecuta el script:<\/p>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code>python ebay_scraper.py\n<\/code><\/pre>\n<p>Y deber\u00edas ver algo as\u00ed como:<\/p>\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code>[\n  {\n    <span style=\"color: #008000; font-weight: bold;\">\"title\"<\/span>: <span style=\"color: #ba2121;\">\"MSI Forge GK600 TKL Wireless Mechanical Keyboard RGB Bluetooth 2.4GHz\"<\/span>,\n    <span style=\"color: #008000; font-weight: bold;\">\"price\"<\/span>: <span style=\"color: #ba2121;\">\"$49.99\"<\/span>,\n    <span style=\"color: #008000; font-weight: bold;\">\"condition\"<\/span>: <span style=\"color: #ba2121;\">\"Brand New\"<\/span>,\n    <span style=\"color: #008000; font-weight: bold;\">\"shipping\"<\/span>: <span style=\"color: #ba2121;\">\"Free shipping\"<\/span>,\n    <span style=\"color: #008000; font-weight: bold;\">\"url\"<\/span>: <span style=\"color: #ba2121;\">\"https:\/\/www.ebay.com\/itm\/227344950627\"<\/span>\n  }\n]\n<\/code><\/pre>\n<p><img decoding=\"async\" class=\"alignnone wp-image-45845 size-full\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image2-5.png\" alt=\"Lista de teclados de ordenador a la venta\" width=\"1119\" height=\"697\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image2-5.png 1119w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image2-5-300x187.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image2-5-1024x638.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/06\/image2-5-768x478.png 768w\" sizes=\"(max-width: 1119px) 100vw, 1119px\" \/><\/p>\n<p>As\u00ed es como funciona el raspador b\u00e1sico.<\/p>\n<p>A partir de aqu\u00ed, para cambiar la palabra clave basta con modificar <code>_nkw=mechanical+keyboard<\/code> en la URL. Si quieres otra p\u00e1gina, puedes pasar de <code>_pgn=1<\/code> a <code>_pgn=2<\/code>, <code>_pgn=3<\/code>, y as\u00ed sucesivamente. <\/p>\n<h2>Soluci\u00f3n de problemas<\/h2>\n<p>As\u00ed que est\u00e1 claro: si sigues buscando en eBay el tiempo suficiente, es probable que te topes con algo as\u00ed:<\/p>\n<ul>\n<li><strong>Errores 403:<\/strong> eBay ha marcado tu direcci\u00f3n IP. La soluci\u00f3n es conectarte a trav\u00e9s de Web Unlocker con direcciones IP residenciales. <\/li>\n<li><strong>Respuestas vac\u00edas:<\/strong> suele tratarse de un problema de visualizaci\u00f3n. Comprueba que est\u00e1s leyendo el campo \u00ab <code>html<\/code> \u00bb de la respuesta de Web Unlocker, y no el cuerpo JSON sin procesar. <\/li>\n<li><strong>Campos que faltan:<\/strong> no todos los anuncios incluyen informaci\u00f3n sobre el estado del art\u00edculo o los gastos de env\u00edo. Los controles de seguridad de <code>extract_listings<\/code> ya se encargan de ello. <\/li>\n<li><strong>No hay ning\u00fan resultado:<\/strong> eBay ha vuelto a cambiar los nombres de las clases CSS. Vuelve al \u00abplayground\u00bb, revisa el nuevo c\u00f3digo y actualiza tus selectores. <\/li>\n<\/ul>\n<h2>Tu pr\u00f3ximo paso<\/h2>\n<p>Mira, eBay no es precisamente la p\u00e1gina m\u00e1s complicada de manejar, pero entre los CAPTCHAs, los l\u00edmites de solicitudes y el hecho de que el margen de beneficio a veces cambia sin previo aviso, hacerlo sin la configuraci\u00f3n adecuada solo te har\u00e1 perder el tiempo. Utilizar un servicio que se encargue de todo eso te permite pasar directamente a trabajar con los datos. <\/p>\n<p>En eso es en lo que destaca <a href=\"https:\/\/floppydata.com\/web-unlocker\/\">el Web Unlocker de Floppydata<\/a>. Rotaci\u00f3n de proxies residenciales, huellas digitales reales de navegadores, renderizaci\u00f3n de p\u00e1ginas completas, y solo pagas por las respuestas correctas, por lo que los intentos fallidos de extracci\u00f3n de datos no te cuestan nada. Si le a\u00f1ades unas cuantas l\u00edneas de BeautifulSoup, la verdad es que todo resulta bastante sencillo.  <\/p>\n<p>Con cada cuenta nueva se incluyen cinco rasca y gana gratis, para que puedas seguir toda esta gu\u00eda sin tener que pagar nada.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>eBay cuenta con una mina de oro de datos p\u00fablicos sobre precios. Millones de anuncios activos de art\u00edculos de colecci\u00f3n, electr\u00f3nica, piezas descatalogadas\u2026 lo que se te ocurra: todos ellos \u00fatiles para el seguimiento de precios, la investigaci\u00f3n de mercado o el an\u00e1lisis de la competencia. El problema es acceder a esos datos de forma [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":45808,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[149,563,545],"tags":[],"class_list":["post-45890","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-scraping","category-how-to"],"acf":[],"_links":{"self":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/posts\/45890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/comments?post=45890"}],"version-history":[{"count":0,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/posts\/45890\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/media\/45808"}],"wp:attachment":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/media?parent=45890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/categories?post=45890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/tags?post=45890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}