3
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from manga.items import MangaItem

class MangaHere(BaseSpider):
    name = "mangah"
    allowed_domains = ["mangahere.com"]
    start_urls = ["http://www.mangahere.com/seinen/"]

    def parse(self,response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//ul/li/div')
        items = []
        for site in sites:
            rating = site.select("p/span/text()").extract()
            if rating > 4.5:
                item = MangaItem()
                item["title"] = site.select("div/a/text()").extract()
                item["desc"] = site.select("p[2]/text()").extract()
                item["link"] = site.select("div/a/@href").extract()
                item["rate"] = site.select("p/span/text()").extract()
                items.append(item)

        return items

私の目標は、www.mangahere.com/seinenまたはそのサイト上の何かをクロールすることです。すべてのページに目を通し、4.5以上の評価の本を集めたいと思います。私はベーススパイダーとして始めて、スクレイピーなチュートリアルをコピーして読んでみましたが、それはほとんど頭に浮かびました。ルールを作成するために何をするのか、そしてどのように行うのかを尋ねるためにここにいます。また、条件を機能させることができないようです。コードは最初の項目のみを返し、条件に関係なく停止するか、条件に関係なくすべてを取得します。私はおそらくかなりめちゃくちゃなコードを知っていますが、私はまだ学ぶのに苦労しています。コードを修正するか、他のアドバイスを提供してください

4

1 に答える 1

6

厳密に言えば、私のコードはのBaseSpider代わりにを使用しているため、これは質問に答えてCrawlSpiderいませんが、OPの要件を満たしているので...

注意点:

  1. すべてのページネーションリンクが利用できるわけではないので(最初の9つ、次に最後の2つを取得します)、私はややハックなアプローチを採用しました。コールバックの最初の応答を使用してparse、クラスが「next」のリンクを検索し(1つしかないため、どのリンクに対応するかを確認してください)、直前の兄弟を見つけます。これにより、青年カテゴリの総ページ数(現在は45ページ)を把握できます。
  2. 次に、parse_itemコールバックによって処理される最初のページのRequestオブジェクトを生成します。
  3. 次に、合計45ページあると判断した場合、「。/ seinen/2.htm」から「./seinen/45.htm」までの一連のRequestオブジェクト全体を生成します。
  4. はリストであり、その値はfloatであるためrating(条件が4.5であることに基づいて認識しているはずです)、発生したエラーを修正する方法は、評価のリストをループし、各項目をfloatにキャストすることです。

とにかく、次のコードを見て、それが理にかなっているかどうかを確認してください。理論的には、このコードを簡単に拡張して複数のカテゴリをスクレイプできるはずですが、それはOPの演習として残されています。:)

from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from tutorial.items import MangaItem
from urlparse import urlparse

class MangaHere(BaseSpider):
    name = "mangah2"
    start_urls = ["http://www.mangahere.com/seinen/"]
    allowed_domains = ["mangahere.com"]

    def parse(self, response):
        # get index depth ie the total number of pages for the category
        hxs = HtmlXPathSelector(response)
        next_link = hxs.select('//a[@class="next"]')
        index_depth = int(next_link.select('preceding-sibling::a[1]/text()').extract()[0])

        # create a request for the first page
        url = urlparse("http://www.mangahere.com/seinen/")
        yield Request(url.geturl(), callback=self.parse_item)

        # create a request for each subsequent page in the form "./seinen/x.htm"
        for x in xrange(2, index_depth):
            pageURL = "http://www.mangahere.com/seinen/%s.htm" % x
            url = urlparse(pageURL)
            yield Request(url.geturl(), callback=self.parse_item)

    def parse_item(self,response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//ul/li/div')
        items = []
        for site in sites:
            rating = site.select("p/span/text()").extract()
            for r in rating:
                if float(r) > 4.5:
                    item = MangaItem()
                    item["title"] = site.select("div/a/text()").extract()
                    item["desc"] = site.select("p[2]/text()").extract()
                    item["link"] = site.select("div/a/@href").extract()
                    item["rate"] = site.select("p/span/text()").extract()
                    items.append(item)
        return items
于 2013-01-20T00:59:56.730 に答える