質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

1回答

617閲覧

画像フォルダを作成し保存したい

zonkota

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

0クリップ

投稿2022/03/03 13:54

実現したいこと

スクレイピングで抽出した画像URLをbook_imagesフォルダへ格納するという処理を講座で習ったのですが、その通りにやっても画像URLは取得できるのですが、book_imagesフォルダが作成されません。どこかが間違っているのだとは思うのですが、見つけられませんでした。教えて頂きたいです。よろしくお願いします。

settings.py

1 2BOT_NAME = 'kinokuniya' 3 4SPIDER_MODULES = ['kinokuniya.spiders'] 5NEWSPIDER_MODULE = 'kinokuniya.spiders' 6 7ROBOTSTXT_OBEY = True 8 9 10DOWNLOAD_DELAY = 3 11 12ITEM_PIPELINES = { 13 'kinokuniya.pipelines.CheckItemPipeline': 100, 14 'scrapy.pipelines.images.ImagesPipeline': 400, 15} 16 17IMAGE_STORE = r'/Users/name/Desktop/books_toscrape/kinokuniya/book_images' 18IMAGE_URLS_FIELD = 'image_urls' 19middleware-settings 20HTTPCACHE_ENABLED = True 21HTTPCACHE_EXPIRATION_SECS = 0 22HTTPCACHE_DIR = 'httpcache' 23#HTTPCACHE_IGNORE_HTTP_CODES = [] 24#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' 25 26FEED_EXPORT_ENCODING='utf-8' 27 28#処理する量を一つに限定する 29CONCURRENT_REQUESTS = 1 30 31#優先順を階層の浅いところから処理する 32DEPTH_PRIORITY = 1 33 34#リクエストを受けた最後から処理する⇨最初から処理するへ変更 35SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' 36SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue' 37

computer_books.py

