【问题标题】:Scrapy, bind start_url to a specific parse item so they can be parsed one after anotherScrapy,将 start_url 绑定到特定的解析项,以便可以一个接一个地解析它们
【发布时间】:2016-05-19 20:44:27
【问题描述】:

你好!我遇到了一些问题,我试图弄清楚如何为 crawlspider 类中的特定 parse_item 方法设置起始 URL。

假设我有不止一个起始网址,为了简单起见有两个。

所以:start_urls = ["www.website1.com","www.website2.com"]

现在假设我有两个解析函数,分别名为 parse_item1 和 parse_item2。

我已经将 parse_item1 设置为回调 parse_item2,反之亦然。

所以它们确实是按顺序运行的。

现在我遇到了一些问题,我想一个接一个地遍历每个 start_url。

如下:example1,example2,example1,example2。 不是:example1,example1,example2,example2,example2,example1。

我以为我会使用两个 parse_item 函数来这样做,但现在我遇到了问题。

即使他们仍然按顺序互相调用,但他们往往不会按顺序调用每个起始 url。

所以我的问题是,是否有可能,如果可以,我如何将例如 www.example1.com 绑定到 parse_item1 和 www.example2.com 到 parse_item2 以便它们一个接一个地被调用。

class juggler(CrawlSpider):

name = "juggle"
allowed_domains = ["example1.com","example2.com"]
start_urls = ["http://www.example1.com/","http://www.example2.com/"]
rules = [
    Rule(LinkExtractor(),callback="parse_all",follow=False)
    ]



def parse_all(self,response):
    yield self.parse_item1(response) 
    yield self.parse_item2(response)

def parse_item1(self,response):
    time.sleep(1)
    item = TwolaircrawlerItem()
    print "Item 1!"
    link = response.url
    print link
    return Request(url=link,callback="self.parse_item2")


def parse_item2(self,response):
    time.sleep(1)
    item = TwolaircrawlerItem()
    print "Item 2!"
    link = response.url
    print link
    return Request(url=link,callback="self.parse_item1")

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    默认情况下没有保证顺序,这就是 Scrapy 的工作原理。

    如果您需要以严格的顺序逐个处理请求,则需要手动维护请求队列,如下所示:

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 1970-01-01
      • 2014-04-20
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多