Scrapy SgmlLinkExtractor ignora los enlaces permitidos
-
06-07-2019 - |
Pregunta
Eche un vistazo a este ejemplo de araña en la documentación de Scrapy. La explicación es:
Esta araña comenzaría a rastrear la página de inicio de example.com, recopilando enlaces de categorías y enlaces de elementos, analizando estos últimos con el método parse_item. Para cada respuesta de elemento, se extraerán algunos datos del HTML usando XPath, y se completará un elemento con él.
Copié exactamente la misma araña, y reemplacé " example.com " con otra url inicial.
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from stb.items import StbItem
class StbSpider(CrawlSpider):
domain_name = "stb"
start_urls = ['http://www.stblaw.com/bios/MAlpuche.htm']
rules = (Rule(SgmlLinkExtractor(allow=(r'/bios/.\w+\.htm', )), callback='parse', follow=True), )
def parse(self, response):
hxs = HtmlXPathSelector(response)
item = StbItem()
item['JD'] = hxs.select('//td[@class="bodycopysmall"]').re('\d\d\d\d\sJ.D.')
return item
SPIDER = StbSpider()
Pero mi araña '' stb '' no recopila enlaces de " / bios / " como se supone que debe hacer. Ejecuta la url inicial, raspa el elemento ['JD']
y lo escribe en un archivo y luego se cierra.
¿Por qué se ignora SgmlLinkExtractor
? La Rule
se lee porque detecta errores de sintaxis dentro de la línea Rule
.
¿Es esto un error? ¿Hay algo mal en mi código? No hay errores, excepto un montón de errores no controlados que veo con cada ejecución.
Sería bueno saber qué estoy haciendo mal aquí. Gracias por cualquier pista. ¿Estoy malinterpretando lo que se supone que debe hacer SgmlLinkExtractor
?
Solución
La función parse
en realidad se implementa y se usa en la clase CrawlSpider, y la anula involuntariamente. Si cambia el nombre a otra cosa, como parse_item
, entonces la Regla debería funcionar.