2016-07-04 4 views
2

응답을 구문 분석하는 데 하나 이상의 방법이있는 Scrapy 스파이더의 계약서를 작성하는 가장 좋은 방법은 무엇입니까? 이걸 answer으로 보았지만 나에게 분명히 들리지 않았습니다.여러 구문 분석 방법을 사용하는 약 계약

현재 예제 : 페이지의 정보를 추출하는 parse_product이라는 메서드가 있지만 다른 페이지에서 같은 제품에 대해 추출해야하는 데이터가 더 많습니다. 따라서이 마지막에 새로운 요청이 yield입니다. 메서드를 호출하여 새 요청을 만들고 새 콜백이 해당 필드를 추출하고 항목을 반환하도록합니다.

두 번째 방법에 대한 계약서를 작성하면 메타 속성 (대부분의 필드가있는 항목 포함)이 없기 때문에 문제가 발생합니다. 첫 번째 메소드에 대한 계약서를 작성하면 항목 대신 새 요청을 리턴하기 때문에 필드를 리턴하는지 확인할 수 없습니다. 예에서

def parse_product(self, response): 
    il = ItemLoader(item=ProductItem(), response=response) 
    # populate the item in here 

    # yield the new request sending the ItemLoader to another callback 
    yield scrapy.Request(new_url, callback=self.parse_images, meta={'item': il}) 

def parse_images(self, response): 
    """ 
    @url http://foo.bar 
    @returns items 1 1 
    @scrapes field1 field2 field3 
    """ 
    il = response.request.meta['item'] 
    # extract the new fields and add them to the item in here 

    yield il.load_item() 

, 나는 두 번째 방법으로 계약을 넣어하지만 response.request.meta['item'], 또한, 필드 field1field2는 첫 번째 방법으로 채워진에 나에게 KeyError 예외를했다.

희망이 충분히 있습니다.

답변

3

솔직히 나는 스 커리 계약을 사용하지 않으며 그 중 하나를 사용하도록 권장하지 않습니다. 그들은 many issuessomeday may be removed from Scrapy입니다.

실제로, 나는 거미에 대한 단위 테스트를 사용하여 많은 행운을 얻지 못했습니다.

개발하는 동안 스파이더를 테스트하려면 캐시를 활성화 한 다음 거미줄을 올바르게 가져 오는 데 필요한만큼 거미를 다시 실행하십시오.

회귀 버그의 경우, 실시간으로 유효성 검사를 수행하는 항목 파이프 라인 (또는 거미 미들웨어)을 사용하는 것이 더 나았습니다 (어쨌든 초기 테스트에서 너무 많이 잡을 수 있음). 복구를위한 전략을 수립하는 것도 좋은 생각입니다.

건강한 코드베이스를 유지하기 위해 필자는 스파이더 자체에서 라이브러리와 유사한 코드를 끊임없이 테스트하여 테스트 할 수 있도록했습니다.

죄송합니다. 원하시는 답변이 아닌 경우 죄송합니다.

+1

정확하게 내가 찾던 답변이 아니었지만 실제 도움보다 더 많이 도움이되었습니다. 고맙습니다. –