2015-11-10 3 views
2

Я пытаюсь извлечь информацию о квартирах/номерах с немецкого сайта под названием WG-Gesucht. Я вроде понял, что их ссылки следуют логике:Scrapy сканирует ту же страницу снова и снова для разных URL-адресов на немецком сайте

http:// www.wg-gesucht.de/wohnungen-in-Berlin.8.2.0.**X**.html` 

где X=0, 1, 2, ...

Когда я вставить ссылки в браузере, они работают отлично. Однако мой оптимизм был разрушен, когда я попытался просканировать эти ссылки. В конце я получаю только записи, соответствующие X = 0 в моей базе данных.

Вот мой паук:

from scrapy.http.request import Request 
from scrapy.spider import Spider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.contrib.loader import XPathItemLoader 
from scrapy.contrib.loader.processor import Join, MapCompose 

from scraper_app.items import WGGesuchtEntry 




class WGGesuchtSpider(Spider): 
    """Spider for wg-gesucht.de, Berlin""" 
    name = "wggesucht" 
    allowed_domains = ["wg-gesucht.de"] 
    start_urls = ["http://www.wg-gesucht.de/wohnungen-in-Berlin.8.2.0.0.html"] 
    # start_urls = ["http://www.wg-gesucht.de/wohnungen-in-Berlin.8.2.0.%s.html"%x for x in range(0,1)] 


    entries_list_xpath = '//tr[contains(@id,"ad--")]' 
    item_fields = { 
     # 'title': './/span[@itemscope]/meta[@itemprop="name"]/@content', 
     'rooms': './/td[2]/a/span/text()', 
     'entry_date': './/td[3]/a/span/text()', 
     'price': './/td[4]/a/span/b/text()', 
     'size': './/td[5]/a/span/text()', 
     'district': './/td[6]/a/span/text()', 
     'start_date': './/td[7]/a/span/text()', 
     'end_date': './/td[8]/a/span/text()', 
     'link': './/@adid' 
    } 

    def start_requests(self): 
     for i in xrange(1, 10): 
      url = 'http://www.wg-gesucht.de/wohnungen-in-Berlin.8.2.0.' + str(i) + '.html' 
      yield Request(url=url, callback=self.parse_items) 


    def parse_items(self, response): 
     """ 
     Default callback used by Scrapy to process downloaded responses 

     # Testing contracts: 
     # @url http://www.livingsocial.com/cities/15-san-francisco 
     # @returns items 1 
     # @scrapes title link 

     """ 
     selector = HtmlXPathSelector(response) 

     # iterate over deals 
     for entry in selector.xpath(self.entries_list_xpath): 
      loader = XPathItemLoader(WGGesuchtEntry(), selector=entry) 

      # define processors 
      loader.default_input_processor = MapCompose(unicode.strip) 
      loader.default_output_processor = Join() 

      # iterate over fields and add xpaths to the loader 
      for field, xpath in self.item_fields.iteritems(): 
       loader.add_xpath(field, xpath) 
      yield loader.load_item()   

Должен ли я, возможно использовать CrawlSpider вместо Spider?

Любые предложения в основном приветствуются, спасибо!

+0

, как вы знаете, что вы только получать предметы из X = 0? по названию? 'Rooms'? журналы показывают, что паук не проходит через другие URL-адреса? – eLRuLL

+0

, посмотрев в поле «ссылка» в базе данных – Dima

ответ

2

выглядит как проблемы печенья, вы можете проверить, что, открыв новый браузер и пытается непосредственно 6th page, например, вы собираетесь получить ответ на первой страницы.

Scrapy пытается использовать кук для последующих запросов, поэтому один из способов решения этого было бы не перебор запросов на страницу, но делая один за другим, как:

import re 

start_urls = [http://example.com/0.html] 

def parse(self, response): 
    cur_index = response.meta.get('cur_index', 1) 
    ... 
    new_url = # use the response.url to change to the following url (+1 to the index) 
    if cur_index < 10: 
     yield Request(new_url, callback=self.parse, meta={'cur_index': cur_index+1}) 
+0

Спасибо! Я не могу выдвигать свою кандидатуру из-за отсутствия репутации, но она работала блестяще. Просто из любопытства: как вы видели, что это проблема с кукисами? – Dima

+0

просто объяснил, что в первом абзаце ответа. Нет правильной процедуры, вам просто нужно продолжать попытки. – eLRuLL

+0

@eLRuLL, может быть, это тривиальный вопрос. Почему он открывает первую страницу при достижении 6-го? Я имею в виду, что сохраняет файл cookie, чтобы это произошло? – Mellkor

Смежные вопросы