2017-02-14 47 views
0

試圖廢下一頁與Scrapy,Python的3.5使用urlib Python庫使用的urllib與Scrapy爲分頁

import datetime 
    import urllib.request 
    import urllib.error 
    import urllib.parse 
    import socket 
    import scrapy 
    from scrapy.loader.processors import MapCompose, Join 
    from scrapy.loader import ItemLoader 
    from properties.items import PropertiesItem 


    class BasicSpider(scrapy.Spider): 
     name = "manual" 
     allowed_domains = ["web"] 

     # Start on the first index page 
     start_urls = (
      'http://scrapybook.s3.amazonaws.com/properties/index_00000.html', 
     ) 

     def parse(self, response): 
      # Get the next index URLs and yield Requests 
      next_selector = response.xpath('//*[contains(@class,"next")]//@href') 
      for url in next_selector.extract(): 
       yield Request(urllib.parse.urljoin(response.url, url)) 

      # Get item URLs and yield Requests 
      item_selector = response.xpath('//*[@itemprop="url"]/@href') 
      for url in item_selector.extract(): 
       yield Request(urllib.parse.urljoin(response.url, url), callback=self.parse_item) 


     def parse(self, response): 
      l = ItemLoader(item=PropertiesItem(), response=response) 
      l.add_xpath('title', '//*[@itemprop="name"]/text()') 
      return l.load_item() 

一切都工作得很好,沒有錯誤,但Scrapy只讀取第一頁,但根據代碼它應該獲取所有接下來的頁面

這裏是輸出

[{ 
    "title": [ 
     "bermondsey ec kennington drive acton seven rm", 
    ....... 
     "mary conversion borders eastham with gas" 
    }] 

// Only Page 0 Titles :(

什麼不對的請求或urllib的調用語法?

PS:XPath時,Scrapy殼牌 'URL'

回答

1

讓我們錯用途Python包

  1. 開始使用請求沒有將其導入,通過對其進行修復。

    從scrapy導入請求

  2. 錯誤使用從urllib的urljoin類,從的urllib.parse進口首次導入它

    urljoin

    目前使用urljoin直接不調用urllib.parse.urljoin

    改變它

    收率請求(urllib.parse.urljoin(response.url,URL)) 收率請求(urllib.parse.urljoin(response.url,URL),回調= self.parse_item)

  3. 不調用parse_item

    調用它

    高清解析(個體經營,響應):#replace解析到parse_item

PS:如果此代碼,是學習Scrapy書那麼這裏是python3版本

https://github.com/Rahulsharma0810/Scrapy-Pagination-URLJOIN-Example

+0

哇完全GIT的例子!男人,你很棒,謝謝你。 –

0

你似乎有兩個parse功能。所以你只有第二個,因爲它覆蓋了第一個。

只需將第二個重命名爲parse_item,就像您代碼的其餘部分似乎表明的那樣。