Python 2.7 在Python中完成递归异步作业后如何调用函数?

Python 2.7 在Python中完成递归异步作业后如何调用函数?,python-2.7,recursion,web-scraping,scrapy,web-crawler,Python 2.7,Recursion,Web Scraping,Scrapy,Web Crawler,我用刮泥来刮这个 我想将所有子类别保存在一个数组中,然后获取相应的页面(分页) 我迈出的第一步 def start_requests(self): yield Request(start_urls[i], callback=self.get_sous_cat) get_sous_cat是一个函数,它获取站点的所有子类别,然后异步启动作业以递归地探索子类别 def get_sous_cat(self,response): #Put all the categgor

我用刮泥来刮这个

我想将所有子类别保存在一个数组中,然后获取相应的页面(分页)


我迈出的第一步

def start_requests(self):
        yield Request(start_urls[i], callback=self.get_sous_cat)
get_sous_cat是一个函数,它获取站点的所有子类别,然后异步启动作业以递归地探索子类别

   def get_sous_cat(self,response):
    #Put all the categgories in a array
    catList = response.css('div.categoryRefinementsSection')
    if (catList):
        for category in catList.css('a::attr(href)').extract():
            category = 'https://www.amazon.fr' + category
            print category
            self.arrayCategories.append(category)
            yield Request(category, callback=self.get_sous_cat)
发送所有相应请求后,我需要调用此终止功能:

def pagination(self,response):
    for i in range(0, len(self.arrayCategories[i])):
        #DO something with each sub-category
我试过这个

def start_requests(self):

    yield Request(start_urls[i], callback=self.get_sous_cat)

    for subCat in range(0,len(self.arrayCategories)):
       yield Request(self.arrayCategories[subCat], callback=self.pagination)
这不是“递归”,而是异步作业。您需要的是一个全局计数器(受锁保护),如果为0,请完成以下操作:

from threading import Lock

class JobCounter(object):
   def __init__(self, completion_callback, *args, **kwargs):
      self.c = 0
      self.l = Lock()
      self.completion = (completion_callback, args, kwargs)
   def __iadd__(self, n):
      b = false
      with self.l:
         self.c += n
         if self.c <= 0:
            b = true
      if b:
         f, args, kwargs = self.completion
         f(*args, **kwargs)
   def __isub__(self, n):
      self.__iadd__(-n)
来自线程导入锁
类作业计数器(对象):
定义初始化(self,completion,callback,*args,**kwargs):
self.c=0
self.l=Lock()
self.completion=(completion\u回调、args、kwargs)
定义(self,n):
b=错误
与self.l:
自身c+=n

如果self.c做得好,这是一个好问题!两件小事:

a) 使用集合而不是数组。这样你就不会有重复的 b) 站点结构将每月/每年更改一次。你可能会更频繁地爬行。把蜘蛛一分为二;1.创建类别URL列表并每月和每月运行的URL。作为start_获取的URL是由第一个URL生成的文件

现在,如果您真的想按现在的方式来做,那么挂接spider_idle信号(请参见此处:)。当没有更多的URL要做时,就会调用它,并允许您注入更多的URL。在该点设置一个标志或重置列表,这样当爬行器第二次空闲时(在它对所有内容进行爬网之后),它就不会永远重新注入相同类别的URL


在您的例子中,如果您不想对URL进行一些奇特的处理,而只是在其他URL之前抓取类别,那么这就是Request priority属性的作用()。只需将您的类别URL设置为例如1,然后它将在处理任何非类别链接之前跟随这些链接。这更有效,因为它不会像当前实现那样两次加载这些类别页面。

您尝试了“This”,结果如何?这与你的期望有什么不同?你说的完全是指擦肩而过?从您的代码axample中看起来是这样的。你可以试着挂到spider_closed信号上,看看这里的文档。你能解释一下你在分页程序中做了什么吗?在这个链接中,我们有一个17页的类别,我们有一些子类别,比如Repas,我想做的是,把这个页面的url+他的子类别的url,比如Repas,放在一个数组中,使用分页功能可以获得17页的category@Steve我的意思是,我们完成了所有类别的所有子类别的url(一些子类别也有子类别)但是Scrape不是finish yeti编辑了我的问题,我添加了更多信息不确定你是否需要Scrapy的锁:-)它的大部分是扭曲的/单线程的。回答很好,这是我现在知道的关于Scrapy的两个新东西,谢谢。