2013-07-12 1 views
0

나는 병이있는 사이트를 크롤링하고 있습니다. parse 메서드는 먼저 모든 범주 링크를 추출한 다음 콜백을 사용하여 요청을 parse_category으로 전달합니다.은 적절한 구문 분석기를 사용하여 리디렉션 된 응답을 처리합니다.

카테고리 중 하나에 제품 페이지가 리디렉션되는 문제가 있습니다. 그리고 내 parse_category이 페이지를 인식하지 못합니다.

리디렉션 된 카테고리 페이지를 제품 페이지 파서로 어떻게 구문 분석합니까?

다음은 예입니다.

  1. parse은 3 개의 카테고리 페이지를 찾습니다.
  2. http://example.com/products/apple
  • pare_category 호출 모든 페이지를
  • http://example.com/products/dell
    1. http://example.com/products/samsung. 각각은 제품 목록이있는 html 페이지를 반환합니다. 그러나 apple에는 단 하나의 제품이 있습니다 iMac 27". 따라서 http://example.com/products/apple/imac_27으로 리디렉션됩니다. 이것은 제품 페이지입니다. 범주 구문 분석은 구문 분석에 실패합니다.

    이 시나리오에서는 제품 구문 분석 방법 parse_product을 호출해야합니다. 어떻게해야합니까?

    parse_category 메서드에 로직을 추가하고 parse_product를 호출 할 수 있습니다. 나는 그것을 원하지 않는다. 나는 치료가 그것을 원할 것입니다. 하지만 예, URL 패턴이나 기타 필요한 정보를 제공 할 것입니다.

    다음은 코드입니다.

    class ExampleSpider(BaseSpider): 
        name = u'example.com' 
        allowed_domains = [u'www.example.com'] 
        start_urls = [u'http://www.example.com/category.aspx'] 
    
        def parse(self, response): 
         hxs = HtmlXPathSelector(response) 
    
         anchors = hxs.select('/xpath') 
         for anchor in anchors: 
          yield Request(urljoin(get_base_url(response), anchor), callback=self.parse_category) 
    
        def parse_category(self, response): 
         hxs = HtmlXPathSelector(response) 
    
         products = hxs.select(products_xpath).extract() 
         for url in products: 
          yield Request(url, callback=self.parse_product) 
    
    
        def parse_product(self, response): 
         # product parsing ... 
         pass 
    
  • +0

    @alecxe 코드가 필요 없다고 생각합니다. 나는 나의 문제를 아주 잘 묘사했다. 문제는 코드에 관한 것이 아닙니다. 아직도 나는 당신에게 나의 단순화 된 거미를 준다. –

    답변

    1

    당신은 process_response 방법을 구현하는 middleware을 작성하도록 선택할 수 있습니다. 응답이 카테고리가 아닌 제품 URL에 대한 것이면 제품 파서에 copy of the Request objectchange the callback function을 작성하십시오.

    결국 Request 오브젝트를 미들웨어에서 반환하십시오. 참고 : 은 DupeFilter가 요청을 필터링하지 않도록 Request에 대해 dont_filter에서 True까지 설정해야합니다.

    관련 문제