プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • 設計
  • 【設計】スクレイピングプログラムの設計
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【設計】スクレイピングプログラムの設計

05.25

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

スクレイピングの注意点

そのサイトが規約違反になっていないか確認すること。

例えば、以下のサイトではスクレイピング自体が禁止されています。

  • Twitter
  • Instagram
  • メルカリ
  • Amazon

規約違反にならないかの調査手順

  1. サイトの利用規約のページを開く
  2. Ctrl + Fで検索窓を開いて「自動」、「クローリング」、「スクレイピング」、「ロボット」、「ボット」、「RPA」、「スクレーパー」などと検索する。(英語サイトであればauto、robot、bot、crawlingcrawling、scrapingなどと検索する。)
  3. どれも検索にヒットしないのであれば特にそのサイトではスクレイピングを禁止しているわけではないと判断できる。

著作権違反していないか確認すること

取得したデータ(rawデータ)をそのまま譲渡すると著作権侵害になってしまいます。

ただし、「何かしらの分析を加えたデータ」であれば譲渡しても問題ないと言われています。

BOT対策

BOTとはロボットによるアクセスか、人間によるアクセスかを判断することです。サイトによっては必要になります。BOTかどうかの判定には様々な方法があります。

  • UserAgentによる判別

例えば、ScrapyなどではUserAgentの値をいじることができそれによって人間によるアクセスと認識させることができます。

APIが用意されている場合はそちらを利用する。

待ち時間をランダムにする。

Pythonでは待ち時間を設定するにはtimeライブラリのsleepを使いますがあえて待ち時間をランダムにしてあげる手法があります。

1
2
3
from time import sleep
sleep(2) # 2秒固定
sleep(random.randint(1,10)) # 待ち時間を1〜10秒の間でランダムに選定

読み込み待機時間がランダムになる方がより人間らしいクローリングになるので、制限の厳しいサイトなどでは使えるテクニックになります。

ログイン画面に注意

大抵のログイン画面ではCSRFトークンをPOSTする必要があるので考慮しましょう。なお、画像認証があるようなサイトの場合は認証の突破は困難というかセキュリティ的に問題ありなので依頼を断りましょう。

基本

robots.txtは事前に確認する。

robots.txtとは各サイトに定められているクローラーに対して制限事項を定義することができるファイル。SEOの検索エンジンのクローラーに指示を出すために作成している物ですが、スクレイピングプログラムを作る際もこのファイルは関係してくるのでよく確認しておく必要があります。

確認方法

スクレイピングしたいサイトのトップドメインから以下のように指定すれば確認できます。

1
http://xxx.com/robots.txt

以下の情報が記載してあります。(ちなみに、全く記載がないサイトもたくさんあります。)

  • ここのURLはアクセスしても良いですよ。
  • ここのURLはアクセスしてはいけないですよ。

例えば、以下の例で言えば、UserAgentがGooglebotの場合は「/assistapi」や「/bin」へアクセスしないでくださいねという意味になります。

1
2
3
User-agent: Googlebot
Disallow: /assistapi
Disallow: /bin

特に見る箇所は、User-agentが「*」になっている物をよく見ておく必要があります。

1
2
User-agent: *
Disallow: /xxx

User-agentはアクセス元を指していて、*なら全てのユーザーに対する事項になり、これから作成するスクレイピングプログラムも基本的にはこれに該当することになるためです。DisallowにこれからスクレイピングしたいURLの記載がある場合は規約違反になってしまうのでスクレイピングプログラムの作成もやめざるおえないです。

URLの変更に対する対処

URLがいきなり変わったりしてアクセスできなくなる場合があります。その場合は実行時例外を放置するのではなく、例外処理をしてどのURLでアクセスできなくなったことがわかるようにしてあげましょう。

定期実行が必要か確認すること

Scrapy Cloudなどのクラウドサービスにスクレピングプログラムをデプロイする必要があります。(自分のPCだとシャットダウンするため

robotparser

Pythonの標準モジュールでそのサイトがスクレイピングを許可しているか調べることが可能です。事前に、そのサイトがスクレイピングを許可しているか調べる(利用規約や、robots.txtなどを読む)のですが非常に大変です。

robots.txtを見てこれからスクレイピングしようとしているURLがスクレイピングOKなのかチェックしてくれます。ただ、実際にログインしていないと使えないrobots.txtを読み込めないサイトもあったりするので一概に良いというわけではないです。また、robots.txtでは許可しているが、利用規約では禁止しているサイトもあるのでこれだけに頼るのははっきり言って無理です。

スクレイピングの流れ

  1. HTMLを取得する。
  2. 取得したHTMLを解析する。
  3. 解析して取得したデータを整形する。
  4. スクレイピング結果を保存する。

Scrapyを利用したスクレイピングの流れ

Scrapyを利用したスクレイピングの流れは以下になります。

Webページのダウンロード

  1. 最初にアクセスするURLを指定する。
  2. リンクのたどり方を指定する。

データの抽出

必要なデータの抽出方法を指定する。

データの保存

CSVなどに保存する。

画像取得スクレイピングプログラムの設計

  1. Seleniumでまずはダウンロードしたい「画像のURL」と「画像タイトル」だけを抽出してCSVファイルなど保存しておく。
  2. その後、1で抽出したURL一覧に対してSeleniumを使わずに一気に画像をダウンロードする。

なぜ一旦画像URLだけ保存するかというと、処理を効率化するためという意味もありますが、画像サイトの参照元がその画像サイトの著作権とは限らないためです。どこから取得した画像かどうかログを残したいという意味で一旦画像URLだけ保存する設計が望ましいです。

サーバー負荷の配慮

レスポンスタイムを監視する。

明らかに落ちてきた場合はスクレイピングは止める。JavaScriptでレスポンスタイムの取得はできます。

サーバーアクセスの間隔を1秒以上開けるようにする。

サーバーに負荷がかかって場合によってはサーバーが落ちるケースもあるため。

ただ、これにも様々な見解があって「1分に1回程度ならよいだろう。」と考える人もいます。

保存先

様々な保存先があります。

  • CSV
  • JSON
  • スプレットシート
  • Excel
  • データベース
スポンサーリンク
  • 2023 05.25
  • miyabisan2
  • コメントを書く
  • 設計
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 04.29

    【システム開発】開発モデル、開発手法の種類

  2. 2021 11.23

    【メール設計】「SES」と「SendGrid」の比較

  3. 2021 11.23

    【認証設計】「セッション」の保存先について

  4. 2018 04.29

    【データベース設計】ハードウェアのサイジング(容量と性能)を決める。(物理設計)

  5. 2021 12.02

    【インフラ】Dockerを本番環境でどう動かすか?(EC2、ECSなど)

  6. 2018 05.19

    【設計】クラス設計(オブジェクト指向設計)の基本(保守性、再利用性の高いソースコードを書くには?)

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Jenkins】基本、設定(Generalなど)

【Python】主流のスクレピングライブラリ

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー