我在Scrapy中有一个scrape设置,它以数字顺序定位1M个唯一的URL。例如:http://www.foo.com/PIN=000000000001
我在数据库中保存了PIN码。我没有将1M PIN加载到内存中并创建1M start_urls,而是使用start_requests()函数一次向DB查询5000个PIN。在完成5000个唯一的URL之后,我想重新启动scrape并继续执行它,直到所有1M URL都被删除。在scrapy用户组中,他们建议我使用spider_idle函数继续重新启动scrape。我根据下面的代码正确设置了它,但我似乎无法找到正确的代码来重新启动scrape。见下文:
class Foo(Spider):
name = 'foo'
allowed_domains = ['foo.com']
def __init__(self, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
dispatcher.connect(self.spider_idle, signals.spider_idle)
def spider_idle(self, spider):
print 'idle function called' # this prints correctly so I know this function is getting called.
self.start_requests() #this code does not restart the query
def start_requests(self):
data = self.coll.find({'status': 'unscraped'}).limit(5000)
for row in data:
pin = row['pin']
url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin)
yield Request(url, meta={'pin': pin})
重启刮片需要什么代码?
答案 0 :(得分:2)
我不会重新启动蜘蛛,而是会在数据库中查询unscraped
个项目,直到没有任何内容为止:
class Foo(Spider):
name = 'foo'
allowed_domains = ['foo.com']
def start_requests(self):
while True:
data = self.coll.find({'status': 'unscraped'}).limit(5000)
if not data:
break
for row in data:
pin = row['pin']
url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin)
yield Request(url, meta={'pin': pin})
您可能需要使用限制和偏移量对集合实现真正的分页。