为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

吃鸡游戏 2019-02-25 15:53:08
抓取知乎首页的动态的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
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

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

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

查看完整回答
反对 回复 2019-03-04
  • 1 回答
  • 0 关注
  • 427 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信