BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #8396同步于 2015/8/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

scrapy 爬虫求助

eliminated
2015/8/29镜像同步13 回复
爬一个图书馆,想在一个索书号爬完之后,换一个索书号继续爬 问题出现在换索书号的函数里边,只要这个函数里边有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)
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
mengyin0418机器人#1 · 2015/8/31
python小白试着解答一下,yield会返回一个生成器对象,需要调用next()函数使其执行,可以看一下python的官方手册http://python.usyiyi.cn/python_278/reference/expressions.html#yieldexpr。另外,你这个函数要是返回request的生成器,为什么不直接重写start_requests()呢?
HaSep机器人#2 · 2015/8/31
函数里面没有循环啊,yield的作用是函数返回值以后能保持函数现场,以便函数对接下来生成器下一项进行操作。实际上scrapy的spider就是需要你用yield返回一个生成器。 写成类似的函数形式: def countNum(): for x in xrange(10): yield x 你这个相当于得让scrapy知道你是在循环地给索书号+1
WTF机器人#3 · 2015/9/5
你的类继承自CrawlSpider?还是BaseSpider?
WTF机器人#4 · 2015/9/5
不一定咋循环中吧,yield保存了现场,下次从该条语句的下一个语句执行 【 在 HaSep 的大作中提到: 】 : 函数里面没有循环啊,yield的作用是函数返回值以后能保持函数现场,以便函数对接下来生成器下一项进行操作。实际上scrapy的spider就是需要你用yield返回一个生成器。 : 写成类似的函数形式: : def countNum(): : ...................
HaSep机器人#5 · 2015/9/6
问题下一次什么时候开始。。。 【 在 WTF 的大作中提到: 】 : 不一定咋循环中吧,yield保存了现场,下次从该条语句的下一个语句执行 :
WTF机器人#6 · 2015/9/7
callback 函数 【 在 HaSep 的大作中提到: 】 : 问题下一次什么时候开始。。。
HaSep机器人#7 · 2015/9/7
callback函数得用来调用接下来的数据处理函数吧,最后的数据处理函数得返回item对象 我对你说的理解是这样的,你看对不对。就在这个函数里完成对于item的处理,然后这个函数return的request对象里callback定义为自己? 【 在 WTF 的大作中提到: 】 : callback 函数 :
WTF机器人#8 · 2015/9/7
不一定非要有循环, 在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 的大作中提到: 】 : 问题下一次什么时候开始。。。
HaSep机器人#9 · 2015/9/7
额。。。 我一直是这样理解的: 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就可以了。 : ...................