Scrapy: siga los enlaces RSS
Frecuentes
Visto 5,433 equipos
7
Me preguntaba si alguien alguna vez intentó extraer / seguir enlaces de elementos RSS utilizando SgmlLinkExtractor / CrawlSpider. No puedo conseguir que funcione...
Estoy usando la siguiente regla:
reglas = (Regla (SgmlLinkExtractor (etiquetas = ('enlace',), attrs = False), follow = True, callback = 'parse_article'),)
(teniendo en cuenta que los enlaces rss se encuentran en el aquí etiqueta).
No estoy seguro de cómo decirle a SgmlLinkExtractor que extraiga el texto () del enlace y que no busque los atributos ...
Cualquier ayuda es bienvenida, gracias de antemano.
4 Respuestas
7
Las reglas de CrawlSpider no funcionan de esa manera. Probablemente necesitará crear una subclase de BaseSpider e implementar su propia extracción de enlaces en su devolución de llamada de araña. Por ejemplo:
from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.selector import XmlXPathSelector
class MySpider(BaseSpider):
name = 'myspider'
def parse(self, response):
xxs = XmlXPathSelector(response)
links = xxs.select("//link/text()").extract()
return [Request(x, callback=self.parse_link) for x in links]
También puede probar XPath en el shell, ejecutando, por ejemplo:
scrapy shell http://blog.scrapy.org/rss.xml
Y luego escribiendo en el shell:
>>> xxs.select("//link/text()").extract()
[u'http://blog.scrapy.org',
u'http://blog.scrapy.org/new-bugfix-release-0101',
u'http://blog.scrapy.org/new-scrapy-blog-and-scrapy-010-release']
Respondido el 19 de Septiembre de 10 a las 21:09
6
Hay un XMLFeedSpider
uno puede usar hoy en día.
Respondido 19 Abr '13, 13:04
Por hoy es la mejor solución. +1 - Jon
0
Lo he hecho usando CrawlSpider:
class MySpider(CrawlSpider):
domain_name = "xml.example.com"
def parse(self, response):
xxs = XmlXPathSelector(response)
items = xxs.select('//channel/item')
for i in items:
urli = i.select('link/text()').extract()
request = Request(url=urli[0], callback=self.parse1)
yield request
def parse1(self, response):
hxs = HtmlXPathSelector(response)
# ...
yield(MyItem())
pero no estoy seguro de que sea una solución muy adecuada ...
Respondido 01 Oct 10, 22:10
-2
Ejemplo XML de scrapy doc Araña de alimentación XML
from scrapy.spiders import XMLFeedSpider
from myproject.items import TestItem
class MySpider(XMLFeedSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com/feed.xml']
iterator = 'iternodes' # This is actually unnecessary, since it's the default value
itertag = 'item'
def parse_node(self, response, node):
self.logger.info('Hi, this is a <%s> node!: %s', self.itertag, ''.join(node.extract()))
#item = TestItem()
item = {} # change to dict for removing the class not found error
item['id'] = node.xpath('@id').extract()
item['name'] = node.xpath('name').extract()
item['description'] = node.xpath('description').extract()
return item
Respondido 15 ago 16, 04:08
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python web-crawler scrapy or haz tu propia pregunta.
¿Podría explicar la diferencia entre usar las reglas de CrawlSpider e implementar la extracción de enlaces personalizados en la devolución de llamada? He estado luchando durante un tiempo para notar la diferencia, y después de varias lecturas de documentos ... todavía nada. Voy con su método debido a una mala experiencia pasada con el uso de reglas, pero solo quiero saber exactamente por qué. TIA - romeroqj
Hay un
XMLFeedSpider
uno puede usar hoy en día. - opiar