返回信息流爬一个图书馆,想在一个索书号爬完之后,换一个索书号继续爬
问题出现在换索书号的函数里边,只要这个函数里边有yield Request(nextUrl, callback=self.parse)这个语句,这个函数就不执行了,log文件里也没有错误提示,就是不能执行这个函数,删除这个语句后就可以执行,实在找不到问题在哪儿,连百度都不知道关键词应该怎么说[ema1]特来求助byr……
为什么会因为一个语句导致不执行该函数呢。。。
整个文件代码贴上来会显得很乱,我又不知道怎么让代码部分想csdn博客那样高亮,所以只贴该函数代码如下
def createCallNo(self):
print "========================Creating next CallNo==========================="
curUrl = ''.join(self.start_urls)
curCall = ''.join(re.findall('strText=[A-Z]',curUrl))
print curCall
if(curCall[len(curCall)-1] == 'B'):
pass
else:
nextCall = curCall.replace(curCall[len(curCall)-1],chr(ord(curCall[len(curCall)-1])+1)) #索书号加1,例如A->B
nextUrl = ''.join(re.sub('strText=[A-Z]',nextCall,curUrl))
print nextUrl
yield Request(nextUrl, callback=self.parse)
这是一条镜像帖。来源:北邮人论坛 / python / #8396同步于 2015/8/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
scrapy 爬虫求助
eliminated
2015/8/29镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
python小白试着解答一下,yield会返回一个生成器对象,需要调用next()函数使其执行,可以看一下python的官方手册http://python.usyiyi.cn/python_278/reference/expressions.html#yieldexpr。另外,你这个函数要是返回request的生成器,为什么不直接重写start_requests()呢?
函数里面没有循环啊,yield的作用是函数返回值以后能保持函数现场,以便函数对接下来生成器下一项进行操作。实际上scrapy的spider就是需要你用yield返回一个生成器。
写成类似的函数形式:
def countNum():
for x in xrange(10):
yield x
你这个相当于得让scrapy知道你是在循环地给索书号+1
不一定咋循环中吧,yield保存了现场,下次从该条语句的下一个语句执行
【 在 HaSep 的大作中提到: 】
: 函数里面没有循环啊,yield的作用是函数返回值以后能保持函数现场,以便函数对接下来生成器下一项进行操作。实际上scrapy的spider就是需要你用yield返回一个生成器。
: 写成类似的函数形式:
: def countNum():
: ...................
callback函数得用来调用接下来的数据处理函数吧,最后的数据处理函数得返回item对象
我对你说的理解是这样的,你看对不对。就在这个函数里完成对于item的处理,然后这个函数return的request对象里callback定义为自己?
【 在 WTF 的大作中提到: 】
: callback 函数
:
不一定非要有循环,
在scrapy中 parse函数是 scrapy engine 的callback 函数, 而该parse 返回一个 generator, 我觉得在scrapy engine 中是调用的 这个 callback 函数的 next 方法,所以这个时候就开始调用了
比如这段代码,同样没有loop 调用 generator 的next就可以了。
def Generator():
yield 1
yield 2
yield 3
pass
g=Generator()
print g.next()
print g.next()
【 在 HaSep 的大作中提到: 】
: 问题下一次什么时候开始。。。
额。。。
我一直是这样理解的:
start_request里定义了要爬取的url池,然后通过parse函数去分别解析每一个url,如果针对每个url池里的url要再去定义新的规则,就得再定义新的生成器。形成类似树的结构,不知道这样说明不明白。
至于callback只是告诉scrapy这个request由哪个函数接受而已。
【 在 WTF 的大作中提到: 】
: 不一定非要有循环,
: 在scrapy中 parse函数是 scrapy engine 的callback 函数, 而该parse 返回一个 generator, 我觉得在scrapy engine 中是调用的 这个 callback 函数的 next 方法,所以这个时候就开始调用了
: 比如这段代码,同样没有loop 调用 generator 的next就可以了。
: ...................