1import scrapy 2from scrapy.linkextractors import LinkExtractor 3from scrapy.spiders import CrawlSpider, Rule 4import logging 5from kinokuniya.items import BookItem 6from scrapy.loader import ItemLoader 7 8 9class ComputerBooksSpider(CrawlSpider): 10 name = 'computer_books' 11 allowed_domains = ['www.kinokuniya.co.jp'] 12 start_urls = ['https://www.kinokuniya.co.jp/f/dsd-101001037028005-06-'] 13 14 rules = ( 15 #書籍20冊分のURLを辿る 16 Rule(LinkExtractor(restrict_css='h3.heightLine-2 > a'), callback='parse_item', follow=False), 17 #「次へ」へ行く 18 # Rule(LinkExtractor(restrict_css='a:contains("次へ")')), 19 ) 20 21 def parse_item(self, response): 22 logging.info(response.url) 23 24 loader = ItemLoader(item=BookItem(),response=response) 25 loader.add_css('title','h3[itemprop="name"]::text'), 26 loader.add_css('author','div.infobox.ml10.mt10 > ul > li > a::text'), 27 loader.add_css('price','span.sale_price::text'), 28 loader.add_css('publisher','a[href*=publisher-key]::text'), 29 loader.add_css('size','div.infbox.dotted.ml10.mt05.pt05 > ul > li:first-of-type::text'), 30 loader.add_css('page','div.infbox.dotted.ml10.mt05.pt05 > ul > li:first-of-type::text'), 31 loader.add_css('isbn','li[itemprop="identifier"]::text'), 32 #画像URL 33 loader.add_value('image_urls',[response.urljoin(response.css('img[itemprop="image"]::attr(src)').get())]) 34 35 yield loader.load_item() 36

item.py

1import scrapy 2from itemloaders.processors import TakeFirst, MapCompose, Join 3 4def strip_yen(element): 5 if element: 6 return element.replace('¥','') 7 return element 8 9def strip_comma(element): 10 if element: 11 return element.replace(',','') 12 return element 13 14 15def convert_integer(element): 16 if element: 17 return int(element) 18 return 0 19 20def get_size(element): 21 if element: 22 return element.split('/')[0].strip().replace('サイズ ','').replace('判','') 23 return element 24 25def get_page(element): 26 if element: 27 return element.split('/')[1].replace('ページ数 ','').replace('p','') 28 return element 29 30def strip_isbn(element): 31 if element: 32 return element.replace('商品コード ','') 33 return element 34 35class BookItem(scrapy.Item): 36 title = scrapy.Field( 37 input_processor = MapCompose(str.lstrip), 38 output_processor = Join(' ') 39 ) 40 author = scrapy.Field( 41 output_processor = TakeFirst() 42 ) 43 price = scrapy.Field( 44 input_processor = MapCompose(strip_yen, strip_comma, convert_integer), 45 output_processor = TakeFirst() 46 ) 47 publisher = scrapy.Field( 48 output_processor = TakeFirst() 49 ) 50 size = scrapy.Field( 51 input_processor = MapCompose(get_size), 52 output_processor = TakeFirst() 53 ) 54 page = scrapy.Field( 55 input_processor = MapCompose(get_page, convert_integer), 56 output_processor = TakeFirst() 57 ) 58 59 isbn = scrapy.Field( 60 input_processor = MapCompose(strip_isbn), 61 output_processor = TakeFirst() 62 ) 63 64 image_urls = scrapy.Field() 65
(scrapy_env) name@name kinokuniya % scrapy crawl computer_books 2022-03-03 22:31:46 [scrapy.utils.log] INFO: Scrapy 2.4.1 started (bot: kinokuniya) 2022-03-03 22:31:46 [scrapy.utils.log] INFO: Versions: lxml 4.6.4.0, libxml2 2.9.10, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 21.7.0, Python 3.8.12 (default, Oct 12 2021, 06:23:56) - [Clang 10.0.0 ], pyOpenSSL 21.0.0 (OpenSSL 1.1.1l 24 Aug 2021), cryptography 36.0.0, Platform macOS-10.16-x86_64-i386-64bit 2022-03-03 22:31:46 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor 2022-03-03 22:31:46 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'kinokuniya', 'CONCURRENT_REQUESTS': 1, 'DEPTH_PRIORITY': 1, 'DOWNLOAD_DELAY': 3, 'FEED_EXPORT_ENCODING': 'utf-8', 'HTTPCACHE_ENABLED': True, 'NEWSPIDER_MODULE': 'kinokuniya.spiders', 'ROBOTSTXT_OBEY': True, 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'SPIDER_MODULES': ['kinokuniya.spiders']} 2022-03-03 22:31:46 [scrapy.extensions.telnet] INFO: Telnet Password: aaec40ad6141d1f7 2022-03-03 22:31:46 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions.logstats.LogStats'] 2022-03-03 22:31:46 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats', 'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware'] 2022-03-03 22:31:46 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2022-03-03 22:31:46 [scrapy.middleware] INFO: Enabled item pipelines: ['kinokuniya.pipelines.CheckItemPipeline'] 2022-03-03 22:31:46 [scrapy.core.engine] INFO: Spider opened 2022-03-03 22:31:46 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2022-03-03 22:31:46 [scrapy.extensions.httpcache] DEBUG: Using filesystem cache storage in /Users/name/Desktop/books_toscrape/kinokuniya/.scrapy/httpcache 2022-03-03 22:31:46 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023 2022-03-03 22:31:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.kinokuniya.co.jp/robots.txt> (referer: None) ['cached'] 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 2022-03-03 22:31:47 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.kinokuniya.co.jp/f/dsg-01-9784839969301> {'author': '小川 卓【監修】', 'image_urls': ['https://www.kinokuniya.co.jp/images/goods/ar2/web/imgdata2/48399/4839969302.jpg'], 'isbn': '9784839969301', 'page': 224, 'price': 2728, 'publisher': 'マイナビ出版', 'size': 'B5', 'title': 'コンバージョンを上げるWebデザイン改善集'} 2022-03-03 22:31:47 [root] INFO: https://www.kinokuniya.co.jp/f/dsg-01-9784873119236 2022-03-03 22:31:47 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.kinokuniya.co.jp/f/dsg-01-9784873119236> 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 2022-03-03 22:31:47 [root] INFO: https://www.kinokuniya.co.jp/f/dsg-01-9784774191300 2022-03-03 22:31:47 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.kinokuniya.co.jp/f/dsg-01-9784774191300> {'author': '山田 祥寛【著】', 'image_urls': ['https://www.kinokuniya.co.jp/images/goods/ar2/web/imgdata2/47741/4774191302.jpg'], 'isbn': '9784774191300', 'page': 497, 'price': 4070, 'publisher': '技術評論社', 'size': 'B5', 'title': 'Angularアプリケーションプログラミング'} 2022-03-03 22:31:47 [scrapy.core.engine] INFO: Closing spider (finished) 2022-03-03 22:31:47 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 11117, 'downloader/request_count': 22, 'downloader/request_method_count/GET': 22, 'downloader/response_bytes': 1929878, 'downloader/response_count': 22, 'downloader/response_status_count/200': 22, 'elapsed_time_seconds': 0.479828, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2022, 3, 3, 13, 31, 47, 266327), 'httpcache/hit': 22, 'item_scraped_count': 20, 'log_count/DEBUG': 43, 'log_count/INFO': 30, 'memusage/max': 62787584, 'memusage/startup': 62787584, 'request_depth_max': 1, 'response_received_count': 22, 'robotstxt/request_count': 1, 'robotstxt/response_count': 1, 'robotstxt/response_status_count/200': 1, 'scheduler/dequeued': 21, 'scheduler/dequeued/memory': 21, 'scheduler/enqueued': 21, 'scheduler/enqueued/memory': 21, 'start_time': datetime.datetime(2022, 3, 3, 13, 31, 46, 786499)} 2022-03-03 22:31:47 [scrapy.core.engine] INFO: Spider closed (finished)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

それってpipelines.pyにどの様に書くかの問題では?

投稿2022/03/15 00:28

ushidamo

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問