Problemas de memory con web scraping

legent

Buenas a todos.

Ando haciendo un proyecto de final de ciclo superior. Estoy haciendo web scraping en http://www.pccomponentes.com . Estoy entrando en una categoria dentro de pccomponentes como por ejemplo procesadores, y en cada subcategoria recojo imagenes, precios y nombres de cada articulo. para luego mas tarde meterlo en una base de datos. Hasta ahi todo bien.

Ademas entro en cada articulo y recojo toda la descripcion ( son muchisimas lineas). Por ejemplo toda la descripcion de aqui: http://www.pccomponentes.com/intel_celeron_g1820.html
El problema viene cuando voy hacer esto ultimo y meterlo en una array simplemente, me sale error:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in C:\Program Files\XAMPP\htdocs\Scraping\sample\simple_html_dom.php on line 1518

Ya he leido por ahi que es porque estoy haciendo burradas, a ver si me dais una solucion.

Aviso, todo este codigo son pruebas.

spoiler

V2: https://www.dropbox.com/s/syt4s3n1h8ixqop/simple%202.php

txandy

#1 Estas intentando guardar mucha información en memoria, ves guardando la información en base de datos o en .txt donde sea, pero tienes que ir liberando memoria o darle más memoria a php

2
zoeshadow

http://stackoverflow.com/questions/12750593/fatal-error-allowed-memory-size-of-134217728-bytes-exhausted-tried-to-allocate

ini_set('memory_limit', '256M');
8 días después
MisKo

El principal problema que veo, es que lo haces todo de golpe, es decir, si la pagina que escaneas, tiene 150mil paginas, vas a pasar por cada una de ellas, y eso acaba petando la memoria.

Lo que te recomiendo es que controles las páginas que obtienes y, que poco a poco, las vayas escaneando una por una ( o categoría por categoría, para que no te salte )

Los pasos que yo seguiría serian:

  • Almacenar en la DDBB todas las URLs que encuentres
  • Mediante un cronjob, lanzar un PHP cada X tiempo ( cada minuto si tienes prisa )
  • Cada vez que lances ese PHP, escaneas X URLs de la lista que tengas en la base de datos, prueba con varias cifras hasta que te pete, igual puedes escanear 10 en cada petición, o 200, eso depende de la configuración del servidor
  • Cada vez que escanees una página, podrías ver si salen nuevas URLs y si las tienes ya en tu ddbb, si no, las agregas y ya las escanearas en otra petición.
1 respuesta
legent

#4

Si ya lo solucione.
Gracias

Ademas desaprovechaba totalmente la libreria haciendo un huevo de for's cuando no hacian falta.

Usuarios habituales

  • legent
  • MisKo
  • zoeshadow
  • txandy