前回 に続きおもしろそうなスクレイピング方法をまた見つけたので紹介していきたいと思います。
Scrapyというフレームワークを使った方法です。
Scrapyとは
Scrapyとはpythonのフレームワークです。BeautifulSoupと同じようにサイトスクレイピングができます。
しかし、スクレイピングまでのアプローチの仕方がかなり違っていて、やり方次第では高度なスクレイピングができるようです。
今回は前回と同じように自分のサイトを簡単にスクレイピングしていきたいと思います。
準備するもの
- Powershell
普通にPowershellがつかえればいいと思います。ぼくはAnacondapromptをつかいました。
Scrapyを使ってみる
Scrapyのインストール
では始めて行きましょう。まず、Scrapyをインストールしていきます。(Anaconda promptでもインストールする必要があります。)
pip install scrapy
これでScrapyが使えます。
プロジェクトを作る
Scrapyを使うに当たり、以前紹介したDjangoのようにプロジェクトを作っていきます。
まず、自分でProjectフォルダを作り、Powershellで移動します。
cd Project
そうしたら、次に種々のファイルを自動生成します。
scrapy startproject (プロジェクト名)
(プロジェクト名)には好きな名前を入れてください。
すると、自動でファイルができます。
Project └── (プロジェクト名) ├── scrapy.cfg └── (プロジェクト名) ├── __init__.py ├── __pycache__ ├── items.py ├── middlewares.py ├── pipelines.py ├── settings.py └── spiders ├── __init__.py └── __pycache__このようにファイルができていれば成功です。
spiderのテンプレートを作る
つぎにProject/(プロジェクト名)/(プロジェクト名)に移動し、
Project └── (プロジェクト名) ├── scrapy.cfg └── (プロジェクト名)←ここ!!!!!!! ├── __init__.py ├── __pycache__ ├── items.py ├── middlewares.py ├── pipelines.py ├── settings.py └── spiders ├── __init__.py └── __pycache__
scrapy genspider (スパイダーの名前)(スクレイピングするサイトのURL)とすることでテンプレートのようなものを作ってくれます。
(スパイダーの名前)には好きな名前をいれ、(スクレイピングするサイトのURL)にはhttps://imagisi.comを入れるとこのサイトがスクレイピングできるようになります。
class (スパイダーの名前)(scrapy.Spider): name = '(スパイダーの名前)' allowed_domains = ['imagisi.com'] start_urls = ['https://imagisi.com/'] def parse(self, response): pass
spiderの編集
さて、今回はページをまたいでスクレイピングして、ブログ記事のタイトルとそのURLを取得したいので、それができるようにspiderを編集していきましょう。
# -*- coding: utf-8 -*- import scrapy class (スパイダー名)(scrapy.Spider): name = '(スパイダー名)' allowed_domains = ['imagisi.com'] start_urls = ['https://imagisi.com/'] def parse(self, response): for href in response.css('.a-wrap'): yield { 'url': href.css('a::attr(href)').extract_first(), 'title':href.css('h2.entry-card-title::text').extract_first(), } # ページを移動するための処理 older_post_link = response.css('div.pagination-next a.pagination-next-link::attr(href)').extract_first() if older_post_link is None: # リンクが取得できなかった場合は最後のページなので処理を終了 return # URLが相対パスだった場合に絶対パスに変換する older_post_link = response.urljoin(older_post_link) # 次のページをのリクエストを実行する yield scrapy.Request(older_post_link, callback=self.parse)
これで完了です。
補足しておくと、
for href in response.css('.a-wrap'): yield { 'url': href.css('a::attr(href)').extract_first(), 'title':href.css('h2.entry-card-title::text').extract_first(), }では.css()を利用して目的のタグを取得して処理を回していきます。このブログでは
<a class="a-wrap" href="..."> <h2 class="entry-card-title">...</h2> </a> <a class="a-wrap" href="..."> <h2 class="entry-card-title">...</h2> </a> ...という構造をしていたので上記のようにデータを引き出しました。
設定を行う(重要)
さて、スクレイピングを行っていく前に絶対にやっておきたい設定がいくつかあります。
まず、setting.pyを開きましょう。
開いたら、まずレスポンス間隔を調整しましょう。これをしないとスクレイピングするサーバーに負荷をかけることになり迷惑が掛かります。
# Configure a delay for requests for the same website (default: 0) # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay # See also autothrottle settings and docs DOWNLOAD_DELAY = 3
コメントになっているのでコメントを外しておきましょう。
次にキャッシュを有効にしていきましょう。
# Enable and configure HTTP caching (disabled by default) # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html #httpcache-middleware-settings HTTPCACHE_ENABLED = True HTTPCACHE_EXPIRATION_SECS = 0 HTTPCACHE_DIR = 'httpcache' HTTPCACHE_IGNORE_HTTP_CODES = [] HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
これもコメントを外しておきましょう。
スクレイピング
ではさっそくスクレイピングをしていきましょう。
Powershellで、
scrapy crawl (スパイダー名) -o (csv名).csv
としてみましょう。(csv名).csvというファイルができているはずです。(csv名)は何でもいいです。
開いてみてしっかり出力されていたら成功です!!!

しっかりスクレイピングされていました!!!
参考


コメント
[…] 前回はScrapyによるスクレイピングをやりましたが、今回はseleniumを使ってスクレイピングをしていきます。 […]