我只需要三个条件。
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
答案 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)