前提・実現したいこと
ScrapyでFiles Pipelineを用いてYahoo!ニュースのトピックス記事内の画像をcsvに保存したいです.
下記コードで画像をFILES_STOREで指定したディレクトリに保存したかったのですが,URLが取得できるのみで画像ファイル自体が収集できません.どうすればURLだけでなく,画像ファイルも保存できるのでしょうか?
items.py
python
1import scrapy 2 3class Headline(scrapy.Item): 4 """ 5 ニュースのヘッドラインを表すItem。 6 """ 7 title = scrapy.Field() 8 body = scrapy.Field() 9 image_url = scrapy.Field() 10 images = scrapy.Field()
setting.py
python
1BOT_NAME = 'myproject' 2SPIDER_MODULES = ['myproject.spiders'] 3NEWSPIDER_MODULE = 'myproject.spiders' 4FILES_STORE = 'images' 5 6ROBOTSTXT_OBEY = True 7DOWNLOAD_DELAY = 1 8 9ITEM_PIPELINES = { 10 'scrapy.pipelines.files.FilesPipeline': 1 11} 12
news_crawl.py
from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from myproject.items import Headline class NewsCrawlSpider(CrawlSpider): name = "news_crawl" # Spiderの名前。 # クロール対象とするドメインのリスト。 allowed_domains = ["news.yahoo.co.jp"] # クロールを開始するURLのリスト。 start_urls = ( 'http://news.yahoo.co.jp/', ) # リンクをたどるためのルールのリスト。 rules = ( # トピックスのページへのリンクをたどり、レスポンスをparse_topics()メソッドで処理する。 Rule(LinkExtractor(allow=r'/pickup/\d+$'), callback='parse_topics'), ) def parse_topics(self, response): """ トピックスのページからタイトルと本文と画像を抜き出す。 """ item = Headline() item['image_url'] = response.css('div.headlinePic a span.image img::attr("data-src")').extract_first() item['title'] = response.css('.newsTitle ::text').extract_first() item['body'] = response.css('.hbody').xpath('string()').extract_first() yield item
補足情報(FW/ツールのバージョンなど)
Scrapy 1.5.2
Python 3.6.5
scrapy入れたことも使ったこともないですが、ImagesPipelineというのがあるようですよ。ご参考までに。
http://scrapingauthority.com/scrapy-download-images/
あなたの回答
tips
プレビュー