urljoin spider scraping follow example español create python scrapy

python - spider - No se puede obtener el ejemplo de canalización más simple para trabajar en scrapy



scrapy python español (3)

pipelines.TestPipeline tiene el número de pedido. Debería ser algo así como ITEM_PIPELINES = [''pipelines.TestPipeline'': 900] .

Este es mi código simple y no lo estoy haciendo funcionar.

Estoy subclases desde initspider

Este es mi código

class MytestSpider(InitSpider): name = ''mytest'' allowed_domains = [''example.com''] login_page = ''http://www.example.com'' start_urls = ["http://www.example.com/ist.php"] def init_request(self): #"""This function is called before crawling starts.""" return Request(url=self.login_page, callback=self.parse) def parse(self, response): item = MyItem() item[''username''] = "mytest" return item

Tubería

class TestPipeline(object): def process_item(self, item, spider): print item[''username'']

Estoy obteniendo el mismo error si intento imprimir el artículo

El error que recibo es

File "crawler/pipelines.py", line 35, in process_item myitem.username = item[''username''] exceptions.TypeError: ''NoneType'' object has no attribute ''__getitem__''

Yo el problema es con InitSpider . Mis pieplines no obtienen objetos de elementos

items.py

class MyItem(Item): username = Field()

setting.py

BOT_NAME = ''crawler'' SPIDER_MODULES = [''spiders''] NEWSPIDER_MODULE = ''spiders'' DOWNLOADER_MIDDLEWARES = { ''scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware'': 700 # <- } COOKIES_ENABLED = True COOKIES_DEBUG = True ITEM_PIPELINES = [ ''pipelines.TestPipeline'', ] IMAGES_STORE = ''/var/www/htmlimages''


Hay otro problema con su función process_item . De acuerdo con la documentación oficial :

Se llama a este método para cada componente de canalización de elementos y debe devolver un objeto dict con datos, artículo (o cualquier clase descendiente) o generar una excepción DropItem. Los elementos eliminados ya no son procesados ​​por otros componentes de la tubería.

En su caso, puede agregar una declaración de devolución al final de su función:

def process_item(self, item, spider): print item[''username''] return item

Si no incluye una declaración de devolución, el valor de retorno de esta canalización es None . Es por eso que la siguiente canalización se queja: no se puede hacer la item[''username''] cuando el item es None .


Esto es lo que hice y funcionó:

  1. En tu clase MytestSpider , simplemente escribe la función de parse de esta manera:

    def parse(self, response): yield {''username'': "mytest"}

  2. Eliminar items.py , no items.py ninguna clase de elemento y todavía funcionaba

  3. En tu código de canalización:

    class TestPipeline(object): def process_item(self, item, spider): print item[''username'']

En mi código de prueba, parece que todo lo que yield en la araña se convertirá en el elemento en Pipeline process_item , pero los resultados de rendimiento tienen que ser un diccionario u objeto Item ... Al igual que la primera respuesta anterior.

  1. En settings.py, no conozco toda la estructura de tu proyecto, ya que la ruta aquí puede decidir si obtendrás el resultado. Supongo que ''rastreador'' es una carpeta donde tienes otra carpeta llamada ''arañas'', y tu código araña está en esta carpeta ''arañas''. Tu pipelines.py está también en la carpeta ''rastreador''. Para mí, esto funcionó:

    BOT_NAME = ''crawler'' SPIDER_MODULES = [''crawler.spiders''] NEWSPIDER_MODULE = ''crawler.spiders'' ROBOTSTXT_OBEY = True DOWNLOAD_DELAY = 3 ITEM_PIPELINES = { ''crawler.pipelines.ScrapeNewsPipeline'': 400, }

  2. Finalmente, para ejecutar el código, estaba usando el terminal de Python, cd en la carpeta de código donde tienes la carpeta del rastreador, luego ejecuto

    scrapy runspider crawler/spiders/my_test_spider.py

Aunque mi código de prueba no es 100% igual que el tuyo, espero que esto pueda ayudar