从同一页面中的多个链接中搜索同一项目中的数据?

时间:2016-04-29 21:37:32

标签: python web-scraping scrapy scrapy-spider

如何将scrapy数据解析为同一页面中多个链接的相同项目?我不是想保存一个子页面链接的数据,而是等同于this示例的东西,但不同之处在于我想要从同一页面跟踪更多的一个链接:

A
----> B.1
--------> B.1.1
----> B.2 
--------> B.2.2

总之,我想在根页A,B.1,B.1.1,B.2和B.2.2中保存同一项目中的不同类型的数据。 有人可以给我一个玩具示例吗?

编辑:

想象以下代码:

class MySpider(BaseSpider):

    start_urls = [www.pageA.com]

    def parse(self, response):
        myitem = Item()

        # some initial data
        item['a'] =  response.xpath(...).extract()

        # extract all B.i links
        url_Bi_list = response.xpath(...).extract()

        for url_Bi in url_Bi_list:
            yield Request(url_Bi,
                  ...
                  callback=parseBi,meta=dict(item=myitem))

    def parseBi(self, response):
        my_new_item = response.meta['item']


        # some second data
        item['bi'] =  response.xpath(...).extract()

        # extract B.i.i link
        url_Bii = response.xpath(...).extract()

        yield Request(url_Bii,
                  ...
                  callback=parseBii,meta=dict(item=my_new_item))

    def parseBii(self, response):
        final_item = response.meta['item']

        # extract more data from B.i.i link
        # some third inner data
        my_new_item['bii'] =  response.xpath(...).extract()

        yield final_item

那么,这个代码结构会起作用吗?我不确定何时提出项目或请求......

2 个答案:

答案 0 :(得分:3)

查询多个页面使用示例you just pointed(控制回调),并使用meta parameterdict形式在回调之间传递信息,将项目传递给每个回调lo之后在最后一次回调时返回它。

def parseA(self, response):
    ...
    myitem = MyItem()
    # populate the item
    ...
    yield Request(url=<B url>,
                  ...
                  callback=parseB, meta=dict(item=myitem))

def parseB(self, response):
    my_new_item = response.meta['item']
    ...
    yield Request(url=<C url>,
                  ...
                  callback=parseC, meta=dict(item=my_new_item))

def parseC(self, response):
    final_item = response.meta['item']
    ...
    yield final_item

答案 1 :(得分:0)

我看到的唯一可以做的工作是scrapy-inline-request