2

私は開発にかなり慣れておらず、Scrapyにも非常に慣れていません。これまでのところ、ドキュメントを入手しましたが、通り抜けられないような壁にぶつかりました。以下は私が持っている基本的なスパイダーです(無実を保護するためにURLが変更されました)。

開始URLには、製品カテゴリのリストが含まれています。これらは、解析する製品ページにリンクするサブカテゴリのリストを含むページにリンクしています。

私のスパイダーは現在エラーなしで実行されており、必要なすべてのページをフェッチしているようですが、呼び出したくありませんparse_product()。コードは次のとおりです。

# coding=utf-8
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item, Field

class MySpider(CrawlSpider):
    name = "MySpider"
    allowed_domains = ["www.mysite.com"]
    start_urls = ["http://www.mysite.com/start_page/",]

    rules = (
    Rule(SgmlLinkExtractor(restrict_xpaths='//body[@class="item"] '),     # Product page
                                    callback='parse_product'),
    Rule(SgmlLinkExtractor(restrict_xpaths="//ul[@id='products_ul']/li"), # First 2 pages - same xpath to follow.
                                    )
    )

    def parse_product(self, response):
        print " parsing product" # Print statement added for testing purposes - test failed.
        hxs = HtmlXPathSelector(response)
        item = MySpiderItem()
        item['name']  = hxs.select('/xpath/to/name')
        item['description'] = hxs.select('/xpath/to/description' )
        item['image'] = hxs.select('/xpath/to/image')
        print item    # Print statement added for testing purposes - test failed.
        return item   


class MySpiderItem(Item):
    name = Field()
    description = Field()
    image = Field()

質問:

1)これは私がやりたいことをするべきですか?

わかりました、明らかに、そうではありません、それが私がここにいる理由です!しかし、これが悪いxpathによるものなのか、それともparse_product間違って呼び出しているのかはわかりません。例:製品ページにそのリンクエクストラクタが必要ですか?私はそこからリンクをたどっていませんが、それなしで解析するようにそれらをターゲットにするにはどうすればよいですか?)

理論的には、フォローするリンクのリストを含む猫/サブ猫ページと、("//ul[@id='products_ul']/li")解析する必要のある製品ページの2種類のページのみを取得する必要があります(これらの一貫した識別子は<body class="mainpage version2 **item**">vsのみです<body class="mainpage version2 **category**">

2)出力をcsv(またはその他の単純なテキスト形式)に保存するにはどうすればよいですか?

このためのドキュメントは私を混乱させました(これは、全体として優れているので、不十分なドキュメントではなく、私の理解の欠如によるものだと確信しています)、それはあなたを輪になって送り、どのファイルを言わずに例を示します例を書く必要があります。

私は現在、テストを容易にするためにこのスパイダーをスタンドアロンファイルとして使用しています$ scrapy runspider filename.pyが、それが簡単になる場合は、完全なスクレイプスパイダーとして設定できてうれしいです。

4

1 に答える 1

0

ルールに一致する場合に移動する場所を定義していないため、デフォルトでparse_productを呼び出しています。 parse_productに移動したくない場合は、任意のコールバックに言及でき ますparse_productではなく

現在、 python csvモジュールを使用する必要があるスクレイピープロジェクトをセットアップしていません

ヒントは、 initメソッドでファイルとライター オブジェクトを作成し、parse_product を使用して各項目をファイルに書き込むことができることです。

スクレイピープロジェクトをセットアップしたい場合、スクレイピーにはデフォルトのエクスポーターが付属しており、これらの設定をsettings.pyで言及するだけで済みます

FEED_EXPORTERS = {
     'csv': 'scrapy.contrib.exporter.CsvItemExporter',
} # enabling Csv Exporter
FEED_FORMAT = 'csv' # output formate
FEED_URI = "output.csv" # file name and path

残りは、scrapy builten exporter が代わりに行います。それが役に立てば幸い

于 2012-09-19T07:00:08.333 に答える