Raspar todo el texto usando Scrapy sin conocer la estructura de las páginas web

Estoy realizando una investigación relacionada con la distribución de la indexación de Internet.

Si bien existen varios proyectos de este tipo (IRLbot, Distributed-indexing, Cluster-Scrapy, Common-Crawl, etc.), el mío está más centrado en incentivar dicho comportamiento. Estoy buscando una forma sencilla de rastrear páginas web reales sin saber nada sobre su URL o estructura HTML y:

  1. Extrae todo su texto (para indexarlo).
  2. Recopile todas sus URL y agréguelas a las URL para rastrear
  3. Evite que se caiga y continúe elegantemente (incluso sin el texto raspado) en caso de que la página web tenga un formato incorrecto

Para aclarar: esto es solo para la Prueba de concepto (PoC), por lo que no me importa que no se escale, es lento, etc. Mi objective es raspar la mayor parte del texto que se presenta al usuario, en la mayoría de los casos , con o sin contenido dynamic, y con tan poca “basura” como funciones, tags, palabras clave, etc. Se prefiere una solución parcial simple que funcione de inmediato, en lugar de la solución perfecta que requiere mucha experiencia para implementarla.

Un problema secundario es el almacenamiento de (url, texto extraído) para la indexación (¿mediante un proceso diferente?), Pero creo que podré averiguarlo con un poco más de excavación.

¡Cualquier consejo sobre cómo boost la función de análisis de “itsy” será muy apreciado!

import scrapy from scrapy_1.tutorial.items import WebsiteItem class FirstSpider(scrapy.Spider): name = 'itsy' # allowed_domains = ['dmoz.org'] start_urls = \ [ "http://www.stackoverflow.com" ] # def parse(self, response): # filename = response.url.split("/")[-2] + '.html' # with open(filename, 'wb') as f: # f.write(response.body) def parse(self, response): for sel in response.xpath('//ul/li'): item = WebsiteItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['body_text'] = sel.xpath('text()').extract() yield item 

Lo que estás buscando aquí es scrapy CrawlSpider

CrawlSpider le permite definir reglas de rastreo que se siguen para cada página. Es lo suficientemente inteligente como para evitar el rastreo de imágenes, documentos y otros archivos que no son recursos web y prácticamente lo hace todo por usted.

Aquí hay un buen ejemplo de cómo podría verse su araña con CrawlSpider:

 from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class MySpider(CrawlSpider): name = 'crawlspider' start_urls = ['http://scrapy.org'] rules = ( Rule(LinkExtractor(), callback='parse_item', follow=True), ) def parse_item(self, response): item = dict() item['url'] = response.url item['title'] = response.meta['link_text'] # extracting basic body item['body'] = '\n'.join(response.xpath('//text()').extract()) # or better just save whole source item['source'] = response.body return item 

Esta araña rastreará cada página web que pueda encontrar en el sitio web y registrará el título, la url y el cuerpo del texto completo.
Para el cuerpo del texto, es posible que desee extraerlo de alguna manera más inteligente (para excluir javascript y otros nodos de texto no deseados), pero eso es un problema por sí solo para discutir. En realidad, por lo que está describiendo, es probable que desee guardar el código fuente HTML completo en lugar de solo texto, ya que el texto no estructurado es inútil para cualquier tipo de analítica o indexación.

También hay un montón de configuraciones desechables que se pueden ajustar para este tipo de rastreo. Está muy bien descrito en la página de documentos de rastreo general