2017-01-17 43 views
1

你好,這是我第一次後,Scrapy分頁失敗

所以我試圖讓網絡蜘蛛會遵循invia.cz鏈接,並從酒店複製所有的標題。

import scrapy 


y=0 
class invia(scrapy.Spider): 
    name = 'Kreta' 
    start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1'] 

    def parse(self, response): 

     for x in range (1, 9): 
      yield { 
      'titles':response.css("#main > div > div > div > div.col.col-content > div.product-list > div > ul > li:nth-child(%d)>div.head>h2>a>span.name::text"%(x)).extract() , 
      } 

     if (response.css('#main > div > div > div > div.col.col-content > 
          div.product-list > div > p > 
          a.next').extract_first()): 
     y=y+1 
     go = ["https://dovolena.invia.cz/d_start_from=13.01.2017&sort=nl_sell&page=%d" % y] 
     print go 
     yield scrapy.Request(
       response.urljoin(go), 
       callback=self.parse 
     ) 

在這個網站的網頁加載與AJAX,所以我手動更改URL的值,由一個僅如果下一步按鈕出現在頁面遞增。

在scrapy shell中,當我測試按鈕是否出現,條件一切都很好時,但是當我啓動蜘蛛時,它只抓取第一頁。

這是我的第一個蜘蛛,所以在此先感謝。

另外,埃勒爾日誌Error Log1Error Log

+2

請分享日誌,什麼是你的錯誤? – eLRuLL

+0

@eLRuLL我發佈了錯誤日誌,如果你想檢查他們 – Kostas

+0

@Granitosaurus你檢查了代碼? – Kostas

回答

0

你的「全局」 y變量的使用不僅奇特,但不會工作,要麼

您使用y計算解析了多少次調用。理想情況下,你不希望的功能範圍之外的任何訪問,所以你可以使用request.meta屬性實現同樣的事情:

def parse(self, response): 
    y = response.meta.get('index', 1) # default is page 1 
    y += 1 
    # ... 
    #next page 
    url = 'http://example.com/?p={}'.format(y) 
    yield Request(url, self.parse, meta={'index':y}) 

關於你的分頁問題,​​你的下一個頁面的url CSS選擇器是自<a>不正確您選擇的節點沒有附加絕對href,這個問題也會使您的y問題變得過時。爲了解決這個嘗試:

def parse(self, response): 
    next_page = response.css("a.next::attr(data-page)").extract_first() 
    # replace "page=1" part of the url with next number 
    url = re.sub('page=\d+', 'page=' + next_page, response.url) 
    yield Request(url, self.parse, meta={'index':y}) 

編輯:這裏是整個工作蜘蛛:

import scrapy 
import re 


class InviaSpider(scrapy.Spider): 
    name = 'invia' 
    start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1'] 

    def parse(self, response): 
     names = response.css('span.name::text').extract() 
     for name in names: 
      yield {'name': name} 

     # next page 
     next_page = response.css("a.next::attr(data-page)").extract_first() 
     url = re.sub('page=\d+', 'page=' + next_page, response.url) 
     yield scrapy.Request(url, self.parse) 
+0

我又遇到了同樣的問題,只能進入第一頁。 – Kostas

+0

@Kostas你能更新你的代碼嗎? – Granitosaurus

+0

這是更新後的代碼http://imgur.com/a/fVBzJ – Kostas