scrapy로 기어오르기를 설치하여 그림을 수집해 보십시오

14327 단어 ScrapyReKognitionAWS
AWS Rekognition을 사용할 때도 프리스타일 렌즈를 사용할 수 없다고 생각해서 스크랩을 썼어요.어쨌든 이번에는 역과 그림을 수집하는 곳으로 가겠습니다.절대 수상한 물건을 이용하지 마세요.
이번에 시작된 페이지부터 끊임없이 링크를 탐색하여 도메인 이름의 폴더에 따라 전진할 때의 페이지 이미지를 저장합니다.이번에 나는 모든 폴더의 그림을 AWS Rekognition에 던져서 그림에서 그 영역이 어떤 영역인지 판단하고 싶다.

전제 조건

  • scrapy 1.5.0
  • python3
  • scrapy
  • 설치

    사이트 축소판 그림

  • scrapy를 사용하여 데이터를 수집하여 몬고 DB의 - Qiita에 투입
  • Scrapy 반복을 통해 웹 사이트의 제목과 URL을 가져옵니다.
  • 바이두 코드


    크롤러의 간 부분입니다.참고 사이트CrawlSpider 상속류의 사용 상황이 매우 많다.나는 그 대부분의 상황이 비교적 수월하다고 생각한다.
    WebSpider.py
    # -*- coding: utf-8 -*-
      import scrapy
      from tutorial.items import TutorialItem
      import re
      from scrapy.exceptions import NotSupported
      from urllib.parse import urlparse
    
    
      class WebSpider(scrapy.Spider):
          name = 'web'
          # 見つけたドメインを入れる
          tracked_domains = []
          # 全てを対象
          allowed_domains = []
          # 最初に見に行くサイト
          start_urls = ['http://XXXXXXXXXXXXX']
    
          # response を毎回処理する関数
          def parse(self, response):
              try:
                  # データ処理
                  # この関数内の処理が終わると続きを実行する
                  # dataPipeline を利用した場合もここに戻って来る
                  yield self.parse_items(response)
    
                  # リンクを辿る
                  for link in response.xpath('//@href').extract():
                      if re.match(r"^https?://", link):
                          yield scrapy.Request(link, callback=self.parse)
              except NotSupported:
                  # GET のレスポンスが txt じゃなかった場合
                  # Spiders の logging 機能が用意されているのでそれを利用
                  self.logger.info("Raise NotSupported")
    
          # ドメインごとにページに表示された画像を保存する
          def parse_items(self, response):
              # domain の抽出
              url = response.url
              parsed_url = urlparse(url)
              domain = parsed_url.netloc
    
              # 同じ Domain は一回しかチェックしない
              if domain in self.tracked_domains:
                  return
    
              self.tracked_domains.append(domain)
    
              item = TutorialItem()
              item['domain'] = domain
    
              # title の抽出
              title = response.xpath(r'//title/text()').extract()
              if len(title) > 0:
                  item['title'] = title[0]
              else:
                  item['title'] = None
    
              # 画像 URL をセット
              item["image_urls"] = []
              for image_url in response.xpath("//img/@src").extract():
                  if "http" not in image_url:
                      item["image_urls"].append(response.url.rsplit("/", 1)[0]
                             + "/" + image_url)
                  else:
                      item["image_urls"].append(image_url)
    
              # item を返すと datapipeline に渡される
              return item
    
    start_urls에 설정된 URL이 복제됩니다.
    나는 그런 일을 하지 않을 것이다. 그러나 여기서 의심스러운 사이트를 지정하면 링크를 통해 새로운 의심스러운 사이트의 도메인 이름을 찾을 수 있을 것이다.나는 그런 일을 하지 않는다.
    기본적으로parse() 함수는 scrapy의 모든 응답에 따라 호출 처리됩니다.
    이번 중도 호출 parse_items() 은 저장되지 않은 영역이라면 폴더를 만들어서 이 페이지의 그림을 저장합니다.

    settings.scrapy의 설정을 py로 기술하기

    parse_items()에서 반환item하면 ImagePipeline에 전달됩니다.
    그 설정은 다음과 같다.Pipeline 자체 제작에 대한 설명은 뒤에 설명되어 있습니다.
    settings.py
      # 自作 pipeline に繋げる
      ITEM_PIPELINES = {'tutorial.pipelines.MyImagesPipeline': 1}
      # データの保存場所
      IMAGES_STORE = '/Users/paper2/scrapy/tutorial/imgs'
      # リンクを辿る深さを指定
      DEPTH_LIMIT = 5
      # LOG_LEVEL = 'ERROR'
      DOWNLOAD_DELAY = 3
    

    pipelines.py로 pipeline 사용자 정의


    기본 ImagePipeline은, 등의 추가 작업을 수행할 수 없으므로 각 도메인에 대한 폴더를 생성하여 직접 생성합니다.
    pipeliens.py
    # -*- coding: utf-8 -*-
    from scrapy.pipelines.images import ImagesPipeline
    import os
    from tutorial import settings
    import shutil
    
    
    class MyImagesPipeline(ImagesPipeline):
        def item_completed(self, results, item, info):
            # DL できたファイルのパス
            file_paths = [x['path'] for ok, x in results if ok]
    
            # ドメインごとのフォルダに move
            for file_path in file_paths:
                img_home = settings.IMAGES_STORE
                full_path = img_home + "/" + file_path
                domain_home = img_home + "/" + item['domain']
    
                os.makedirs(domain_home, exist_ok=True)
                # DL した結果同じファイルのことがある
                if os.path.exists(domain_home + '/' + os.path.basename(full_path)):
                    continue
                shutil.move(full_path, domain_home)
    
            # parse() の続きに戻る
            return item
    
    이렇게 하면 완성된다.

    실제로 한 바퀴 돌다


    잠시 돌아다니며 다양한 영역에서 이미지를 수집했다.

    응?자세히 보면 수상한 사이트의 영역이 뒤섞여 있고, 이미지도 수상한 것이 섞여 있다. 그러면 다음에 이 수상한 영역을 제거한다(반대로 그것만 남기는 시도 63AWS Rekognition을 사용해 보고 싶습니다.

    좋은 웹페이지 즐겨찾기