Scrapy определить перенаправление и остановить цикл - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь перебрать некоторые страницы.Различные страницы помечены или 10, или 20, или 30 и т. Д. Для веб-сайта.т.е.

/Restaurant_Review

- это первая страница

/Restaurant_Review-or10

- это вторая страница

/Restaurant_Review-or20

3-я страница и т. д.

Проблема в том, чтоЯ перенаправлен с этих сайтов на обычный URL (1-й), если -or- версия не существует.В настоящее время я перебираю диапазон в цикле for и динамически меняю значение -or-.

 def parse(self,response):
     l = range(100)
     reviewRange = l[10::10]

     for x in reviewRange:
          yield((url+"-or"+str(x)), callback=self.parse_page)

def parse_page(self,response):
    #do something
    #How can I from here tell the for loop to stop
    if(oldurl == response.url):
         return break
     #this doesnt work

Проблема в том, что мне нужно выполнить запрос, даже если страница не существует,и это не масштабируется.Я пытался сравнить URL-адреса, но все еще не понимал, как я могу вернуть из функции parse_page () что-то, что сообщит функции parse () об остановке.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это не ответ на реальный вопрос, а альтернативное решение, которое не требует обнаружения перенаправления.

В HTML вы уже можете найти все эти URL-адреса разбиения на страницы, используя:

response.css('.pageNum::attr(href)').getall()

Относительно вопроса @ Антона в комментарии о том, как я получил это:

Вы можете проверить это, открыв случайную страницу обзора ресторана с оболочкой Scrapy:

scrapy shell "https://www.tripadvisor.co.za/Restaurant_Review-g32655-d348825-Reviews-Brent_s_Delicatessen_Restaurant-Los_Angeles_California.html"

Внутри оболочки вы можете просмотреть полученный HTML в вашем браузере с помощью:

view(response)

Там вы увидите, что он включает в себя HTML (и этот конкретныйкласс) для нумерации ссылок.Настоящий веб-сайт использует Javascript для отображения следующей страницы, но он делает это путем извлечения full HTML для следующей страницы на основе URL-адреса.По сути, он просто заменяет всю страницу, при этом требуется совсем немного дополнительной обработки.Таким образом, это означает, что если вы откроете ссылку самостоятельно, вы также получите полный HTML-код.Следовательно, проблема Javascript здесь неактуальна.

0 голосов
/ 13 февраля 2019

Например, вы можете проверить, что находится в response.meta.get('redirect_urls').Если у вас что-то есть, повторите исходный URL с dont_filter.Или попробуйте поймать такие случаи с помощью RetryMiddleware .

...