Scrapy:为什么我应该为多个请求使用yield?

时间:2015-07-21 15:45:18

标签: request scrapy yield sequential

我只需要三个条件。

1)登录
2)多个请求
3)同步请求(顺序如' C')

我意识到'产量'应该用于多个请求 但我认为'产量'与C' C'而不是顺序的 所以我想在没有' yield'的情况下使用请求。如下。
但爬行方法通常不被称为 如何像C一样按顺序调用爬网方法?

class HotdaySpider(scrapy.Spider):

name = "hotday"
allowed_domains = ["test.com"]
login_page = "http://www.test.com"
start_urls = ["http://www.test.com"]

maxnum = 27982
runcnt = 10

def parse(self, response):
    return [FormRequest.from_response(response,formname='login_form',formdata={'id': 'id', 'password': 'password'}, callback=self.after_login)]

def after_login(self, response):
    global maxnum
    global runcnt
    i = 0

    while i < runcnt :
        **Request(url="http://www.test.com/view.php?idx=" + str(maxnum) + "/",callback=self.crawl)**
        i = i + 1

def crawl(self, response):
    global maxnum
    filename = 'hotday.html'

    with open(filename, 'wb') as f:            
    f.write(unicode(response.body.decode(response.encoding)).encode('utf-8'))
    maxnum = maxnum + 1

1 个答案:

答案 0 :(得分:0)

当您返回一个请求列表时(这是您yield许多请求时所执行的操作),Scrapy将安排它们,您无法控制响应的顺序。

如果要按顺序一次处理一个响应,则必须在after_login方法中只返回一个请求,并在爬网方法中构造下一个请求。

def after_login(self, response):
    return Request(url="http://www.test.com/view.php?idx=0/", callback=self.crawl)

def crawl(self, response):
    global maxnum
    global runcnt
    filename = 'hotday.html'

    with open(filename, 'wb') as f:            
    f.write(unicode(response.body.decode(response.encoding)).encode('utf-8'))
    maxnum = maxnum + 1
    next_page = int(re.search('\?idx=(\d*)', response.request.url).group(1)) + 1
    if < runcnt:
        return Request(url="http://www.test.com/view.php?idx=" + next_page + "/", callback=self.crawl)