Python 에서 Scrapy 파충류 사진 처리 상세 설명

사진 다운로드
사진 을 다운로드 하 는 방법 은 두 가지 가 있 습 니 다.하 나 는 Requests 모듈 을 통 해 get 을 보 내 다운 로드 를 요청 하 는 것 이 고 다른 하 나 는 Scrapy 를 사용 하 는 Images Pipeline 이미지 파이프 류 입 니 다.여 기 는 주로 후 자 를 말 합 니 다.
Scrapy 를 설치 할 때 이미지 처리 의존 패키지 Pillow 를 설치 하지 않 았 습 니 다.수 동 으로 설치 해 야 합 니 다.그렇지 않 으 면 파충 류 를 실행 하 는 중 오류 가 발생 했 습 니 다.
먼저 settings.py 에 그림 의 저장 경 로 를 설정 합 니 다.
IMAGES_STORE = 'D:/'
그림 처리 와 관련 된 옵션 은 다음 과 같 습 니 다.

#            ,         
IMAGES_MIN_HEIGHT = 110
IMAGES_MIN_WIDTH = 110

#        
IMAGES_THUMBS = {
 'small': (50, 50),
 'big': (270, 270),
}
이전에 추출 한 내용 이 있 었 던 TuchongPipeline 류 는 ImagePipeline 을 사용 하면 추출 한 내용 을 모두 합 칠 수 있 지만 이미지 파이프 의 역할 을 잘 설명 하기 위해 저 희 는 ImagePipeline 류 를 따로 만 들 고 pipelines.py 파일 에 추가 하 며 함수 get 를 다시 불 러 옵 니 다.media_requests:

class PhotoGalleryPipeline(object):
 ...

class PhotoPipeline(ImagesPipeline):
 def get_media_requests(self, item, info):
  for (id, url) in item['images'].items():
   yield scrapy.Request(url)
이전 글 에서 우 리 는 그림 의 URL 을 item['images']에 저 장 했 습 니 다.이것 은 사전 형식의 배열 입 니 다.예 를 들 어[{imgid: img_url},...],이 함수 에서 imgurl 을 추출 하여 scrapy.Request 요청 대상 으로 구축 하고 되 돌려 줍 니 다.모든 요청 은 그림 을 다운로드 하 는 동작 을 실행 합 니 다.
settings.py 에 PhotoPipeline 을 등록 하고 추출 내용 의 파이프 보다 우선 순 위 를 높 여 그림 다운로드 가 내용 처리 보다 우선 하도록 합 니 다.그림 다운로드 가 성공 하지 못 하면 DropItem 이상 을 터치 하면 이 Item 의 처 리 를 중단 하고 불완전한 데이터 가 다음 파이프 에 들 어 가 는 것 을 방지 하기 위해 서 입 니 다.

ITEM_PIPELINES = {
 'Toutiao.pipelines.PhotoGalleryPipeline': 300,
 'Toutiao.pipelines.PhotoPipeline': 200,
}
파충류 scrapy crawl photo 를 실행 합 니 다.오류 가 없 으 면 설 정 된 저장 디 렉 터 리 에 full 디 렉 터 리 가 나타 납 니 다.다운로드 한 그림 입 니 다.
파일 이름 처리
다운로드 한 파일 이름 은 그림 URL 로 sha1 인 코딩 을 통 해 얻 은 문자 입 니 다.0a79c461a 4062 ac383dc4fade7bc09f1384a 3910.jpg 와 유사 하여 file 을 다시 불 러 올 수 있 습 니 다.path 함수 에서 파일 이름 을 사용자 정의 합 니 다.예 를 들 어 원본 파일 이름 을 이렇게 유지 할 수 있 습 니 다.

...
 def file_path(self, request, response=None, info=None):
  file_name = request.url.split('/')[-1]
  return 'full/%s' % (file_name)
...
위 에서 이렇게 처리 하면 이름 이 바 뀐 파일 이 덮어 쓰 이 는 것 을 피하 기 어렵 지만,매개 변수 request 에 정보 가 너무 많 지 않 아 그림 을 분류 하기 어렵 기 때문에 다시 불 러 오 는 item 로 바 꿀 수 있 습 니 다.completed 함수,다운로드 완료 후 그림 분류 작업.
함수 itemcompleted 의 정의:

def item_completed(self, results, item, info)
매개 변수 에는 item 이 포함 되 어 있 습 니 다.저희 가 캡 처 한 모든 정보 가 있 습 니 다.매개 변수 results 는 그림 을 다운로드 한 결과 배열 입 니 다.다운로드 후의 경로 와 다운로드 성공 여 부 를 포함 합 니 다.내용 은 다음 과 같 습 니 다.

[(True,
 {'checksum': '2b00042f7481c7b056c4b410d28f33cf',
 'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
 'url': 'http://www.example.com/files/product1.pdf'}),
 (False,
 Failure(...))]
이 함 수 를 다시 불 러 오 면 다운로드 한 그림 을 분류 디 렉 터 리 로 옮 기 고 파일 경 로 를 item 에 연결 하여 내용 과 그림 을 전체 로 유지 합 니 다.

def item_completed(self, results, item, info):
 image_paths = {x['url'].split('/')[-1]: x['path'] for ok, x in results if ok}
 if not image_paths:
  #         Item      
  raise DropItem("Item contains no files")
 else:
  #         post_id        
  for (dest, src) in image_paths.items():
   dir = settings.IMAGES_STORE
   newdir = dir + os.path.dirname(src) + '/' + item['post_id'] + '/'
   if not os.path.exists(newdir):
    os.makedirs(newdir)
   os.rename(dir + src, newdir + dest)
 #          item  (image_paths     items.py    )
 item['image_paths'] = image_paths
 return item
다음은 원래 Tuchong Pipeline 류 에 데이터 베 이 스 를 기록 하 는 작업 에서 item[imagepaths']경로 정 보 를 로 컬 그림 링크 에 기록 합 니 다.
Images Pipeline 처리 그림 외 에 Files Pipeline 은 파일 을 처리 할 수 있 습 니 다.사용 방법 은 그림 과 유사 합 니 다.사실은 Images Pipeline 은 Files Pipeline 의 하위 클래스 입 니 다.그림 도 파일 의 하나 이기 때 문 입 니 다.

좋은 웹페이지 즐겨찾기