-
scrapy 5つのコアコンポーネントの紹介
-
エンジン(Scrapy)
-
全体のデータストリーム処理システムを処理するため、トランザクション(フレームワークコア)トリガ
-
-
スケジューラ(スケジューラ)
- エンジンは、要求を受け入れるキューに押され、URLとしてエンジンの要求は考えることができるときに再び戻る(またはページのクロールURLはリンクです)、それは次の決定する必要があるプライオリティキュー、ために私を送りましたクロールにどのような重複したURLを除去しながらというのURL
-
ダウンローダー(ダウンローダー)
- クモに戻ったWebコンテンツやWebコンテンツをダウンロードするための(Scrapyのダウンローダがねじれ、この効果的な非同期モデルに基づいています)
-
爬虫類(スパイダー)
- 爬虫類は、主な仕事は、彼らが特定のWebページ、いわゆる実体(項目)から必要な情報を抽出するために使用されています。また、ユーザーはScrapyは、次のページにクロールを継続させる、リンクを抽出することができます
-
プロジェクトのパイプライン(パイプライン)
-
ウェブエンティティから引き出された爬虫類の処理を担当、主な機能は、エンティティの有効性を検証するために、永続的なエンティティであり、不要な情報を削除します。ページはクローラを解析されるとき、パイプは、プロジェクトに送られ、データを処理するいくつかの特定の順序の後になります
-
-
クロール局データ
ほとんどのサイトが表示される操作をページングデータは、その後、ページデータを、対応するすべてのページ番号は、爬虫類のクロールで全体の局データをクロールされ、実施されます。
Scrapyはどのように完全な局データ、それに基づいてクロール?
手動による方法を使用して要求開始要求。
要件:embarrassments百科事典著者のすべてのページとカット永続ストレージをクロールするコンテンツデータ
クモのファイル:
クラスQiubaiSpider(scrapy.Spider): 名 = 「Qiubai 」 #のアプリケーション名(一意の識別子) #(ドメインが非URLがデータをクロールされていない遭遇した場合)ドメインをクロールできるように allowed_domains = [ " HTTPS:// www.qiushibaike.com/ ' ] #のURLがクロール開始 start_urlsを= [ ' https://www.qiushibaike.com/text " ] #複数のページをクロール PAGENUM。= 1 #をページの開始 #のテンプレートのURLでシステムを(不変) URL = ' https://www.qiushibaike.com/text/page/%s/ ' #ページのURLのあたり #アクセス開始URLとコールバック関数は、結果を取得し、応答が初期送信要求のパラメータの関数であるURLへの応答オブジェクトを取得。関数が値必見の反復可能オブジェクトを返すか、NULL DEF パース(セルフ、応答) : #の印刷(response.textは)#レスポンスのコンテンツタイプ文字列のフェッチ #の名前と内容を取得 #を取得した印刷を(response.body)#各コンテンツタイプバイト #の応答のためのXPath方法は、発現のXPathすることができこれは、関数に直接作用する odiv response.xpath =(' // DIV / DIV [クラス"col1のオールドスタイルのCOL1" = @] ' ) #の印刷(LEN(odiv)) CONTENT_LIST = [] #構文解析された格納するためのデータ 用 div_item でodiv: #データのXPath関数リストは、リストは、データのリターンセレクタタイプに保存されています。 #当社は、コンテンツがセレクタオブジェクトにカプセル化され、抽出液を呼び出す()関数は、コンテンツがSelecorから削除された解析し解決しました。 = div_item.xpath作者(' .// DIV / A [2] / H2 /テキスト()[1] | .// DIV /スパン/ H2 /テキスト()[1] ' )[0] .extract() コンテンツ = div_item.xpath(' .//のdiv [@クラス= "コンテンツ"] /スパン/テキスト()' ).extract() コンテンツ = '' (コンテンツ).join #文字列にリスト #印刷インプレッションクロールデータ取る #の印刷(作者、内容) #の印刷(コンテンツ) 著者= author.strip(' \ N- ') #フィルタの空白行 (内容= content.stripを「\ N- 」) 位商品対象にデータパッケージを構文解析 アイテム= FirstbloodItem() 項目[ 「作成者」 ] = 著者 項目[ 「コンテンツ」 ] = コンテンツ プリント(著者) 収率アイテム #1 (導管の提出にアイテムpipelines.py) #すべてのデータ・ページ・クロール 印刷(' PAGENUM = {} ' .format(self.pageNum)) IF self.pageNum <5: #の合計が13(13のクロール) 。self.pageNum + 1 = NEW_URL =フォーマット(self.url%self.pageNum) プリント(NEW_URL) #再帰データクロール:コールバックコールバックパラメータ値(リクエストURLの後に、得られた対応データをパースパースを継続)、再帰呼び出しの解析関数 位要求がフィルタリングされないように、scrapy.Requestに()関数は、dont_filterます= Trueに真のパラメータセット: 収量 scrapy.http.Request(URL = NEW_URL、コールバック= self.parse、dont_filter =真)
items.pyファイル
輸入scrapyの クラスFirstbloodItem(scrapy.Item): #はここのようなあなたの項目のフィールドを定義します 。#の名前= scrapy.Field() 作者= scrapy.Field() コンテンツ = (scrapy.Field)を パス
パイプラインファイル
インポートpymysqlの クラスFirstbloodPipeline(オブジェクト): #のコンストラクタ DEF __init__ (セルフ): self.fp =なし #は、記述子属性を定義 #親クラスを書き換える処理であり、次の: #開始爬虫類は一度行っ DEF open_spider (自己、スパイダー): 印刷(' クローラが開始' ) self.fp(=オープン' ./data.txt '、' W '、=エンコーディング'UTF-8 ' ) #の取引、具体的対象項目# このメソッドが繰り返し呼び出さ実行されるため、他の二つに書き込まれたファイルのオープンとクローズの操作は、それぞれの方法を実行します。 DEF process_item(セルフ、アイテム、スパイダー): 著者 =項目[ ' 作成者' ] コンテンツ =項目[ ' コンテンツ' ] 目次 = ' {}:{} \ N- \ N- ' .format(著者、コンテンツ) self.fp.書き込み(内容) 戻り項目 #次のクラスに渡されたが、ダクトに実行される DEFのclose_spider(セルフ、スパイダー): 印刷(「エンドクローラ」) self.fp.close() #パイプクラスファイルに対応する導管が話していますプラットフォーム・データ・ストレージへ #アイテム提出クローラは、配管内の第一の導管受け付けたクラスファイルが実行される #1 process_itemをリターン項目がパイプライン実行されるべき次の項目に送信される表す #のデータベースに格納されたデータ クラスmysqlPipeline(オブジェクト): #コンストラクタ デフ __init__ (セルフ): self.conn =なし #は記述属性を定義 self.cursorを= なし self.num = 0 #以下は、親クラスを書き換える処理である: #開始爬虫類は一度行っ デフopen_spider(自己、スパイダー): self.conn = pymysql.Connect(=ホスト' 192.168.31.xx '、= 3306ポート、=ユーザー' ルート'、パスワード= 「111 」、DB = 「XXXの_db 」、文字セット= 「UTF8 」) を印刷(「クローラデータベーススタート」) #1 、具体的項目の目標契約を #のメソッドが呼び出されるので、複数回、開閉ファイルを実行されます他の二つのライト動作は、それぞれの方法を実行します。 DEF process_item(セルフ、アイテム、スパイダー): 著者 =項目[ ' 著者' ] コンテンツ =項目[ ' 内容' ] self.cursor = self.conn.cursor() のtry : self.cursor.execute(' qiubai値(%S、%S)への挿入' 、(著者、コンテンツ)) self.conn.commit() 以外例外Eとして: プリント(E) self.conn.rollback() リターンアイテム デフclose_spider(自己、クモ): プリント(' 爬虫数据库结束' ) self.cursor.close() self.conn.close()
セッティング
= USER_AGENT ' のMozilla / 5.0(Macintosh版、インテルのMac OS X-10_12_0)のAppleWebKit / 537.36(ヤモリのようにKHTML、)クローム/ 68.0.3440.106サファリ/ 537.36 ' #は、キャリア要求の身元偽装 #オベイrobots.txtのルール #ROBOTSTXT_OBEY = Trueの ROBOTSTXT_OBEYを=偽 #プロトコルのロボットと無視できるまたは非準拠 #の表示ログ情報の唯一の指定されたタイプ 、LOG_LEVEL、= 「ERROR 」 #Scrapyによって実行される設定の最大同時要求(デフォルト:16) #CONCURRENT_REQUESTS = 32 #の構成パイプラインアイテム #はHTTPSを参照してください:// DOC .scrapy.org / EN /最新/トピックス/アイテムpipeline.html ITEM_PIPELINES = { ' FirstBlood.pipelines.FirstbloodPipeline ' 300 、 ' firstBlood.pipelines.mysqlPipeline ':320 、 #300が高い小さい、優先度を示します }