【Pythonクローラー】 14. Scrapyフレームワーク解説

序文

最初の 2 つのレベルでは、クローラーの速度を向上させるコルーチンの高度な知識を学び、実践的なプロジェクトの運用を通じて、コルーチンを適用して Mint.com の食品データをクロールしました。

おそらく、クローラー プロジェクトの開発プロセス全体を経験すると、次のように感じるでしょう。完全なクローラー プログラムを完成させるには、非常に多くの些細な作業が必要であることがわかりました。

たとえば、さまざまな機能を持つモジュールをインポートし、さまざまなクローリング プロセス用のコードを記述する必要があります。そしてプロジェクトによっては毎回記述するコードも異なります。

次のような考えをお持ちではないでしょうか。PPT テンプレートと同じように適用できる既製のクローラー テンプレートはあるのでしょうか? クローラーのプロセス全体を担当する必要はなく、クローラーのコア ロジック コードを埋めることのみを担当する必要があります。これがあれば、コードを書くのに非常に便利で手間がかかりません。

実はPythonにもこのようなクローラテンプレートが存在するのですが、その名前はフレームワークというものです。

クローラー フレームワークには、最初からテーマの色とレイアウトを設定するのに役立つ PPT テンプレートと同様に、クローラー プロセス全体を実現できるさまざまなモジュールが含まれています。

このレベルで学ぶ必要があるのは、強力なクローラー フレームワークである Scrapy です。

スクレイピーとは

以前は、クローラーを作成するときは、request モジュール、gevent ライブラリ、csv モジュールなどのさまざまなモジュールをインポートして操作する必要がありました。Scrapy では、面倒な非同期など、クローラーが関与する必要がある多くの機能が Scrapy フレームワークに自動的に実装されるため、これを行う必要はありません。

クローラーの作成方法は、部品を 1 つずつつなぎ合わせて走行する車を構築するのと同じでした。Scrapyフレームワークはすでに組み立てられた既製品で、アクセルを踏むだけで走り出します。これにより、プロジェクトの開発時間が節約されます。

ここに画像の説明を挿入します
次に、Scrapy の構造や仕組みなど、Scrapy の基本について学びましょう。

スクレイピーの構造

ここに画像の説明を挿入します
上の写真はScrapyの全体構造です。Scrapy フレームワーク全体をクローラー会社として考えることができます。最も中心的な Scrapy Engine はこのクローラー会社のボスであり、会社の 4 つの主要部門の調整を担当しており、各部門はその命令に従い、それに報告するだけです。

Scrapy クローラー会社の 4 つの主要な部門をクローラーのプロセスの順序で紹介します。

スケジューラー (スケジューラー) 部門は主に、エンジンによって送信されたリクエスト オブジェクトの処理 (つまり、パラメーター、データ、Cookie、リクエスト ヘッダーなどを含む Web ページ リクエストの関連情報の収集) と、要求された URL を順番にキューに入れ、エンジンが抽出するのを待ちます (機能的には gevent ライブラリのキュー モジュールと同様です)。

ダウンローダー部門は、エンジンによって送信されたリクエストを処理し、Web ページをクロールし、返された応答 (クロールされたコンテンツ) をエンジンに渡す責任を負います。クローラー処理の「データ取得」ステップに相当します。

スパイダー (クローラー) 部門は会社の中核となるビジネス部門で、主なタスクはリクエスト オブジェクトを作成し、エンジンから送信された応答 (ダウンローダー部門によってクロールされたコンテンツ) を受け取り、そこから有用なデータを解析して抽出することです。クローラーの処理の「データの解析」と「データの抽出」の2つのステップに相当します。

アイテム パイプライン (データ パイプライン) 部門は会社のデータ部門であり、スパイダー部門によって抽出された有用なデータの保存と処理のみを担当します。これは、クローラ プロセスの [ストレージ データ] ステップに対応します。

ダウンローダーミドルウェアは、ダウンローダー部門の秘書に相当する仕事で、例えばエンジン上司から事前に送られてくる多くのリクエストを処理します。

Spider Middlewares の仕事は、クローラー部門の秘書に相当し、たとえば、エンジンのボスから送信された応答を事前に受信して処理し、繰り返しや無駄なものをフィルタリングします。

ここに画像の説明を挿入します

スクレイピーの仕組み

Scrapy クローラー会社では、各部門が独自の業務を実行し、非常に効率的な業務プロセスを形成していることがわかります。

