pyspider run状态下result没有数据,而且没有继续向下执行,为什么?

抽风的胖纸
  • 8

抓取知乎首页的动态的url,使用了一个循环,但是run时,只执行了一遍,没有循环。并且results中没有return的数据。

def __init__(self):
        
        self.start_num = -1
        
        self.question_url=[]

        self.data = {"params":'{"offset":10,"start":-1}',"method":"next"}

        self.next_url = 'https://www.zhihu.com/node/TopStory2FeedList'
        
    
    def on_start(self):
       # self.crawl("https://www.zhihu.com",callback=self.detail_page)    
        
        data = self.change(self.data,self.start_num)
        
        if data:
            self.crawl(url=self.next_url,method='POST',data=data,callback=self.index_page)
       

    
    #处理之后动态加载的网页   注意首页有些是转载的网站  比如专栏,这个的匹配路径不同
    def index_page(self, response): 
        if response:
            #如果访问加载页面成功,那么存储新加载的网页url
            self.dpage(response,self.start_num,self.question_url)
            
            #改变data,实现更多加载
            data = self.change(self.data,self.start_num)
            

            self.crawl(url=self.next_url,method="POST",data=data,callback=self.detail_page,save={'question_url':self.question_url,'start':self.start_num})
    
    
    
    #这个函数循环回调(但是在run的状态下没有执行到这个函数)
    def detail_page(self, response):
        try:
            if response:
                self.start_num = response.save['start']
                self.question_url = response.save['question_url'] 
                #抓取首页网址并存储
                self.dpage(response,self.start_num,self.question_url)

                data = self.change(self.data,self.start_num)

                self.crawl(url=self.next_url,method="POST",data=data,callback=self.detail_page,save={'question_url':self.question_url,'start':self.start_num})


            else:
                print '没有响应'
        except BaseException,e:
            print '到达页面底部,首页已经加载完毕'
            
            return {'url':self.question_url}  #在results没有数据
       
            
            
            
    
    #处理抓取首页上的网页
    def dpage(self,response,start_num,question_url):
        num = 0
        self.start_num = start_num
        self.question_url = question_url
        res = self.deal(response)
        rea = res('h2.feed-title > a')
        if rea:
            for each in rea.items():
                if each.hasClass('question_link'):
                    self.question_url.append('https://www.zhihu.com' + each.attr.href)
                else:
                    self.question_url.append(each.attr.href)
                num += 1
            
            #下一个将要将在的页面的网址参数start
            self.start_num = self.start_num +num + 1
            for each in self.question_url:
                print each
        else:
            print '匹配出错'
        
       
    #处理问题页面的信息抓取
    def questionDeal(self,response):
        pass
    
    def deal(self,response):
        html = ''.join(response.json['msg'])
        res = pq(html)
        return res
       
        
    
    def change(self,data,start_num):
        if isinstance(data,dict):
            data1 = data['params']
            #字符串data1变成字典
            data1 = json.loads(data1)   
            #修改字典中start的值
            data1['start'] = start_num
            #将字典还原成字符串
            data1 = json.dumps(data1)
            #修改data参数中的params的值
            data['params'] = data1
            return data
        else:
            print '出错! 输入的 data 类型不是字典'
            return None
回复
阅读 2.8k
1 个回答
足兆叉虫
  • 3.5k
✓ 已被采纳

你调用的子函数的结果,不在 callback 中 return 是不会被捕获的。

任务会根据 url 去重,如果 url 相同只执行一次。加 #hash 或者重载 def get_taskid(self, task)

宣传栏