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ó:
En tu clase
MytestSpider
, simplemente escribe la función deparse
de esta manera:def parse(self, response): yield {''username'': "mytest"}
Eliminar
items.py
, noitems.py
ninguna clase de elemento y todavía funcionabaEn 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.
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, }
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