请求的第一页是“http://www.example.com/id=1000 http://www.example.com/id=1000" (starting_number
)
它的响应通过parse()
与for i in range (0, 500):
你正在请求http://www.example.com/id=999
, http://www.example.com/id=998
, http://www.example.com/id=997
...http://www.example.com/id=500
self.page_number
是一个蜘蛛属性,所以当你减少它的值时,你有self.page_number == 500
在第一个之后parse()
.
所以当Scrapy调用时parse
的回应http://www.example.com/id=999
,您正在生成请求http://www.example.com/id=499
, http://www.example.com/id=498
, http://www.example.com/id=497
...http://www.example.com/id=0
你猜第三次会发生什么:http://www.example.com/id=-1
, http://www.example.com/id=-2
...http://www.example.com/id=-500
对于每个响应,您将生成 500 个请求。
您可以通过测试来停止循环self.page_number >= 0
在评论中的OP问题后编辑:
不需要多个线程,Scrapy 异步工作,您可以将所有请求放入重写的队列中start_requests()
方法(而不是请求 1 页,然后返回Request
中的实例parse
方法)。
Scrapy 将接受足够的请求来填充其管道、解析页面、选择要发送的新请求等。
See start_requests 文档 http://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.spider.Spider.start_requests.
像这样的事情会起作用:
class FinalSpider(scrapy.Spider):
name = "final"
allowed_domains = ['example.com']
start_urls = [URL % starting_number]
def __init__(self):
self.page_number = starting_number
def start_requests(self):
# generate page IDs from 1000 down to 501
for i in range (self.page_number, number_of_pages, -1):
yield Request(url = URL % i, callback=self.parse)
def parse(self, response):
**parsing data from the webpage**