2017-02-14 20 views
0

Попытка Scrap Следующая страница с Scrapy, Python 3.5, используя urlib библиотека ПитонаИспользование URLLIB с Scrapy для PAGINATION

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 Fetching только первой страницы, но в соответствии с кодом он должен получать все последующие страницы

Вот выход

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

// Only Page 0 Titles :(

ничего плохого запроса или URLLIB вызова Синтаксис?

PS: Xpath рабочий, Scrapy Shell 'URL'

ответ

1

Давайте начнем с Wrong использований пакетов Python

  1. Использование запроса без его импорта, это исправить путем.

    из SCRAPY импорта запрос

  2. Неправильное использование urljoin класса от URLLIB, первый импорт это

    из urllib.parse импорта urljoin

    теперь используют urljoin прямой без вызова urllib.parse.urljoin

    изменить его на

    выход Request (urllib.parse.urljoin (response.url, URL)) выход Запрос (urllib.parse.urljoin (response.url, URL), обратного вызова = self.parse_item)

  3. Не называя parse_item

    вызов его на

    защиту разобрать (я, ответ): #replace синтаксического анализа для parse_item

PS: Если этот код, от обучения Scrapy книги, то здесь полный пример мерзавец для Python3 Version

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

+0

Wow! Человек, ты Великий, Большое спасибо. –

0

Вы, кажется, есть две parse функции. Таким образом, у вас есть только второй, так как он переопределяет первый.

Просто переименуйте второй номер в parse_item, как и все остальное, что указывает ваш код.