10

これは私の単純なコードであり、うまくいきません。

私はからサブクラス化していますinitspider

これは私のコードです

class MytestSpider(InitSpider):
    name = 'mytest'
    allowed_domains = ['example.com']
    login_page = 'http://www.example.com'
    start_urls = ["http://www.example.com/ist.php"]

    def init_request(self):
        #"""This function is called before crawling starts."""
        return Request(url=self.login_page, callback=self.parse)

    def parse(self, response):
        item = MyItem()
        item['username'] = "mytest"
        return item

パイプライン

class TestPipeline(object):
    def process_item(self, item, spider):
            print item['username']

アイテムを印刷しようとすると、同じエラーが発生します

私が得るエラーは

 File "crawler/pipelines.py", line 35, in process_item
            myitem.username = item['username']
        exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'

私は問題がありInitSpiderます。私のパイプラインは項目オブジェクトを取得していません

アイテム.py

class MyItem(Item):
    username = Field()

設定.py

BOT_NAME = 'crawler'

SPIDER_MODULES = ['spiders']
NEWSPIDER_MODULE = 'spiders'


DOWNLOADER_MIDDLEWARES = {

    'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700 # <-
}

COOKIES_ENABLED = True
COOKIES_DEBUG = True


ITEM_PIPELINES = [

'pipelines.TestPipeline',


]

IMAGES_STORE = '/var/www/htmlimages'
4

3 に答える 3

3

pipelines.TestPipeline注文番号がありません。のようなものになるはずですITEM_PIPELINES = {'pipelines.TestPipeline': 900}

于 2015-01-02T07:25:23.823 に答える
2

これは私がやったことであり、うまくいきました:

  1. MytestSpiderクラスでは、次のようにparse関数を記述します。

    def parse(self, response):
        yield {'username': "mytest"}
    
  2. Remove items.py、 Item クラスを作成していませんが、それでも機能しました

  3. パイプライン コードで:

    class TestPipeline(object):
    
        def process_item(self, item, spider):
            print item['username']
    

私のテストコードでyieldは、スパイダー内のすべてが Pipeline のアイテムになるようprocess_itemですが、生成結果は辞書または Item オブジェクトでなければなりません...上記の最初の回答と同じです。

  1. settings.py では、ここのパスによって出力が得られるかどうかが決まる可能性があるため、プロジェクト全体の構造はわかりません。「クローラー」は「スパイダー」という別のフォルダーがあるフォルダーであり、スパイダーコードはこの「スパイダー」フォルダーにあると想定しています。あなたのpipelines.pyも「クローラー」フォルダーの下にあります私にとって、これはうまくいきました:

    BOT_NAME = 'crawler'
    
    SPIDER_MODULES = ['crawler.spiders']
    NEWSPIDER_MODULE = 'crawler.spiders'
    
    ROBOTSTXT_OBEY = True
    DOWNLOAD_DELAY = 3
    
    ITEM_PIPELINES = {
       'crawler.pipelines.ScrapeNewsPipeline': 400,
    }
    
  2. 最後に、コードを実行するために、私は python ターミナルを使用し、クローラー フォルダーがあるコード フォルダーに cd してから実行しました。

    scrapy runspider crawler/spiders/my_test_spider.py
    

私のテストコードはあなたのものと100%同じではありませんが、これが役に立てば幸いです

于 2016-11-21T00:20:20.390 に答える
2

あなたのprocess_item機能には別の問題があります。公式ドキュメントによると:

このメソッドは、すべてのアイテム パイプライン コンポーネントに対して呼び出され、データ、アイテム (または任意の子孫クラス) オブジェクトを含む dict を返すか、DropItem 例外を発生させる必要があります。ドロップされたアイテムは、それ以降のパイプライン コンポーネントによって処理されなくなりました。

あなたの場合、関数の最後に return ステートメントを追加できます。

def process_item(self, item, spider):
    print item['username']
    return item

return ステートメントを含めない場合、このパイプラインの戻り値は ですNoneitem['username']それが、次のパイプラインが不平を言う理由itemですNone

于 2016-04-10T01:51:54.430 に答える