0

第2レベルページの条件に基づいてクロールを停止するようscrapyに指示する方法はありますか? 私は次のことをしています:

  1. 最初に start_url があります (第 1 レベルのページ)
  2. parse(self, response) を使用して start_url から抽出された一連の URL があります。
  3. 次に、コールバックを parseDetailPage(self, response) として Request を使用して、リンクをキューに追加します。
  4. 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
4

1 に答える 1

0

スパイダーを停止し、解析済みの URL を解析せずに再開したいということですか? その場合は、JOB_DIR 設定を設定してみてください。この設定により、request.queue をディスク上の指定したファイルに保持できます。

于 2013-02-22T06:55:26.043 に答える