Pythonスクレイプフレームワークティーチング(3):scrapy.Spider

Spiderクラスは、特定の(または特定の)Webサイトをクロールする方法を定義します。クロールアクション(たとえば、リンクをフォローアップするかどうか)と、Webページのコンテンツ(クロールアイテム)から構造化データを抽出する方法を含みます。つまり、Spiderは、クロールアクションを定義し、特定のWebページ(または一部のWebページ)を分析する場所です。

スパイダーの場合、クロールサイクルは次のようになります。

  1. 初期URLでリクエストを初期化し、コールバック関数を設定します。リクエストがダウンロードされて返されると、レスポンスが生成され、パラメータとしてコールバック関数に渡されます。

スパイダーの最初のリクエストは、start_requests()を呼び出すことで取得されます。start_requests()はstart_urlsのURLを読み取り、コールバック関数としてparseを使用してRequestを生成します。

  1. 返された(Webページ)コンテンツをコールバック関数で分析し、ItemオブジェクトまたはRequest、あるいは両方を含む反復可能なコンテナーを返します。返されたRequestオブジェクトはScrapyによって処理され、対応するコンテンツをダウンロードして、setコールバック関数を呼び出します(関数は同じでもかまいません)。
  2. コールバック関数では、セレクター(BeautifulSoup、lxml、または任意のパーサーを使用することもできます)を使用して、Webページのコンテンツを分析し、分析されたデータに基づいてアイテムを生成できます。
  3. 最後に、スパイダーによって返されたアイテムは、データベースに保存されるか(アイテムパイプラインによって処理されます)、フィードエクスポートを使用してファイルに保存されます。

このループは(ある程度)あらゆるタイプのスパイダーに適用できますが、Scrapyはさまざまなニーズに対応するさまざまなデフォルトのスパイダーを提供します。これらのスパイダーについては後で説明します。

Pythonクローラー、データ分析、Webサイト開発、その他のケースチュートリアルビデオはオンラインで無料で視聴できます

https://space.bilibili.com/523606542

Python学習交換グループ:1039645993

クモ

crapy.spider.Spiderは最も単純なスパイダーです。他のすべてのスパイダーは、このクラスから継承する必要があります(Scrapyに付属している他のスパイダーと自分で作成したスパイダーを含む)。指定されたstart_urls / start_requestsのみを要求し、結果の応答に基づいてスパイダーの解析メソッドを呼び出します。

名前

蜘蛛の名前を定義する文字列。スパイダーの名前は、Scrapyがスパイダーを見つける(そして初期化する)方法を定義するため、一意である必要があります。ただし、複数の同一のスパイダーインスタンス(インスタンス)を生成できます。制限はありません。名前はクモの最も重要な属性であり、必須です。

スパイダーが単一のドメインをクロールする場合、一般的な方法は、ドメインのスパイダーに名前を付けることです(サフィックスの有無にかかわらず)。たとえば、スパイダーがmywebsite.comをクロールする場合、スパイダーは通常mywebsiteという名前になります。

allowed_domains

オプション。スパイダーがクロールを許可するドメインのリストが含まれています。OwsiteMiddlewareが有効になっている場合、ドメイン名がリストにないURLはフォローされません。

start_urls

URLリスト。特定のURLが指定されていない場合、スパイダーはこのリストからクロールを開始します。したがって、取得される最初のページのURLはこのリストの1つになります。取得したデータから後続のURLが抽出されます。

start_requests()

このメソッドは、反復可能なオブジェクト(反復可能)を返す必要があります。このオブジェクトには、スパイダーがクロールに使用する最初のリクエストが含まれています。

このメソッドは、スパイダーがクロールを開始し、URLが指定されていない場合に呼び出されます。URLを指定すると、make_requests_from_url()が呼び出されてRequestオブジェクトが作成されます。このメソッドはScrapyによって1回だけ呼び出されるため、ジェネレーターとして実装できます。

このメソッドのデフォルトの実装は、start_urlsのURLを使用してリクエストを生成することです。

特定のWebサイトを最初にクロールしたRequestオブジェクトを変更する場合は、このメソッドをオーバーライドできます。たとえば、起動時にPOSTを使用してWebサイトにログインする必要がある場合は、次のように記述できます。

def start_requests(self): 
  return [scrapy.FormRequest("http://www.example.com/login",
                             formdata={'user': 'john', 'pass': 'secret'}, 
                             callback=self.logged_in)] 

def logged_in(self, response): 
## here you would extract links to follow and return Requests for 
## each of them, with another callback 
  pass

解析する

responseがコールバック関数を指定していない場合、このメソッドはダウンロードされた応答を処理するためのScrapyのデフォルトのメソッドです。

解析は、応答を処理し、処理されたデータやフォローアップ用のURLを返す責任があります。Spiderには、他のRequestコールバック関数にも同じ要件があります。

このメソッドおよびその他のRequestコールバック関数は、RequestまたはItem、あるいはその両方を含む反復可能なオブジェクトを返す必要があります。

パラメータ:応答-分析に使用される応答

休業(理由)

スパイダーが閉じられると、この関数が呼び出されます。

開始方法

start_urls

start_urlsはリストです

start_requests

start_requests()を使用してstart_urlsを書き換え、Request()メソッドを使用して自分でリクエストを送信します。

def start_requests(self): 
  """重写 start_urls 规则""" 
  yield scrapy.Request(url='http://quotes.toscrape.com/page/1/', callback=self.parse)

scarp.Request

scary.Requestはリクエストオブジェクトであり、作成時にコールバック関数を作成する必要があります。

データの保存

-oを使用して、データを一般的な形式で保存できます(サフィックス名に従って保存)

サポートされている形式は次のとおりです。

  • json
  • jsonlines
  • jl
  • csv
  • xml
  • 元帥
  • 漬物

ケース:スパイダーサンプル

例を見てみましょう:

## -*- coding: utf-8 -*- 
import scrapy 

class Quotes2Spider(scrapy.Spider): 
  name = 'quotes2' 
  allowed_domains = ['toscrape.com'] 
  start_urls = ['http://quotes.toscrape.com/page/2/'] 
  def parse(self, response): 
    quotes = response.css('.quote')
    for quote in quotes: 
      text = quote.css('.text::text').extract_first() 
      auth = quote.css('.author::text').extract_first() 
      tages = quote.css('.tags a::text').extract() 
      yield dict(text=text,auth=auth,tages=tages)

URLステッチ

import urllib.parse 
urllib.parse.urljoin('http://quotes.toscrape.com/', '/page/2/') 
Out[6]: 'http://quotes.toscrape.com/page/2/' 
urllib.parse.urljoin('http://quotes.toscrape.com/page/2/', '/page/3/') 
Out[7]: 'http://quotes.toscrape.com/page/3/'

おすすめ

転載: blog.csdn.net/m0_48405781/article/details/114581454