如何只抓取两个预先定义的页面,但是它们会抓取不同的项目?

时间:2013-04-05 15:55:11

标签: python xml web-scraping scrapy

我正在尝试抓取一些用户输入驱动的网站。例如,用户向我提供产品和名称的pid,单独的程序将启动蜘蛛,收集数据并将其返回给用户。

但是,我想要的唯一信息是在xml的两个链接中找到的产品和人物。如果我知道这两个链接和模式,我如何构建回调来解析不同的项?

例如,如果我定义了这两个项目:

class PersonItem(Item):
     name = Field()
     ...

class ProductItem(Item):
     pid = Field()
     ...

我知道他们的链接有模式:

www.example.com/person/*<name_of_person>*/person.xml
www.example.com/*<product_pid>*/product.xml

然后我的蜘蛛会看起来像这样:

class MySpider(BaseSpider):
     name = "myspider"

     # simulated given by user
     pid = "4545-fw"
     person = "bob"

     allowed_domains = ["http://www.example.com"]
     start_urls = ['http://www.example.com/person/%s/person.xml'%person, 'http://www.example.com/%s/product.xml'%pid]

     def parse(self, response):

          # Not sure here if scrapping person or item

我知道我也可以使用Rule(SgmlLinkExtractor())定义规则,然后为每个人和产品提供自己的解析回调。但是,我不确定它们是如何应用的,因为我认为规则是为了更深层次的爬行,而我只需要刮掉表面层。

1 个答案:

答案 0 :(得分:1)

如果你想要追溯,你可以把你的逻辑放在parse()

def parse(self, response):
    if 'person.xml' in response.url:
        item = PersonItem()
    elif 'product.xml' in response.url:
        item = ProductItem()
    else:
        raise Exception('Could not determine item type')

<强>更新

如果您想要积极主动,可以覆盖start_requests()

class MySpider(BaseSpider):
    name = "myspider"
    allowed_domains = ["example.com"]
    pid = "4545-fw"
    person = "bob"

    def start_requests(self):
        start_urls = (
            ('http://www.example.com/person/%s/person.xml' % self.person, PersonItem),
            ('http://www.example.com/%s/product.xml' % self.pid, ProductItem),
        )
        for url, cls in start_urls:
            yield Request(url, meta=dict(cls=cls))

    def parse(self, response):
        item = response.meta['cls']()