2013-03-04 2 views
1

나는 scrapy의 CrawlSpider 스파이더 클래스를 사용하여 start_urls 목록을 반복하고 각 사이트의 내부 페이지를 크롤링하여 전자 메일 주소를 가져옵니다. 일치하는 전자 메일 목록과 함께 각 start_url에 대해 단일 (고유 한) 항목으로 파일을 내보내 려합니다. 이를 위해 make_requests_from_urlparse 메서드를 재정의해야하므로 응답의 메타 사전 (코드 참조)의 각 start_url 항목을 내부 페이지에 전달할 수 있습니다. 이 코드를 실행의 출력은 다음과 같습니다 그러나CrawlSpider에서 고유 항목 내보내기

www.a.com,['[email protected]'] 
www.a.com,['[email protected]','[email protected]'] 
www.a.com,['[email protected]','[email protected]','[email protected]'] 

, 난 단지 내보내기 파일은 위의 출력

(www.a.com,['[email protected],[email protected], [email protected]'])

에서 마지막 항목을 포함시킬는 것이 가능할까요?

코드 :

class MySpider(CrawlSpider): 

    start_urls = [... urls list ...] 

    def parse(self, response): 
     for request_or_item in CrawlSpider.parse(self, response): 
      if isinstance(request_or_item, Request): 
       request_or_item.meta.update(dict(url_item=response.meta['url_item'])) 
      yield request_or_item 

    def make_requests_from_url(self, url): 
     # Create a unique item for each url. Append email to this item from internal pages 
     url_item = MyItem() 
     url_item["url"] = url 
     url_item["emais"] = [] 

     return Request(url, dont_filter=True, meta = {'url_item': url_item}) 

    def parse_page(self, response): 
     url_item = response.meta["url_item"] 
     url_item["emails"].append(** some regex of emails from the response object **) 
     return url_item 
+0

거미가 닫힐 때 메시지를 덤프하는 것은 어떨까요? –

답변

0

당신은 항목을 처리하는 pipeline를 사용할 수 있습니다.

Scrapy 설명서의 Duplicates filter을 참조하십시오.