第2レベルページの条件に基づいてクロールを停止するようscrapyに指示する方法はありますか? 私は次のことをしています:
- 最初に start_url があります (第 1 レベルのページ)
- parse(self, response) を使用して start_url から抽出された一連の URL があります。
- 次に、コールバックを parseDetailPage(self, response) として Request を使用して、リンクをキューに追加します。
- parseDetail (第 2 レベルのページ) の下で、クロールを停止できるかどうかがわかります。
現在、これを達成するために CloseSpider() を使用していますが、問題は、第 2 レベルのページのクロールを開始するまでに、解析対象の URL が既にキューに入れられており、それらをキューから削除する方法がわからないことです。リンクのリストを順番にクロールしてから、parseDetailPage で停止できる方法はありますか?
global job_in_range
start_urls = []
start_urls.append("http://sfbay.craigslist.org/sof/")
def __init__(self):
self.job_in_range = True
def parse(self, response):
hxs = HtmlXPathSelector(response)
results = hxs.select('//blockquote[@id="toc_rows"]')
items = []
if results:
links = results.select('.//p[@class="row"]/a/@href')
for link in links:
if link is self.end_url:
break;
nextUrl = link.extract()
isValid = WPUtil.validateUrl(nextUrl);
if isValid:
item = WoodPeckerItem()
item['url'] = nextUrl
item = Request(nextUrl, meta={'item':item},callback=self.parseDetailPage)
items.append(item)
else:
self.error.log('Could not parse the document')
return items
def parseDetailPage(self, response):
if self.job_in_range is False:
raise CloseSpider('End date reached - No more crawling for ' + self.name)
hxs = HtmlXPathSelector(response)
print response
body = hxs.select('//article[@id="pagecontainer"]/section[@class="body"]')
item = response.meta['item']
item['postDate'] = body.select('.//section[@class="userbody"]/div[@class="postinginfos"]/p')[1].select('.//date/text()')[0].extract()
if item['jobTitle'] is 'Admin':
self.job_in_range = False
raise CloseSpider('Stop crawling')
item['jobTitle'] = body.select('.//h2[@class="postingtitle"]/text()')[0].extract()
item['description'] = body.select(str('.//section[@class="userbody"]/section[@id="postingbody"]')).extract()
return item