항목 파이프 라인
항목 파이프 라인 호출은 스파이더 생성 항목 후에 발생합니다. 스파이더 응답을 파싱이 완료되면, 상품이 상품 파이프로 전달되어, 상품 파이프 조립체 정의 순차적으로 호출은 데이터 정제 및 저장 등의 처리의 시리즈를 완료한다.
항목 파이프 라인의 주요 목적은 다음과 같습니다 :
-
HTML 데이터를 청소합니다.
-
검증 데이터는 검사 필드를 크롤링, 크롤 링합니다.
-
무게 확인 및 폐기 중복.
-
데이터베이스에 크롤링 결과를 저장합니다.
파이프 라인 클래스
파이프 라인은 사용자 정의 할 수 있지만, 각 클래스는 다음과 같은 방법 덕트를 구현해야합니다 :
process_item (자기, 항목, 거미)
process_item () 메소드는이 방법 부품 처리 항목 파이프 기본 정의되어 호출 이루어져야한다. 예를 들어, 우리는 데이터베이스 작업에 대한 데이터 또는 쓰기 데이터를 처리 할 수 있습니다. 그것은 해야한다 유형 항목의 값을 반환하거나 DropItem 예외를 throw합니다.
매개 변수 :
-
item
는 Item 객체, 즉 상품 처리이다. -
spider
스파이더 스파이더를 생성, 즉 아이템 객체이다.
달성하기 위해 다른 방법이 파이프 라인처럼 또한 process_item는 () 구현해야합니다 :
1. open_spider (거미)
열 때 거미는 주로 등등 데이터베이스에 연결하고, 일부 초기화 작업을 수행하기 위해 호출됩니다. 즉, 매개 변수는 피사체가 거미를 열 수 있습니다
2. close_spider (거미)
닫을 때 거미는 주로 작업의 마감 데이터베이스 연결 자연 일부 마무리 손질을 할 호출됩니다. 스파이더 객체 거미 매개 변수는 폐쇄되어야한다
3. from_crawler (CLS, 크롤러)
@classmethod 로고 의존성 주입 방식으로 분류 방법. 인수는 개체를 통해 크롤러, 크롤러, 우리는 각각의 글로벌 구성 정보와 같은 모든 핵심 구성 요소 Scrapy을 얻을하고 파이프 라인의 인스턴스를 만들 수 있습니다. CLS 매개 변수는 클래스, 그리고 마지막으로 클래스 인스턴스로 돌아갑니다.
항목 파이프 라인 구성 요소를 활성화
항목 파이프 라인 어셈블리를 활성화하려면, 클래스 ITEM_PIPELINES 배열, 다음의 예에 추가해야합니다
ITEM_PIPELINES = { ' myproject.pipelines.Pipelineclass1 ' 300 , ' myproject.pipelines.Pipelineclass2 ' : 800 , }
높은 값 범주에 낮은 값에서 프로젝트 : 적분 값에 할당 된 클래스를 설정하면 그들이 실행 된 순서를 결정합니다. 범위 0-1000에서 이러한 숫자의 관습 정의.
예
1. 쓰기 파일
수입 JSON의 클래스 JsonWriterPipeline (객체) : 데프 open_spider (자기, 거미) : self.file = 개방 ( ' items.jl ' , ' w ' ) 데프 close_spider (자기, 거미) : self.file.close () DEF process_item ( 자기, 항목, 거미) : 라인 = json.dumps (DICT (항목)) + " \ n " self.file.write (선) 반환 항목
2. 예금 mysql을
가져 오기 pymysql의 클래스 MySQLPipeline (객체) : DEF __init__ (자동) : #은 데이터베이스에 연결 self.db = pymysql.connect ( 호스트 = ' localhost를 ' , #의 데이터베이스 IP 주소 포트 = 3306, #의 데이터베이스 인터페이스 DB = ' DBNAME ' , #의 데이터베이스 이름 사용자 = ' 루트 ' , # 데이터베이스 사용자 이름 passwd를 = ' 루트 ' , #의 데이터베이스 암호 = 캐릭터 세트 ' UTF8 ' , #의 인코딩 ) # 커서 조작 얻기 위해 커서 () 메소드를 사용하여 self.cursor = self.db.cursor을 () DEF 자체가, 아이템, 스파이더) (process_item : # 쓰기 삽입 SQL 문이 데이터베이스입니다 표가 SQL을 = " 삽입 직원 (FIRST_NAME 상기 LAST_NAME) 값 ( '%의 S', '%의 S') INTO " % (아이템 [ ' F_Name ' ] 항목 [ ' l_name ' ]) 은 try : #가 실행 SQL 문 self.cursor.execute (SQL) #제출 SQL 문 self.db.commit () 제외 : # 오류가 발생하는 롤백 self.db.rollback () #의 반환 항목 반환 항목 DEF의 close_spider (자체, 스파이더) : self.db.close를 ()
3. 예금 MongoDB를
가져 오기 pymongo의 클래스 MongodbPipeline (객체) : DEF __init__ (자동) : # 데이터베이스 연결 MongoDB를 설정 self.client = pymongo.MongoClient ( ' MongoDB를을 : // 로컬 호스트 : 27017 / ' ) # 데이터베이스에 연결하는 데 필요한 self.db 클라이언트 =를 [ ' Scrapy ' ] #에 접속 세트 (테이블) self.coll DB = ' COLLECTION_NAME ' ] DEF의 process_item (자기, 항목 스파이더) PostItem = 딕셔너리 (항목) # 1 사전 항목으로 변환 할 self.coll.insert (postItem) # 데이터베이스에 레코드를 삽입하려면 반환 항목 DEF의 close_spider (자체, 스파이더) : self.client.close ()
4.from_crawler () 실시 예
클래스 MongoPipeline (객체) : COLLECTION_NAME = ' XXX ' 데프 __init__ (자기, mongo_uri, mongo_db) : self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod 데프 from_crawler (CLS, 크롤러) : 리턴 CLS ( #의 从크롤러 설정中获取配置 mongo_uri crawler.settings.get = ( ' MONGO_URI ' ) mongo_db = crawler.settings.get ( ' MONGO_DATABASE ' ) ) 데프 open_spider (자기 스파이더) self.client = pymongo.MongoClient (self.mongo_uri) self.db = self.client [self.mongo_db] DEF close_spider (자기 스파이더) self.client.close () DEF process_item ( 자기, 항목 거미) postItem = 딕셔너리 (항목) self.db [self.collection_name]를 취소하려면 (postItem) 반환 항목