私は開発にかなり慣れておらず、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
が、それが簡単になる場合は、完全なスクレイプスパイダーとして設定できてうれしいです。