2016-01-16 2 views
0

Я пытаюсь переопределить метод Scicing start_requests, но безуспешно. Я уже успел перебирать страницы. Проблема в том, что теперь я должен итерации сначала через города, а не страницы.Переопределение start_requests - Scrapy не синхронно

Мой код выглядит следующим образом:

URL = "https://example.com/%s/?page=%d" 
starting_number = 1 
number_of_pages = 3 
cities = [] # there are array of cities 
selected_city = "..." 

def start_requests(self): 
    for city in cities: 
     selected_city = city 

     print "####################" 
     print "##### CITY: " + selected_city + " #####" 

     for i in range(self.page_number, number_of_pages, +1): 
      print "##### page: " + str(i) + " #####" 
      yield scrapy.Request(url=(URL % (selected_city, i)), callback = self.parse) 

     print "####################" 

В консоли я вижу, что, когда гусеничный начинает работать он печатает все города и страницы, и чем только начинают запросы. Поэтому в результате мой искатель анализирует только первый город. Они работают асинхронно, а мне нужно синхронно.

Каков правильный способ повторения в моем случае?

Спасибо за помощь!

+0

сделал вы пытаетесь заменить '' yield' с return'? –

+0

Нет. Моя проблема заключалась в том, что я использовал неправильную глобальную переменную 'selected_city' в остальном коде. –

ответ

0

Моя проблема заключалась в том, что я использовал неправильную глобальную переменную selected_city в остальном коде.

Я думал, что на каждой итерации он остановится, чтобы сделать метод parse, а затем продолжить следующую итерацию. Поэтому я установил параметр item['city'] = selected_city в методе parse.

Теперь я просто передаю параметр city через Request. Код Пример:

def start_requests(self): 
    requests = [] 

    for city in cities: 
     for i in range(self.page_number, number_of_pages, +1): 
      requests.append(scrapy.Request(url=(URL % (city, i)), callback = self.parse, meta = {'city': city})) 

    return requests 

И parse метод при получении, выполнив: item['city'] = response.request.meta['city']