2016-11-05 11 views
1

私はスパイダーでウェブサイトからjsonデータを抽出しようとしていますが、スパイダーを実行してエラーが発生せず、0ページをクロールしたような問題があります。私は出力を見るために出力をjsonファイルに保存するコマンドも使用します。Scrapy Spider Crawl 0 pages

次のコードは、私のクモです:

import scrapy 

class WineSpider(scrapy.Spider): 
name = "SpidyWine" 
i = 0 
url = 'https://maiscarrinho.com/api/search?q=vinho&pageNumber=%s&pageSize=10' 
start_urls = [url % 1] 

def parse(self, response): 
data = json.loads(response.body) 
for item in data['results']: 
    yield { 
     'Image': item.get('image') 
    } 
if data['Image']: 
    i = i + 1 
    yield scrapy.Request(self.url % i, callback=self.parse) 

やアイテムの私のクラス:

import scrapy 

class MaiscarrinhoItem(scrapy.Item): 

image = scrapy.Field() 
price = scrapy.Field() 
supermarket = scrapy.Field() 
promotion = scrapy.Field() 
wineName = scrapy.Field() 
brand = scrapy.Field() 

今のところ、私は物事をより簡単に取得するために私のクモにImageフィールドを使用しています。 また、私のイデアは、私のスパイダーでifステートメントを書いたとき、無限のスコリングに「対処する」ことでした.Json APIが「Image」を持っていると、そのページに内容があることを意味します。

Output in Console

事前

+0

実行ログを投稿できますか?あなたは 'scrap crawl myspider&> output.log'で取得できます。 – Granitosaurus

+0

@Granitosaurus 私の投稿を編集しました。あなたのコマンドで私のファイルが空だったので、あなたはイメージを持っています。 –

答えて

1

のおかげであなたは右の非常に小さなミスを除いてすべてをしました。

画像を含むフィールド名がImageとされていないimage

試してみてください。間違っても何かがsettings.pyファイルにあなたのITEM_PIPELINESでおそらくあり

yield { 
    'Image': item.get('Image') 
} 

Working with python requests

Works even with scrapy:

+0

ありがとうございますが動作しません。私がコマンドを実行すると:ScidroWine -o output.jsonそれは "[" –

+0

を保存しますあなたはあなたにも 'Image = scrapy.Field() 'にあなたの治療フィールドを変更できますか? これでうまくいかなければ、設定ファイルから 'ITEM_PIPELINES'のパイプライン' MaiscarrinhoItem'をコメントして実行してください。 – Vaulstein

+0

提案したようにフィールドを変更しましたが、うまくいきませんでした。そしてパイプラインについては、settings.pyのITEM_PIPELINESについて話していますか?デフォルトでは、そのコードはすでにコメントになっています。 –

1

よく私の質問に答えて、しばらくしてから私のコードを掘り下げた後に...私はそれがidentationエラーとsyntaxeのいくつかの誤りであることに気付きました。

もう一つのポイントは、パイプラインだった、私は私のパイプラインの本当の名前に解除姓を変更するのを忘れて、その代わりに'Maiscarrinho.pipelines.SomePipeline': 300を有するので、今私は私が望むように画像を抽出している'Maiscarrinho.pipelines.MaiscarrinhoPipeline': 300

怒鳴るコードを持っていますが、まだ1つの問題があります。ページには無限のスクロールがあるので、'Imageという名前の要素があるかどうかを評価するための条件がありますが、何らかの理由で目的の結果が得られません。それは10のイメージでそれぞれ40ページを抽出する必要があります。

import scrapy 
import json 

class WineSpider(scrapy.Spider): 
name = "SpidyWine" 

url = 'https://maiscarrinho.com/api/search?q=vinho&pageNumber=%s&pageSize=10' 
start_urls = [url % 1] 
i = 1 
def parse(self, response): 
    data = json.loads(response.body.decode('utf-8')) 
    for item in data['results']: 
     yield { 
      'Image': item.get('Image') 
     } 
     if item.get('Image'): 
      WineSpider.i += 1 
      yield scrapy.Request(self.url % WineSpider.i, callback=self.parse) 
関連する問題