2016-08-21 17 views
0

私はすべてのページをクロールしたいが、それは2ページ目にクロールして停止します。 if next_page:ループ内では、URLが2ページ目に変更されてからそこにくっつくようです。私は、http応答がどのように動作するのか誤解していると思います。なぜなら、開始ページの次のページのリンクしか取得できないようだからです。Scrapyは1ページだけをクロールします

import scrapy 

from tutorial.items import TriniCarsItem 

class TCS(scrapy.Spider): 
    name = "TCS" 
    allowed_domains = ["TCS.com"] 
    start_urls = [ 
     "http://www.TCS.com/database/featuredcarsList.php"] 

    def parse(self, response): 
     for href in response.css("table > tr > td > a::attr('href')"): 
      url = response.urljoin(href.extract()) 
      yield(scrapy.Request(url, callback=self.parse_dir_contents)) 
     next_page = response.css("body > table > tr > td > font > b > a::attr('href')") 
     if next_page: 
      url = response.urljoin(next_page[0].extract()) 
      print("THIS IS THE URL =----------------------------- " + url) 
      yield(scrapy.Request(url, self.parse)) 

    def parse_dir_contents(self, response): 
     for sel in response.xpath('//table[@width="543"]/tr/td/table/tr/td[2]/table'): 
      item = TCSItem() 
      item['id'] = sel.xpath('tr[1]/td[1]//text()').extract() 
      item['make'] = sel.xpath('tr[3]/td[2]//text()').extract() 
      item['model'] = sel.xpath('tr[4]/td[2]//text()').extract() 
      item['year'] = sel.xpath('tr[5]/td[2]//text()').extract() 
      item['colour'] = sel.xpath('tr[6]/td[2]//text()').extract() 
      item['engine_size'] = sel.xpath('tr[7]/td[2]//text()').extract() 
      item['mileage'] = sel.xpath('tr[8]/td[2]//text()').extract() 
      item['transmission'] = sel.xpath('tr[9]/td[2]//text()').extract() 
      item['features'] = sel.xpath('tr[11]/td[2]//text()').extract() 
      item['additional_info'] = sel.xpath('tr[12]/td[2]//text()').extract() 
      item['contact_name'] = sel.xpath('tr[14]/td[2]//text()').extract() 
      item['contact_phone'] = sel.xpath('tr[15]/td[2]//text()').extract() 
      item['contact_email'] = sel.xpath('tr[16]/td[2]//text()').extract() 
      item['asking_price'] = sel.xpath('tr[17]/td[2]//text()').extract() 
      item['date_added'] = sel.xpath('tr[19]/td[2]//text()').extract() 
      item['page_views'] = sel.xpath('tr[20]/td[2]//text()').extract() 
      #print(make, model, year, colour, engine_size, mileage, transmission, features, 
      #additional_info, contact_name, contact_phone, contact_email, asking_price, date_added, 
      #page_views) 
      yield(item) 
+0

あなたはあなたが期待しているURLを返しますか? –

+0

2番目のページだけですが、3番目のページなどを取得しません – Jimbo

+0

同じURLを何度も何度も印刷するか、一度だけ印刷しますか? –

答えて

1

第2ページでは、第1リンク(選択したもの)が前のページを指しています。

if next_page: 
     for i in next_page 
      url = response.urljoin(i.extract()) 
      print("THIS IS THE URL =----------------------------- " + url) 
      yield(scrapy.Request(url, self.parse)) 

P.S.:ちょうど任意の重複を相殺ために、任意のリンクを送信し、デデュプリケータをしましょうあなたのケースでは、かなり簡単で、より大規模なパラレルも考慮してください:

start_urls = [ 
    "http://www.trinicarsforsale.com/database/featuredcarsList.php?page=%d" % i for i in xrange(1, 460)] 

def parse(self, response): 
    return self.parse_dir_contents(response): 
+0

ありがとうございましたneverlastn、私はあなたの最初の提案を試みたが動作しませんでしたが、私は範囲で私のURLを生成する方が簡単だろうということに同意します。ありがとう! – Jimbo

+0

URLの印刷を行い、正しい結果が得られない理由を確認できますか? 2ページ目で試してみましたが、ページ= 3のURLをくれました – neverlastn

関連する問題