2017-03-29 10 views
1

の19を引っ張る:すべての行のtd[2]https://coinmarketcap.com/currencies/views/all/Scrapyクローラは、私はこのページをこすりしようとしている680+のURL

はリンクです。私はそのtdの各リンクに行き、リンクが表すページをスクレープするようにスクラピーを尋ねようとしています。以下は私のコードです:

注:別の人が、私はテーブルを越えてもカントー600以上のリンク/ページをここまで

class ToScrapeSpiderXPath(CrawlSpider): 
    name = 'coinmarketcap' 
    start_urls = [ 
     'https://coinmarketcap.com/currencies/views/all/' 
    ] 

    rules = (
     Rule(LinkExtractor(restrict_xpaths=('//td[2]/a',)), callback="parse", follow=True), 
    ) 

    def parse(self, response): 
     BTC = BTCItem() 
     BTC['source'] = str(response.request.url).split("/")[2] 
     BTC['asset'] = str(response.request.url).split("/")[4], 
     BTC['asset_price'] = response.xpath('//*[@id="quote_price"]/text()').extract(), 
     BTC['asset_price_change'] = response.xpath(
      '/html/body/div[2]/div/div[1]/div[3]/div[2]/span[2]/text()').extract(), 
     BTC['BTC_price'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/small[1]/text()').extract(), 
     BTC['Prct_change'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/small[2]/text()').extract() 
     yield (BTC) 

を得るうえで最高だった私はscrapy crawl coinmarketcapを実行したとき、私は唯一の19を得ます記録。これは、600以上のこのリストから19ページだけを意味します。私は擦り傷を止める問題を見るのに失敗している。どんな助けでも大歓迎です。

おかげ

+1

あなたは、特に統計は、どのようにスケジュールされた要求の数を見ることができます終わり、でのdict、ログをクロール共有してください。多くのものがおそらくフィルタリングされています。 –

+1

コールバックを 'parse()'から 'parse_item()'に変更して(ルール内のコールバック名を調整すると)どうでしょうか? – alecxe

答えて

1

あなたのクモは、あまりにも深く行く:そのルールでそれを見つけると、単一のコインのページにもリンクをたどります。おおよそDEPTH_LIMIT = 1を追加して問題を解決できますが、より洗練されたソリューションを見つけることができます。 ここでは私のために動作するコードは、(他の微調整もあります):

class ToScrapeSpiderXPath(CrawlSpider): 
    name = 'coinmarketcap' 
    start_urls = [ 
     'https://coinmarketcap.com/currencies/views/all/' 
    ] 
    custom_settings = { 
     'DEPTH_LIMIT': '1', 
    } 

    rules = (
     Rule(LinkExtractor(restrict_xpaths=('//td[2]',)),callback="parse_item", follow=True), 
    ) 

    def parse_item(self, response): 
     BTC = BTCItem() 
     BTC['source'] = str(response.request.url).split("/")[2] 
     BTC['asset'] = str(response.request.url).split("/")[4] 
     BTC['asset_price'] = response.xpath('//*[@id="quote_price"]/text()').extract() 
     BTC['asset_price_change'] = response.xpath(
      '/html/body/div[2]/div/div[1]/div[3]/div[2]/span[2]/text()').extract() 
     BTC['BTC_price'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/small[1]/text()').extract() 
     BTC['Prct_change'] = response.xpath('/html/body/div[2]/div/div[1]/div[3]/div[2]/small[2]/text()').extract() 
     yield (BTC) 
+0

あなたは最高です!!!!できます!。 Depth_limitの他に何が変わったのか教えてください。 – arcee123

+0

alecxeが提案したように、コールバックをparse()からparse_item()に変更し、不要なコンマを削除しました。 – Tomark

関連する問題