Pergunta

Por favor, dê uma olhada este exemplo aranha na documentação Scrapy. A explicação é a seguinte:

Esta aranha iria iniciar o rastreamento de example.com home page, coletando links de categoria e links de itens, analisar o último com o método parse_item. Para cada resposta ao item, alguns dados serão extraídos do HTML utilizando XPath, e um item será preenchido com ele.

Copiei a mesma aranha exatamente, e substituído "example.com" com outro 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()

Mas a minha aranha "stb" não se ligações a cobrar de "/ bios /", como é suposto fazer. Corre-se o url inicial, raspa o item['JD'] e grava-lo em um arquivo e, em seguida, sai.

Por que é que SgmlLinkExtractor é ignorado? O Rule é lido, porque ele pega erros de sintaxe dentro da linha Rule.

Este é um bug? há de errado alguma coisa no meu código? Não há erros, exceto um grupo sem tratamento erros que eu vejo com cada corrida.

Seria bom saber o que estou fazendo de errado aqui. Obrigado por todas as pistas. Am I mal entendido que SgmlLinkExtractor é suposto fazer?

Foi útil?

Solução

A função parse é realmente implementados e utilizados na classe CrawlSpider, e você está substituindo-lo involuntariamente. Se você mudar o nome para algo mais, como parse_item, a regra deve funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top