2015-12-22 32 views
0

我有以下url开头:http://somedomain.mytestsite.com/?offset=0。我想通过增加offset参数来循环这个url,比如说每次100。每次我收到响应时,我都需要检查一些条件以决定是否应该运行下一次迭代。例如:遍历Scrapy中的url params模板

class SomeSpider(BaseSpider): 
name = 'somespider' 

offset = 0 
items = list() 

def start_requests(self): 
    return [scrapy.Request("http://somedomain.mytestsite.com/?offset="+str(self.offset), callback=self.request_iterator)] 

def request_iterator(self, response): 
    body = response.body 
    #let's say we get json as response data 
    data = json.loads(body) 
    #check if page still have data to process 
    if data["matches"]: 
     self.items.extend(data["matches"]) 
     self.offset += 100 
     return self.start_requests() 
    else: 
     #process collected data in items list 
     return self.do_something_with_items() 

这有效,但我不禁感觉这个代码有什么问题。也许我应该使用一些scrapy的rules

回答

1

下面的东西可以改善:

1)不保留的项目,如蜘蛛的属性,你会消耗的内存量极有更大的投入,使用Python发电机代替。当您使用生成器时,您可以毫不费力地从一个蜘蛛回调中产生项目和请求。

2)start_requests在蜘蛛用于调试,似乎有一点需要覆盖它们在你的代码,如果重命名你的方法来解析(默认方法名回调start_requests执行)的代码将更具可读性

# we should process at least one item otherwise data["matches"] will be empty. 
start_urls = ["http://somedomain.mytestsite.com/?offset="+1] 

def parse(self, response): 
    body = response.body 
    #let's say we get json as response data 
    data = json.loads(body) 
    #check if page still have data to process 
    if data["matches"]: 
     for x in data["matches"]: 
      yield self.process_your_item(x) 
     self.offset += 100 
     yield self.next_request() 
    else: 
     #process collected data in items list 
     for x self.do_something_with_items(): 
      yield x 

def next_request(self): 
    return scrapy.Request("http://somedomain.mytestsite.com/?offset="+str(self.offset)) 

甚至可能更好版本的回调将是:

def parse(self, response): 
    body = response.body 
    #let's say we get json as response data 
    data = json.loads(body) 
    #check if page still have data to process 
    if not data["matches"]: 
     self.logger.info("processing done") 
     return 
    for x in data["matches"]: 
     yield self.process_your_item(x) 
    self.offset += 100 
    yield self.next_request() 
+0

谢谢!我编辑了'start_urls'属性,以便至少处理一个项目+由于我们在'parse'方法中做了所有的事情,所以'next_request'回调中不需要。 – Helvdan