Pythonの注意事項:爬虫類のダウンローダミドルウェアの使用のScrapyフレームワーク

ミドルウェア機能のダウンローダ

Downloaderのミドルウェアの機能で非常に強いです。

  • あなたは、ユーザエージェントを変更することができます
  • リダイレクトの取り扱い
  • プロキシ設定
  • 失敗の再試行
  • クッキーおよびその他の設定

Downloaderのミドルウェアは、場所の全体的なアーキテクチャに役割を果たし、次の2つです。

  • で、私たちは要求を修正ダウンロードする前に実行することができ、ダウンロード、Doanloaderリクエストに送信される前に、キュー内のスケジューラのスケジューリング。
  • スパイダーに送信する前に生成されたレスポンスをダウンロードした後、あること、我々はあなたがResposneはスパイダーを解決する修正する前に生成することができます。

Scrapyビルトインダウンローダーミドルウェア

  • 失敗し、再試行、自動リダイレクトのミドルウェアの責任です:Scrapyではすでになど、多くのダウンローダミドルウェアを提供
  • これらはDOWNLOADER_MIDDLEWARES_BASE変数に定義されています。
  • 注:プロジェクトの構成を変更し、変更したい場合は、以下の設定はグローバル設定で、変更しないでください!
# 在python3.6/site-packages/scrapy/settings/default_settings.py默认配置中

DOWNLOADER_MIDDLEWARES_BASE = {
    # Engine side
    'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
    'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
    'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
    'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
    'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
    'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
    'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
    'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
    'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
    # Downloader side
}
  • 番号が優先される辞書形式、より小さな優先呼。

カスタムのダウンローダミドルウェアミドルウェア

私たちは、DOWNLOADER_MIDDLEWARESプロジェクトで設定されたのダウンローダミドルウェア独自のカスタム変数を追加することができます。3つのコアのメソッドを持っているのダウンローダミドルウェア:

1) process_request(request,spider)

  • :ミドルウェアをダウンロードすることにより、各要求は、メソッドが呼び出されるように、方法は、次の3つのいずれかを返す必要があることを要件はNone、リターンResponse对象、リターンRequest对象またはraise IgnoreRequest3つの戻り値への影響は異なっています。

  • None:Scrapyは、適切なハンドラのダウンロード(ダウンロードハンドラ)が呼び出されるまで、要求は(応答がダウンロードされている)が行われ、要求を処理するためのミドルウェア他の対応するメソッドの実行を継続します。

  • Response对象:Scrapyは他process一()またはにprocess_exception()メソッド、または対応するダウンロード機能を呼び出さないであろう、それは応答を返します。各応答が返されたときにインストールprocess_responseミドルウェア()メソッドが呼び出されます。

  • Request对象:Scrapy停止呼び出しprocess一方法と再スケジューリング要求が戻ります。新しい要求が相応に中間チェーンを返すために行われた場合、応答のダウンロードに応じて呼び出されます。

  • raise一个IgnoreRequest异常:ミドルウェアにprocess_exceptionがインストールダウンロード()メソッドが呼び出されます。例外を処理するために、誰の方法が存在しない場合は、エラーバックの要求(Request.errback)メソッドが呼び出されます。スローされた例外を処理するコードがない場合は、例外は無視され、記録されません。

2) process_response(request,response,spider)

  • process_response:戻り値は、次の3つの方法であるresponse对象request对象またはraise一个IgnoreRequest异常

  • 戻った場合Response(着信応答は同じであってもよいし、または新たなオブジェクトであってもよい)、response鎖中の他のミドルウェアであるprocess_response()アプローチ。

  • それが返された場合はRequest、オブジェクトを、要求を停止して返すようにミドルウェア・チェーンは再スケジュールされたダウンロードされます。処理は次のようにあるprocess_request()要求で行わリターン。

  • それがスローした場合IgnoreRequest例外が呼び出されますrequest的errback(Request.errback)

  • コードは、例外処理をスローしていない場合、例外が(他の異常とは異なるように)無視され、記録されていません。

  • ここでは、簡単な例は、上記のプロジェクトで、私たちは次のコードミドルウェアを追加し続けて記述します。

    def process_response(self, request, response, spider):
        response.status = 201
        return response
    

3) process_exception(request,exception,spider)

  • プロセッサ(ダウンロードハンドラ)をダウンロードしたりする場合process_request()(ダウンロードミドルウェア)が例外をスローした場合、Scrapyコールを(異常IgnoreRequestを含みます)process_exception()

  • process_exception()戻り値:これは3つのリターンであるNoneResponse 对象またはRequest 对象

  • それは返す場合None、Scrapyが例外を処理していきますし、他のミドルウェアインストール呼び出すprocess_exception()すべてが完成したミドルウェアが呼び出されるまで、メソッドを、デフォルトの例外ハンドラが呼び出されます。

  • それは返す場合Response 对象ミドルウェアチェーンがすでにインストールされているprocess_response()メソッドが呼び出されます。Scrapyは、他のミドルウェアを呼び出すことはありませんprocess_exception()アプローチを。

プロジェクトの実践

1)以下のようにコマンドがあり、新しいプロジェクトdoubanを作成します。

$ scrapy startproject douban

2)次のようにコマンドがあり、dbbookのためのスパイダーのクラス名を作成します。

$ cd douban
$scrapy genspider dbbook book.douban.com

爬虫類のコードを記述します。

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

class DbbookSpider(scrapy.Spider):
    name = 'dbbook'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/top250?start=0']

    def parse(self, response):
        #print("状态:")
        pass

3)コマンド爬虫類を実行し、エラーを排除

$ scrapy crawl dbbook#結果は、403エラー(サーバーアクセス拒否)を返しました。

分析:のUser-Agent値のデフォルト要求scrapyフレーム情報:Scrapy / 1.5.0(http://scrapy.org)。

解決策:設定USER_AGENTまたはDEFAULT_REQUEST_HEADERS情報:我々は、設定ファイルをのsettings.pyことができます。

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'

# 或
# ...
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
   'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
}
# ...

別の解決策があります:

middlewares.py見つかったファイルのDoubanDownloaderMiddleware種類、ここでprocess_request処理の方法は次の通りであります:

def process_request(self, request, spider):
    #输出header头信息
    print(request.headers)
    #伪装浏览器用户
    request.headers['user-agent']='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
    return None

4)Downloaderのミドルウェアミドルウェアを開きます

DOWNLOADER_MIDDLEWARES情報を設定するには:プロジェクトのsettings.py設定ファイルで

DOWNLOADER_MIDDLEWARES = {
    'douban.middlewares.DoubanDownloaderMiddleware': 543,
}

コードアドレスを見るにはここをクリック

公開された369元の記事 ウォンの賞賛169 ビュー660 000 +

おすすめ

転載: blog.csdn.net/Tyro_java/article/details/103933163