scrapy로 기어오르기를 설치하여 그림을 수집해 보십시오
14327 단어 ScrapyReKognitionAWS
이번에 시작된 페이지부터 끊임없이 링크를 탐색하여 도메인 이름의 폴더에 따라 전진할 때의 페이지 이미지를 저장합니다.이번에 나는 모든 폴더의 그림을 AWS Rekognition에 던져서 그림에서 그 영역이 어떤 영역인지 판단하고 싶다.
전제 조건
사이트 축소판 그림
바이두 코드
크롤러의 간 부분입니다.참고 사이트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을 사용해 보고 싶습니다.
Reference
이 문제에 관하여(scrapy로 기어오르기를 설치하여 그림을 수집해 보십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/paper2/items/bb4fe0f78ea1dbd974b5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- 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
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을 사용해 보고 싶습니다.
Reference
이 문제에 관하여(scrapy로 기어오르기를 설치하여 그림을 수집해 보십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/paper2/items/bb4fe0f78ea1dbd974b5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- 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을 사용해 보고 싶습니다.
Reference
이 문제에 관하여(scrapy로 기어오르기를 설치하여 그림을 수집해 보십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/paper2/items/bb4fe0f78ea1dbd974b5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)