0

スパイダーを作成するのはこれが初めてで、私の努力にもかかわらず、csv エクスポートに何も返されません。私のコードは次のとおりです。

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector

class Emag(CrawlSpider):
    name = "emag"
    allowed_domains = ["emag.ro"]
    start_urls = [
        "http://www.emag.ro/"]

    rules = (Rule(SgmlLinkExtractor(allow=(r'www.emag.ro')), callback="parse", follow= True))

    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath('//a/@href').extract()
        for site in sites:
            site = str(site)

        for clean_site in site:
            name = clean_site.xpath('//[@id=""]/span').extract()
            return name

問題は、サイトを印刷すると、URL のリストが表示されることです。これで問題ありません。スクレイピーシェルでURLの1つで名前を検索すると、それが見つかります。問題は、すべてのリンクのすべての名前がクロールされたときです。「スクレイピークロールemag> emag.cs​​v」で実行します

何が悪いのかヒントを教えてください。

4

2 に答える 2

1

スパイダーの複数の問題:

  • rules反復可能で、最後の括弧の前にカンマがない必要があります
  • が指定されていませんItem- クラスを定義し、Itemそれをスパイダーparse()コールバックから返す/生成する必要があります

スパイダーの修正版は次のとおりです。

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Field, Item


class MyItem(Item):
    name = Field()


class Emag(CrawlSpider):
    name = "emag"
    allowed_domains = ["emag.ro"]
    start_urls = [
        "http://www.emag.ro/"]

    rules = (Rule(SgmlLinkExtractor(allow=(r'www.emag.ro')), callback="parse", follow=True), )

    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath('//a/@href')
        for site in sites:
            item = MyItem()
            item['name'] = site.xpath('//[@id=""]/span').extract()
            yield item
于 2014-06-18T18:15:24.567 に答える