この実行プロセスのロジックは非常に単純です。つまり、エンジンのボスが最も要求するものは何かということです。

ここに画像の説明を挿入します
上の図は、Scrapy フレームワークの動作原理も示しています。エンジンが中心で、他のコンポーネントはエンジンによってスケジュールされます。

Scrapy では、クローラー プログラムのプロセス全体を気にする必要はなく、Scrapy のすべてのプログラムは非同期モードであり、すべてのリクエストまたは返された応答はエンジンによって自動的に割り当てられ、処理されます。

特定のリクエストで例外が発生した場合でも、プログラムは例外を処理し、エラー報告リクエストをスキップしてプログラムの実行を継続します。

ある意味、Scrapy は非常に安心なクローラー フレームワークであると言えます。

スクレイピーの使い方

これで、Scrapy の構造と動作原理について予備的に理解できました。次に、Scrapy の使用方法に慣れるために、Scrapy を使用して小さなプロジェクト (Douban トップ 250 の書籍をクロールする) を完了します。

ここに画像の説明を挿入します

目標と分析プロセスを明確にする

コードを記述するには、目標を明確にし、プロセスを分析し、コードを実装してプロジェクトを完了するという 3 つの手順に従います。コード実装ステップにおける Scrapy の使用法に焦点を当てます。

まず、目標が明確でなければなりません。Douban のトップ 250 書籍への次のリンクを必ず開いてください。

https://book.douban.com/top250

Douban Top250 ブックには合計 10 ページがあり、各ページには 25 冊のブックが含まれています。私たちの目標は、まず本の最初の 3 ページの情報のみをクロールすることです。つまり、最初の 75 冊の本の情報 (本のタイトル、出版情報、本の評価を含む) をクロールします。

次に、Web ページを分析しましょう。書籍情報をクロールしたいので、まず情報が保存されている場所を特定する必要があります。

判断の方法はあなたにとって明確でなければなりません。すばやく右クリックして「検査」ツールを開き、「ネットワーク」をクリックしてページを更新し、0 番目のリクエスト top250 をクリックして応答を確認します。

この中に本のタイトルと出版情報が表示されます。つまり、必要な本の情報がこの URL の HTML の中に隠されているということになります。

ここに画像の説明を挿入します
この URL の HTML に書籍情報が存在することを確認したら、この Web サイトを詳しく見てみましょう。

クリックすると、Douban のトップ 250 書籍の 2 ページ目が表示されます。

ここに画像の説明を挿入します
URL が変更され、最後に ?start=25 が付いていることがわかります。後者の数字は、1 ページあたり 25 冊の本を表すと推測されます。

3 ページを開いて、私たちの推測が正しいかどうかを確認してください。

ここに画像の説明を挿入します
私たちが正しかったことが分かりました。ページをめくるたびに、URL の後の数字が 25 ずつ増加し、開始パラメータが 1 ページあたり 25 冊の本を表すことを示します。

このように観察すると、クロールしたい URL の構造規則がわかります。?start= 以降の数字を変更(ページをめくって 25 を追加)するだけで、各ページの URL を取得できます。

URL の構造がわかったので、次は HTML の構造の分析に集中して、必要な書籍情報を抽出する方法を確認します。

さらに、右クリックして [検査] ツールを開き、[要素] をクリックしてカーソルをクリックし、書籍のタイトル、出版情報、および評価にマウスを移動して、これらの書籍情報を HTML で検索します。下の写真のように、『カイト・ランナー』の書籍情報がすべて<table width="100%">ラベルに記載されています。

ここに画像の説明を挿入します

すぐに、各ページにある 25 冊の書籍情報が実際にはラベルの中に隠されていることがわかります<table width="100%">ただし、このタグには class 属性や id 属性がないため、情報を抽出するのが不便です。

ここに画像の説明を挿入します
抽出しやすく、すべての書籍情報を含めることができる別のタグを見つける必要があります。

<table width="100%">タグの下の要素は<tr class="item">要件を満たしており、クラス属性と書籍情報の両方を持っています。

<tr class="item">要素配下にある要素<a>のtitle属性のvalue、<p class="pl">要素と要素を取り出せば<span class="rating_nums">、書籍名、出版情報、評価データが取得できます。

ここに画像の説明を挿入します
ページ分析が完了したら、コード実装のステップに入ります。

コードの実装 - プロジェクトの作成

