プログラミングマガジン

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

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

【Python】scrapyのcrawlテンプレートで実装

06.06

  • miyabisan2
  • コメントを書く

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

crawlテンプレートとは?

通常のWebサイトをクロールするためのspiderのテンプレートになります。ルールを定義してリンクを辿っていきます。デフォルトのbasicテンプレートに比べてリンクをたどりやすくなっています。

Basicテンプレートとの違い

Basicテンプレートでも同じようにクロールすることは可能です。ただ、Basicテンプレートと違いクロールするためのルールを記述するだけで自動的にクロールを実現することができるので、細かい挙動の指定は不要になるというメリットがあります。

基本的には例えば、同じページから複数の詳細ページへ遷移するというようなページ遷移が多いスクレイピングの場合はBasicテンプレートよりもcrawlテンプレートの方が優れていると言えるでしょう。

spiderの作成

1
scrapy genspider -t crawl spider名 URL(https://なしの)

生成されたSpider

以下のソースコードがspiderフォルダに生成されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
 
 
class XXXSpider(CrawlSpider):
    name = "xxx"
    allowed_domains = ["www.xxx.co.jp"]
    start_urls = ["https://www.xxx.co.jp/f/dsd-101001037028005-06-"]
 
    rules = (Rule(LinkExtractor(allow=r"Items/"), callback="parse_item", follow=True),)
 
    def parse_item(self, response):
        item = {}
        #item["domain_id"] = response.xpath('//input[@id="sid"]/@value').get()
        #item["name"] = response.xpath('//div[@id="name"]').get()
        #item["description"] = response.xpath('//div[@id="description"]').get()
        return item

rules属性

basicテンプレートと主に異なっている点になります。tupleで定義されているので後で変更することはできません。Ruleオブジェクトを保持しています。tupleなので以下のように複数のRuleオブジェクトを保持することも可能です。複数指定した場合は上から順番にルールを実行します。

1
2
3
4
rules = (
  Rule(LinkExtractor(...)),
  Rule(LinkExtractor(...))
)

Ruleオブジェクト

指定したサイトにおいてどのようにリンクを辿っていくかを指定するものです。例えば、一覧画面の中の詳細画面のXPathを指定してあげれば全ての詳細ページのレスポンスを返してくれます。

LinkExtractor(allow=r"Items/")

クロールされた各ぺーじからリンクを抽出する方法を定義します。

リンクを辿るかどうかをallowかdenyで指定します。rは正規表現でこの場合は「Items/」というリンクを辿っていくという指定になります。URLの指定方法は他にもいろいろあります。

allow=r"Items/" URLを正規表現で指定します。
restrict_xpaths=('xpath') URLをXPathで指定します。
 restrict_css='cssセレクタ'  URLをCSSセレクタで指定します。

callback="parse_item"

コールバックメソッドで、リクエストが返ってきたらレスポンスとして実行します。この場合はparse_itemメソッドを実行します。(なお、注意点としてはメソッドにはparseというメソッド名は利用しないようにしましょう。crawlテンプレート内で暗黙で利用されるメソッド名のためです。)

follow=True

rulesで定義したリンク先のさらにリンク先を辿るかどうか指定するboolean型です。trueならリンクを辿る指定になります。

ページネーションをたどりつつ各詳細ページのレスポンスを取得するサンプル

1
2
3
4
5
6
7
8
9
10
11
    rules = (Rule(LinkExtractor(restrict_xpaths='一覧画面の詳細リンクのXPath'),
             callback="parse_item", follow=False),
             Rule(LinkExtractor(restrict_xpaths='ページネーション次へのリンクのXPath,
             )
 
    def parse_item(self, response):
        logging.info(response.url)
        yield {
            '詳細情報1': response.xpath('詳細情報1のxpath').get(),
            '詳細情報2': response.xpath('詳細情報2のxpath').get(),
        }

  1. 一覧画面の1ページ目の詳細画面のリンクを全て読み込む(20件あれば20件全て読み込む)
  2. 次へボタンリンクをクリック

という処理の流れになります。

 

 

スポンサーリンク
  • 2023 06.06
  • miyabisan2
  • コメントを書く
  • Python
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2023 06.11

    【Python】スプレットシート操作

  2. 2023 06.09

    【Python】Scrapy Item、Item Loader、Item pipelineの基本

  3. 2023 06.03

    【Python】Scrapyのコマンド、開発の流れ

  4. 2023 06.04

    【Python】Scrapyで複数ページを操る。

  5. 2023 06.26

    【Python】モジュール、自作モジュール、パッケージ、ライブラリ

  6. 2023 05.31

    【Python】Seleniumでクローリング環境を構築

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

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

返信をキャンセルする。

【Python】ログ出力ライブラリlogging

【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 ©  プログラミングマガジン | プライバシーポリシー