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

发布于 2022-09-04 03:41:09 字数 3369 浏览 9 评论 0

抓取知乎首页的动态的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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最好是你 2022-09-11 03:41:09

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文