ここからは、Scrapy を使用してプロジェクト クローラーを作成する手順を説明します。Scrapy の使用法が多く含まれるので、よく読んでください。

ローカルコンピュータで Scrapy を使用したい場合は、事前にインストールする必要があります。(インストール方法: Windows: ターミナルにコマンドを入力: pip install Scrapy、Mac: ターミナルにコマンドを入力: pip3 install Scrapy、Enter キーを押します)

まず、ローカル コンピューターでターミナルを開き (Windows: Win+R、cmd と入力、Mac: command+space、「ターミナル」を検索)、プロジェクトを保存するディレクトリにジャンプします。

E ドライブの Python フォルダー内の Pythoncode サブフォルダーにジャンプするとします。コマンド ラインで e: と入力して e ドライブにジャンプし、次に cd Python と入力して Python フォルダーにジャンプする必要があります。次に、「cd Pythoncode」と入力して、Python フォルダー内の Pythoncode サブフォルダーにジャンプします。

次に、Scrapy プロジェクトの作成に役立つ別のコマンド行を入力します。scrapy startproject douban、douban は Scrapy プロジェクトの名前です。Enter キーを押すと、Scrapy プロジェクトが正常に作成されます。

ここに画像の説明を挿入します

Scrapy プロジェクト全体の構造は以下のとおりです。

ここに画像の説明を挿入します
Scrapy プロジェクト内の各ファイルには特定の機能があり、たとえば settings.py は Scrapy のさまざまな設定です。items.pyはデータの定義に使用され、pipelines.pyはデータの処理に使用され、Scrapyの構造におけるItem Pipeline(データパイプライン)に相当します。

今は理解できないかもしれませんが、大丈夫、少しずつ明らかになっていきます。それらを説明しましょう。

コードの実装 - クローラーの編集

前述したように、spiders はクローラーが配置されるディレクトリです。Spiders フォルダーにクローラー ファイルを作成できます。このファイルに「top250」という名前を付けます。次のコードのほとんどは、この top250.py ファイルに記述する必要があります。

ここに画像の説明を挿入します
まず、必要なモジュールを top250.py ファイルにインポートします。

import scrapy
import bs4

BeautifulSoup のインポートはデータの解析と抽出に使用されますが、これについてはこれ以上説明する必要はありません。レベル 2 とレベル 3 に到達する頃には、すでにその内容に精通していることになります。

Scrapy をインポートするということは、後でこのクローラーをクラスを作成して作成することを意味し、作成したクラスは、Scrapy のscrapy.Spider クラスを直接継承します。このように、直接使用できる便利なプロパティとメソッドが多数あります。

次に、クローラーのコア コードを書き始めました。

Scrapy では、各クローラーのコード構造は基本的に次のとおりです。

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/top250?start=0']
    
    def parse(self, response):
        print(response.text)

コードの 1 行目: クローラー クラス DoubanSpider を定義します。先ほど述べたように、DoubanSpider クラスは、scrapy.Spider クラスを継承します。

コードの 2 行目: name は、クローラーを定義する名前です。この名前は、クローラーの一意の識別子です。name = 'douban' は、クローラーの名前を douban として定義することを意味します。後でクローラーを開始するときにこの名前を使用します。

