2016-08-18 1 views
0

저는 최근에 웹 사이트 스파이더에서 작업 중이었고 사이트가 페이지 매김을 멈추지 않도록 코딩했기 때문에 무한한 페이지 수를 요청하는 것으로 나타났습니다. 그들은 단지 내용의 몇 페이지가 있었을 때치료법 - 페이지 매김 블랙홀을 피하는 방법?

그래서, 여전히 다음 링크 및 URL이 ...? 페이지 = 400, ...? 페이지 = (401) 등

컨텐츠하셨습니까를 생성하는 것 'URL 만 변경하면됩니다. 콘텐츠가 변경되지 않으면 Scagination이 페이지 매김을 멈추게 할 수있는 방법이 있습니까? 또는 내가 관습을 코딩 할 수있는 무엇인가.

+0

당신은 페이지의 제목이나 결과를 나타내는 헤드 라인 즉, 변경 뭔가를 계속 추적하고 더 이상하지 않는 경우 중지해야합니다 (당신이 XPath를 통해 텍스트를 분석 할 수 있습니다 : 예를 들어

쿼리 분명히). – Jan

+0

하지만 링크를 긁어서 LinkExtractor가 사용하지 못하도록하는 URL에 어떻게 연결합니까? 이것을 CrawlSpider에 통합하는 것은 저를 넘어선 것입니다. –

답변

1

내용이 변경되지 않으면 현재 페이지의 내용을 이전 페이지와 비교할 수 있고 동일한 경우 크롤링을 중단하십시오.

def parse(self, response): 
    product_urls = response.xpath("//a/@href").extract() 
    # check last page 
    if response.meta.get('prev_urls') == product_urls: 
     logging.info('reached the last page at: {}'.format(response.url)) 
     return # reached the last page 
    # crawl products 
    for url in product_urls: 
     yield Request(url, self.parse_product) 
    # create next page url 
    next_page = response.meta.get('page', 0) + 1 
    next_url = re.sub('page=\d+', 'page={}'.format(next_page), response.url) 
    # now for the next page carry some data in meta 
    yield Request(next_url, 
        meta={'prev_urls': product_urls, 
         'page': next_page} 
+0

'yields'와'return'을 섞어 쓰지는 않겠지 만, 제품 링크를 제한하는 일반적인 생각은 흥미 롭습니다. 또한,'Request' 객체를 생성하기 전에'response.meta.get ('prev_urls') == product_urls'를 테스트 할 수도 있습니다. –

+1

@paultrmbrth 감사합니다. 처음에는 수표를 옮겼습니다. return과 yield를 섞어도'return'이 아무 것도 반환하지 않는 한 python2에서 제대로 동작하지만, 여기서는'break'처럼 동작합니다. – Granitosaurus

+0

아, 맞아. 나는 결코 알지 못했습니다. Thx –