2016-06-01 3 views
0
class A1Spider(scrapy.Spider): 
    name = "amazon" 
    allowed_domains = ["www.amazon.com"] 
    start_urls = (
     'http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=golf+balls', 
    ) 
def __init__(self): 
    self.page = 0 

def parse(self, response): 
    self.page += 1 
    #have to view the response from scrapy to determine the xpath. it is different from what the browser sees. 
    #xpath 
    url_x = '//*[starts-with(@id,"result_")]/div/div[3]/div[1]/a/@href' 

    url = response.xpath(url_x).extract() 
    print len(url) 

    for i in url: 
     yield scrapy.Request(i, callback=self.parse_item) 



    #next page 
    NextBottom = response.xpath('//*[@id="pagnNextLink"]/@href').extract_first() 
    NextBottom_a = response.urljoin(NextBottom) 


    # print NextBottom_a 

    # if self.page <= 1: 
    #  yield scrapy.Request(NextBottom_a) 

最後の数行は次のページを要求するために使用されます。 start_url(検索結果の最初のページ)のみを削るときは、24個のアイテムすべてが表示されます。 これらの行を使用して次のページに移動すると、最初のページのほとんどの項目が失われ、2番目のページからも削除されます。Amazonから一部の情報を掻き取ろうとしています。次のページリンクを実装する際に、多くのデータが欠けている

これにはどのような理由が考えられますか?私はロボットチェックに遭遇したと思っていた。ただし、最初のページでのみ動作します。

+0

アマゾンがipから多くのリクエストを見てログインするようになると、それはおそらく起きていることでしょう。あなたのスクラップ出力は何を表していますか? –

+0

私はあなたのスパイダーがうまくいくはずだと思います。この場合、 'don_filter = True'は必要ではありませんが、あなたの"次のページ "リクエストのコールバックについて言及していないので@ domoarrigatoの答えは有効です。 – eLRuLL

+0

@Rafael Almeida彼らは実際にログインするように強制しません。彼らはあなたが確認コードを入力させるロボットチェックを持っています。私は、ランダムなプロキシを使用して、かなり大きなデータ量をクロールしながら問題を解決しようとしています。 – Patrick

答えて

0

私はあなたがする必要があると思う:

yield scrapy.Request(NextBottom_a, callback=self.parse, dont_filter=True) 

は、次のページを取得する - scrapyは、すでに他の場所でこのURLを呼び、あなたが実際にそれを必要としない決定しないことを確実にすることdont_filterを使用しています。

+0

「匿名のダウン投票者」とは、この回答がどのように改善されると思われるのか、それがその質問に答えると感じない理由を説明することがより生産的になります。 – domoarrigato

+0

答えは正当です。今私は4ページをこすった。 96項目の出力があり(ページあたり24項目)、これは掻き取りが完了したことを意味します。 – Patrick

+0

ありがとう!私はあなたにアップアップすることができますが、私はまだ十分な評判を持っていません – Patrick

関連する問題