5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

scrapyのsettings.pyに記述した方が良いこと

Last updated at Posted at 2022-03-13

scrapyでスクレイピングする際、settings.pyで色々設定を変えることができます。
まずspiderのソースコード書き始める前に、これは設定変えておいた方が良いというものの覚書です。

追記するもの

文字コードを変更して文字化けを防ぐ

FEED_EXPORT_ENCODING = 'utf-8'を追記しておく。
スクレイピングして出力してきた文字コードを指定しないと文字化けするかもなので。

既存の記述のコメントアウトを外すもの

ちなみにコメントアウトを外すには、センテンスを選択してcommand + K + U
コメントアウトをつけるには、command + K + C

ページダウンロードの間隔を設定する

DOWNLOAD_DELAY = 3のコメントアウトを外す
多分かなり重要
ページをダウンロードしてから次のページのダウンロードするまで3秒待って負荷を軽くしろという意味
これやってないと、スクレイピングしたいサイトに迷惑がかかる

robots.txtに従うか決める
# Obey robots.txt rules
ROBOTSTXT_OBEY = True

これはrobots.txtの記述に従うかって話。

取得した言語を日本語にする
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'ja',
}

言語に関して。
初期設定では、'Accept-Language': 'en'ってなってるのでjaに変更する。
これをしないと取得した要素が英語になる。

ダウンロードしたページのキャッシュを保持させる設定

HTTPCACHE_ENABLED = True
ダウンロードしたページをキャッシュデータとして持っておく
スクレイピングが難しいので何度もエラーを解消しようとコードの書き換えする場面もあるので、毎回ダウンロードして処理に時間がかからないように。

HTTPCACHE_DIR = 'httpcache'
キャッシュを持っておくディレクトリ名を指定

HTTPCACHE_EXPIRATION_SECS = 86400
キャッシュを保持しておく秒数
86400秒(=1日)経ったら、キャッシュに頼らずダウンロードし直す
ページが更新されてしまったらスクレイピングする値も変わってしまうので、変更の頻度に合わせて変える

User-Agentの変更

USER_AGENT =
httpリクエストを送った時のUser-Agentの値を変更する
スクショに貼ってあるのは、普通のユーザーとしてWebページを閲覧する時に送られるリクエスト。
Scrapyのbotがリクエストを送るとUser-Agentに「scrapy〜〜」みたいな値が入るらしい。
webページによっては、「このリクエスト、人間じゃなくてスクレイピング目的のクローラーだな。アクセス禁止してやる!」みたいな作りにしてるものもあるらしい。

スクリーンショット 2022-03-06 16.18.45.png

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?