12

関数を書くときparse()、1 つのページに対してリクエストとアイテムの両方を生成できますか?

ページ A でいくつかのデータを抽出し、そのデータをデータベースに保存して、たどるリンクを抽出したいと考えています (これは CrawlSpider のルールで実行できます)。

A ページのリンク ページを B ページと呼ぶので、別の parse_item() を記述して B ページからデータを抽出できますが、B ページのいくつかのリンクを抽出したいので、ルールを使用してリンクを抽出することしかできませんか? Scrapy で重複する URL に取り組む方法は?

4

3 に答える 3

23

はい、依頼とアイテムの両方を譲ることができます。私が見たものから:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    base_url = response.url
    links = hxs.select(self.toc_xpath)

    for index, link in enumerate(links):
        href, text = link.select('@href').extract(), link.select('text()').extract()
        yield Request(urljoin(base_url, href[0]), callback=self.parse2)

    for item in self.parse2(response):
        yield item
于 2013-04-11T03:48:52.213 に答える
10

私はあなたの質問を100%理解していませんが、以下のコードは、basespiderを使用して開始URLからサイトをリクエストし、hrefの開始URLをスキャンしてから、 parse_url を呼び出す各リンクをループしますparse_urlで一致したものはすべてアイテム パイプラインに送信されます。

def parse(self, response):
       hxs = HtmlXPathSelector(response)
       urls = hxs.select('//a[contains(@href, "content")]/@href').extract()  ## only grab url with content in url name
       for i in urls:
           yield Request(urlparse.urljoin(response.url, i[1:]),callback=self.parse_url)


def parse_url(self, response):
   hxs = HtmlXPathSelector(response)
   item = ZipgrabberItem()
   item['zip'] = hxs.select("//div[contains(@class,'odd')]/text()").extract() ## this bitch grabs it
   return item
于 2013-01-02T04:00:22.843 に答える
4

Google グループの Steven Almeroth から:

そうです、リクエストを生成してアイテムのリストを返すことはできますが、それはあなたが試みていることではありません。アイテムを返すのではなく、アイテムのリストを生成しようとしています。また、既に parse() をジェネレーター関数として使用しているため、yield と return の両方を一緒にすることはできません。しかし、あなたは多くの収量を持つことができます。

これを試して:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    base_url = response.url
    links = hxs.select(self.toc_xpath)

    for index, link in enumerate(links):
        href, text = link.select('@href').extract(), link.select('text()').extract()
        yield Request(urljoin(base_url, href[0]), callback=self.parse2)

    for item in self.parse2(response):
        yield item
于 2014-05-09T20:43:09.930 に答える