2012-10-18 1 views
3

웹 사이트의 구조를 정의하는 링크가 있습니다. 이러한 링크에서 이미지를 다운로드하는 동안 다운로드 한 이미지를 웹 사이트 구조와 비슷한 폴더 구조에 넣고 이름을 변경하지 않고 (Scrapy image download how to use custom filename)Scrapy : 이미지를 다운로드하는 URL을 기반으로 다운로드 한 이미지 중 폴더 구조를 만듭니다.

내 코드는 다음과 같습니다.

class MyImagesPipeline(ImagesPipeline): 
    """Custom image pipeline to rename images as they are being downloaded""" 
    page_url=None 
    def image_key(self, url): 
     page_url=self.page_url 
     image_guid = url.split('/')[-1] 
     return '%s/%s/%s' % (page_url,image_guid.split('_')[0],image_guid) 

    def get_media_requests(self, item, info): 
     #http://store.abc.com/b/n/s/m 
     os.system('mkdir '+item['sku'][0].encode('ascii','ignore')) 
     self.page_url = urlparse(item['start_url']).path #I store the parent page's url in start_url Field 
     for image_url in item['image_urls']: 
      yield Request(image_url) 

그것은 필요한 폴더 구조를 만들지 만 deapth의 폴더에 들어가면 폴더에 파일이 잘못 배치 된 것으로 나타납니다.

"get_media_requests"및 "image_key"함수가 비동기 적으로 실행될 수 있으므로 "page_url"의 값이 "image_key"함수에서 사용되기 전에 변경되므로이 문제가 발생하는 것으로 의심됩니다.

+0

거미의 경로를 계산하고 경로를 항목 속성으로 계산하는 것이 더 정확합니까? – dm03514

+0

@ dm03514 항목 경로로 필요한 경로가 있지만 "image_key"함수의 "item"개체에 액세스 할 수 없습니다. –

+0

@GauravToshniwal 의심 스럽습니다. 폴더가 생성되고 있음을 보여주는 코드가 보이지 않습니다. 내부 구조가 어떻게 작동하는지 알 수 있습니까? – igaurav

답변

1

비동기 항목 처리가 파이프 라인 내에서 self을 통해 클래스 변수를 사용하지 못하게하는 것이 옳습니다. 각 요청에 경로를 저장하고 몇 가지 방법 (테스트 안 함)을 재정의해야합니다.

def image_key(self, url, page_url): 
    image_guid = url.split('/')[-1] 
    return '%s/%s/%s' % (page_url, image_guid.split('_')[0], image_guid) 

def get_media_requests(self, item, info): 
    for image_url in item['image_urls']: 
     yield Request(image_url, meta=dict(page_url=urlparse(item['start_url']).path)) 

def get_images(self, response, request, info): 
    key = self.image_key(request.url, request.meta.get('page_url')) 
    ... 

def media_to_download(self, request, info): 
    ... 
    key = self.image_key(request.url, request.meta.get('page_url')) 
    ... 

def media_downloaded(self, response, request, info): 
    ... 
    try: 
     key = self.image_key(request.url, request.meta.get('page_url')) 
    ... 
+0

해줘서 고마워. 나는 그것을 지금까지 그렇게 잘 테스트했다! 동일한 항목 또는 동일한 요청 내의 모든 이미지는 동일한 경로 (폴더)에 저장됩니다. – EeE

+0

@ steven-almeroth, 코드로 표시된 생성 폴더는 어디에 있습니까? 조금 설명 할 수 있니? – igaurav

+0

'image_key()'는 폴더 이름을 반환합니다. 원하는 이름이 될 수 있습니다. –

관련 문제