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

问 题

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

解决方案

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

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

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值