我正在尝试使用scrapy抓取多个网页。页面的链接如下:
http://www.example.com/id=some-number
在下一页中,最后的数字会减少 1 。
所以我正在尝试构建一个导航到其他页面的蜘蛛并将它们刮掉。我的代码如下:
import scrapy
import requests
from scrapy.http import Request
URL = "http://www.example.com/id=%d"
starting_number = 1000
number_of_pages = 500
class FinalSpider(scrapy.Spider):
name = "final"
allowed_domains = ['example.com']
start_urls = [URL % starting_number]
def start_request(self):
for i in range (starting_number, number_of_pages, -1):
yield Request(url = URL % i, callback = self.parse)
def parse(self, response):
**parsing data from the webpage**
这是一个无限循环,在打印页码时我得到负数。我认为这种情况正在发生,因为我在parse()
函数中请求了一个页面。
但是给出here的例子没问题。我哪里错了?
答案 0 :(得分:4)
请求的第一页是“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
... {{ 1}}
你猜第三次会发生什么:http://www.example.com/id=0
,http://www.example.com/id=-1
...... http://www.example.com/id=-2
对于每个回复,您将生成500个请求。
您可以通过测试http://www.example.com/id=-500
在评论中的OP问题后编辑:
不需要多个线程,Scrapy异步工作,您可以在重写的self.page_number >= 0
方法中排队所有请求(而不是请求1个页面,然后在start_requests()
中返回Request
个问题} 方法)。
Scrapy将收集足够的请求来填充它的管道,解析页面,选择新的发送请求等等。
请参阅start_requests documentation。
这样的事情会起作用:
parse