コードの 3 行目: allowed_domains は、クローラーによるクロールを許可する URL ドメイン名を定義します (https:// を追加する必要はありません)。URL のドメイン名がこのリストにない場合は、フィルターで除外されます。

なぜこの設定があるのでしょうか? 大量のデータをクロールする場合、多くの場合、URL からクロールを開始し、それに関連するさらに多くの Web ページをクロールします。たとえば、今日のクローラーの目標は書籍情報をクロールすることではなく、Douban Books の上位 250 件の書評をクロールすることだとします。まず書籍リストをクロールし、次に各書籍の URL を見つけて、各書籍の詳細ページに入ってコメントをクロールします。

許可されたドメインは制限されており、当協会がクロールする URL は book.douban.com というドメイン名の下にある必要があり、奇妙な広告ページにジャンプすることはありません。

コードの 4 行目: start_urls は、クローラーがクロールを開始する URL である開始 URL を定義します。ここで、allowed_domains の設定は start_urls の URL には影響しません。

コードの 6 行目: parse は Scrapy で応答を処理するためのデフォルトのメソッドであり、中国語は解析しています。

気になるかもしれませんが、requests.get() のようなコード行がここに欠落していませんか? 確かに、ここではこの文を書く必要はありません。Scrapy フレームワークがこれを行います。リクエストを書いた後、レスポンスの処理方法を直接書くことができます。後で例を示します。

クローラー コードの基本構造を理解した後、Douban Top ブックをクロールするコードの改善を続けます。

ここに画像の説明を挿入します
Douban トップ 250 ブックには 10 ページがあり、各ページの URL は誰もが知っています。10 ページすべての URL を start_url のリストに詰め込むことを選択できます。

しかし、この方法は美しくありません。数百の URL をクロールして、それらをすべて start_urls リストに詰め込みたい場合、コードは非常に長くなります。

実際、Douban のトップ 250 書籍の URL ルールを使用して、for ループで各 URL を構築し、その URL を start_urls のリストに追加できます。この方法でコードの見栄えが大幅に向上します。

ここに画像の説明を挿入します
改良されたコードは次のとおりです。

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['book.douban.com']
    start_urls = []
    for x in range(3):
        url = 'https://book.douban.com/top250?start=' + str(x * 25)
        start_urls.append(url)

Douban トップ 250 の書籍情報の最初の 3 ページのみをクロールします。

あとはparseメソッドでレスポンスを処理し、BeautifulSoupを使って欲しい書籍情報のデータを抽出するだけでコードが完成します。

以前にプロジェクト プロセスを分析したときに、書籍情報がどの要素に隠されているかはすでにわかっていました。ここで、find_all メソッドと find メソッドを使用して書籍情報を抽出できるようになりました。たとえば、本のタイトルは要素の下にある要素の title 属性の値であり、出版情報は

要素内にあり、スコアは要素内にあります。

過去の知識に基づいて、次のようなコードを書くとよいでしょう。

import scrapy
import bs4
from ..items import DoubanItem

class DoubanSpider(scrapy.Spider):
#定义一个爬虫类DoubanSpider。
    name = 'douban'
    #定义爬虫的名字为douban。
    allowed_domains = ['book.douban.com']
    #定义爬虫爬取网址的域名。
    start_urls = []
    #定义起始网址。
    for x in range(3):
        url = 'https://book.douban.com/top250?start=' + str(x * 25)
        start_urls.append(url)
        #把豆瓣Top250图书的前3页网址添加进start_urls。

    def parse(self, response):
    #parse是默认处理response的方法。
        bs = bs4.BeautifulSoup(response.text,'html.parser')
        #用BeautifulSoup解析response。
        datas = bs.find_all('tr',class_="item")
        #用find_all提取<tr class="item">元素,这个元素里含有书籍信息。
        for data in  datas:
        #遍历datas。
            title = data.find_all('a')[1]['title']
            #提取出书名。
            publish = data.find('p',class_='pl').text
            #提取出出版信息。
            score = data.find('span',class_='rating_nums').text
            #提取出评分。
            print([title,publish,score])
            #打印上述信息。
            

以前は、本のタイトル、出版情報、評価に個別に値を割り当て、印刷または保存のいずれかでそれらを均一に処理していました。しかし、ここscrapyでは事情が違います。

スパイダー (top250.py など) は、スパイダーが行うべきことだけを行います。別の担当者がその後のデータ処理を担当します。

コードの実装 - データの定義

Scrapyでは、データを記録するためのクラスを具体的に定義します。

データを記録するたびに、たとえば最小ループごとに、「書籍名」、「出版情報」、「評価」を記録する必要があります。オブジェクトをインスタンス化し、このオブジェクトを使用してデータを記録します。

データの記録が完了するたびに、データはスパイダーを出て Scrapy エンジンに来て、処理のためにアイテム パイプラインに送信されます。

このクラスを定義する py ファイルは items.py です。

クロールするデータが書籍のタイトル、出版情報、評価であることはすでにわかっています。これらのデータを items.py で定義する方法を見てみましょう。コードは以下のように表示されます。

import scrapy
#导入scrapy
class DoubanItem(scrapy.Item):
#定义一个类DoubanItem,它继承自scrapy.Item
    title = scrapy.Field()
    #定义书名的数据属性
    publish = scrapy.Field()
    #定义出版信息的数据属性
    score = scrapy.Field()
    #定义评分的数据属性

コードの最初の行では、scrapy をインポートしました。その目的は、これから作成するクラスがscrapyのscrapy.Itemクラスを直接継承することです。このように、直接使用できる便利なプロパティとメソッドが多数あります。たとえば、後でエンジンは、処理のために項目クラス オブジェクトを項目パイプライン (データ パイプライン) に送信できます。

コードの 3 行目: DoubanItem クラスを定義します。これはscrapy.Itemクラスを継承しています。

コードの 5、7、9 行目: 書籍のタイトル、出版情報、評価の 3 種類のデータを定義します。このコード行scrapy.Field() は、データを辞書のような形式で記録できるようにします。この文の意味がよく分からないかもしれませんが、大丈夫です。それがどのようなものかを感じていただくために、あなたを体験させてください。

import scrapy
#导入scrapy
class DoubanItem(scrapy.Item):
#定义一个类DoubanItem,它继承自scrapy.Item
    title = scrapy.Field()
    #定义书名的数据属性
    publish = scrapy.Field()
    #定义出版信息的数据属性
    score = scrapy.Field()
    #定义评分的数据属性

book = DoubanItem()
# 实例化一个DoubanItem对象
book['title'] = '海边的卡夫卡'
book['publish'] = '[日] 村上春树 / 林少华 / 上海译文出版社 / 2003'
book['score'] = '8.1'
print(book)
print(type(book))

操作結果:

{
    
    'publish': '[日] 村上春树 / 林少华 / 上海译文出版社 / 2003',
 'score': '8.1',
 'title': '海边的卡夫卡'}
<class '__main__.DoubanItem'>

印刷結果は実際に辞書に非常に似ていることがわかりますが、辞書ではなく、そのデータ型は定義した DoubanItem であり、「カスタム Python 辞書」です。上記のコードと同様のスタイルを使用して、top250.py を書き換えることができます。次のように:

import scrapy
import bs4
from ..items import DoubanItem
# 需要引用DoubanItem,它在items里面。因为是items在top250.py的上一级目录,所以要用..items,这是一个固定用法。

class DoubanSpider(scrapy.Spider):
#定义一个爬虫类DoubanSpider。
    name = 'douban'
    #定义爬虫的名字为douban。
    allowed_domains = ['book.douban.com']
    #定义爬虫爬取网址的域名。
    start_urls = []
    #定义起始网址。
    for x in range(3):
        url = 'https://book.douban.com/top250?start=' + str(x * 25)
        start_urls.append(url)
        #把豆瓣Top250图书的前3页网址添加进start_urls。

    def parse(self, response):
    #parse是默认处理response的方法。
        bs = bs4.BeautifulSoup(response.text,'html.parser')
        #用BeautifulSoup解析response。
        datas = bs.find_all('tr',class_="item")
        #用find_all提取<tr class="item">元素,这个元素里含有书籍信息。
        for data in  datas:
        #遍历data。
            item = DoubanItem()
            #实例化DoubanItem这个类。
            item['title'] = data.find_all('a')[1]['title']
            #提取出书名,并把这个数据放回DoubanItem类的title属性里。
            item['publish'] = data.find('p',class_='pl').text
            #提取出出版信息,并把这个数据放回DoubanItem类的publish里。
            item['score'] = data.find('span',class_='rating_nums').text
            #提取出评分,并把这个数据放回DoubanItem类的score属性里。
            print(item['title'])
            #打印书名。
            yield item
            #yield item是把获得的item传递给引擎。

3 行目では、項目内にある DoubanItem を参照する必要があります。item は top250.py の上位ディレクトリにあるため、...items を使用する必要があります。これは固定の使用法です。

データを記録するたびに、たとえば最小ループごとに、「書籍名」、「出版情報」、「評価」を記録する必要があります。item オブジェクトをインスタンス化し、このオブジェクトを使用してデータを記録します。

データの記録が完了するたびに、データはスパイダーを出て Scrapy エンジンに来て、処理のためにアイテム パイプラインに送信されます。ここでは、yield ステートメントが使用されます。

yield ステートメントについてはあまりご存じないかもしれませんが、ここでは単純に「return と似ていますが、return との違いは、関数を終了せず、情報を複数回返すことができることです。」と理解してください。

ここに画像の説明を挿入します
プログラムの実行プロセスを視覚的な方法で表現すると、上の図のようになります。クローラー (スパイダー) が Douban の 10 個の URL をリクエスト オブジェクトにカプセル化し、エンジンがそのリクエスト オブジェクトをリクエスト オブジェクトから抽出します。クローラー (スパイダー) にそれらを渡し、それをスケジューラー (Scheduler) に渡し、スケジューラーにこれらのリクエスト オブジェクトを分類して処理させます。

その後、エンジンはスケジューラーで処理されたリクエスト オブジェクトをダウンローダーに送信し、ダウンローダーはエンジンのコマンドに従って直ちにクロールし、エンジンに応答を返します。

その後、エンジンは応答をクローラー (スパイダー) に送り返します。このとき、クローラーは応答を処理するためのデフォルトの解析メソッドを開始し、書籍情報のデータを解析して抽出し、アイテムを使用して記録し、エンジンに戻します。エンジンはそれを処理のためにアイテム パイプライン (データ パイプライン) に送信します。

コードの練習 - 設定

この時点で、コードでクローラーを作成しました。ただし、実際の操作では、依然としてエラーが報告される場合があります。

その理由は、Scrapy のデフォルト設定が変更されていないためです。たとえば、リクエスト ヘッダーを変更する必要があります。settings.py ファイルをクリックすると、その中に次のデフォルト設定コードが見つかります。

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'douban (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

USER _AGENT のコメントを解除して (# を削除)、user-agent の内容を置き換えてください。これは、リクエスト ヘッダーを変更することを意味します。

また、Scrapy はロボット プロトコルに準拠しているため、ロボット プロトコルでクロールが禁止されているコンテンツの場合、Scrapy はデフォルトでクロールしないため、Scrapy のデフォルト設定を変更する必要があります。

ROBOTSTXT_OBEY=True を ROBOTSTXT_OBEY=False に変更すると、ロボット プロトコルへの準拠が置き換えられ、ロボット プロトコルに準拠する必要がなくなり、Scrapy が制限なく実行できるようになります。

変更されたコードは次のようになります。

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

これで、スパイダーを作成し、設定を変更しました。すべての準備が整いました。あとは Scrapy を実行するだけです。

コードの練習 - 実行

Scrapy を実行するには 2 つの方法があり、1 つは、ローカル コンピューターのターミナルで Scrapy プロジェクトのフォルダーにジャンプし (ジャンプ方法: cd + フォルダーのパス名)、コマンド ラインを入力します:scrapy roll douban (豆瓣は私たち爬虫類の名前です)。

ここに画像の説明を挿入します
別の実行方法では、最も外側の大きなフォルダー (scrapy.cfg と同じレベル) に新しい main.py ファイルを作成する必要があります。

ここに画像の説明を挿入します

main.py ファイルに次のコードを入力し、「実行」をクリックするだけで、Scrapy プログラムが起動します。

from scrapy import cmdline
#导入cmdline模块,可以实现控制终端命令行。
cmdline.execute(['scrapy','crawl','douban'])
#用execute()方法,输入运行scrapy的命令。

コードの行 1: Scrapy には、ターミナル コマンドを制御できるモジュール cmdline があります。このモジュールをインポートすると、端末を制御できるようになります。

コードの 3 行目: cmdline モジュールには、ターミナルのコマンド ラインを実行できる実行メソッドがありますが、このメソッドはリストのパラメーターを渡す必要があります。Scrapy、スクレイピー クロール douban を実行するコードを入力したい場合は、['scrapy', 'crawl', 'douban'] のように記述する必要があります。

この時点で、Scrapy の使用方法の学習は終了です。

このレベルでは、教育と理解を容易にするために、最初にクローラーが作成され、次にデータが定義されることに注意してください。ただし、実際のプロジェクトの実装では、順序が逆になることが多く、最初にデータを定義してからクローラを作成します。したがって、フローチャートは次のようになります。

ここに画像の説明を挿入します
注意していれば、このレベルの内容にはデータを保存する手順が含まれていないことがわかるでしょう。

はい、データを保存するには、pipelines.py ファイルを変更する必要があります。このレベルの内容はすでに非常に充実しているため、この知識ポイントは次のレベルに譲ります。

レビュー

最後に、このレベルの重要な知識の復習です。

Scrapyの構造——

ここに画像の説明を挿入します
Scrapyの仕組み——

ここに画像の説明を挿入します
Scrapyの使い方——

ここに画像の説明を挿入します
次のレベルでは、Scrapy を使用して、人気企業の採用情報をクロールするという大きなプロジェクトを実行します。

夏関でお会いしましょう~

おすすめ

転載: blog.csdn.net/qq_41308872/article/details/132665268