ミドルウェアは、コアコンセプトScrapyの内部にあります。ミドルウェアは、爬虫類、要求の前またはデータを変更する要求を開始し、その後、クローラの開発にカスタマイズされたリターンはさまざまな状況に適応することができます。
「ミドルウェア」と中国名は、前のセクション「仲介」に一つだけの単語を述べました。彼らは確かに非常に似てません。ミドルウェアや仲介は、途中でデータをハイジャックいくつかの変更を行い、その後、データを渡すことができます。違いは、能動部品と受動中間のリストに追加ミドルウェア開発者は、通常、悪意を持ったリンクのリストに追加することです。ミドルウェアは、主に開発を支援するために使用されるが、多くの仲介やデータ、さらには偽造攻撃を盗むために使用されたされています。
ミドルウェアの2種類がScrapyにあります。ダウンロードミドルウェア(ダウンローダーミドルウェア)と爬虫類は(スパイダーミドルウェア)をミドルウェア。
これは、ミドルウェアの最初の部分を中心ダウンローダです。
ダウンロードミドルウェア
Scrapy公式文書、ダウンロードされたミドルウェアの解釈次のように。
要求/応答フレームフック処理の間Scrapyミドルウェアダウンローダ、グローバル軽量Scrapy要求と基礎となるシステムの応答を変更するために使用されます。
このプレゼンテーションでは、非常に回旋に見えるが、簡単で、実際に表現の言葉を理解することです:のUser-Agent、自動再試行を置き換え、クッキーを交換、代理店のIPを交換してください。
何ミドルウェアが存在しない場合、図に示すように、爬虫類が流れます。
以下に示すようにミドルウェアを使用した後、爬虫類が流れます。
ミドルウェア開発機関
爬虫類の開発では、プロキシIPを交換することは非常に一般的な状況で、時には各訪問は、ランダムにプロキシIPを選択する必要があります。
ミドルウェア自体はPythonのクラスで、最初はこのクラスを「合格」、それは私たちがダイナミックな変化のエージェントを実現することができるようにすることを、代理店に新しいIPにあなたが長い爬虫類前にサイトを訪問するたびに取得するための要求を与えるされています。
Scrapyは、プロジェクトを作成した後、以下に示すように、このプロジェクトは、開封後のフォルダmiddlewares.pyファイル、その内容を持っています。
このmiddlewares.pyためScrapy自動的に生成されたファイル名は、名前の後ろに、ミドルウェアの数を置くことができ、この記述ファイルを複雑に表しています。Scrapyは自動的にこのミドルウェアは、このタイプの第三の記事で、ミドルウェア爬虫類で作成について説明します。今、プロキシIPミドルウェアを変更自動的に来る最初に作成します。
middlewares.pyに次のコードを追加します。
class ProxyMiddleware(object):
def process_request(self, request, spider):
proxy = random.choice(settings['PROXIES'])
request.meta['proxy'] = proxy
复制代码
プロキシ要求を修正するために、我々は、プロキシ、バリュープロキシIP項目であるメタ要求にキーを追加する必要があります。
ランダムおよび設定の使用として、あなたはmiddlewares.pyの先頭にそれらをインポートする必要があります。
import random
from scrapy.conf import settings
复制代码
呼び出したダウンロードミドルウェアprocess_request()
コードは、各クローラアクセスページの前に実行されること方法。
settings.pyを開き、最初のいくつかのプロキシIPを追加します。
PROXIES = ['https://114.217.243.25:8118',
'https://125.37.175.233:8118',
'http://1.85.116.218:8118']
复制代码
あなたがプロキシIPのHTTPまたはHTTPSプロキシIP型のタイプであるに見る必要があり、プロキシIPのタイプがあることに留意すべきです。間違っている場合は、それがアクセスできないにつながります。
アクティブミドルウェア
ミドルウェアが書かれた後、あなたはsettings.pyを開始する必要があります。この文の以下のセクションでは、settings.pyに注釈を付けている検索:
# Enable or disable downloader middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
# 'AdvanceSpider.middlewares.MyCustomDownloaderMiddleware': 543,
#}
复制代码
コメントアウト基準ProxyMiddlewareに変更。次のように改正:
DOWNLOADER_MIDDLEWARES = {
'AdvanceSpider.middlewares.ProxyMiddleware': 543,
}
复制代码
これは、実際には、その重要な中間体経路点により分離され、数は、ミドルウェアの順序を示す辞書です。ミドルウェアが順次実行されているので、あなたがミドルウェア後の状況が発生した場合、そう、ミドルウェアは、ミドルウェアの依存関係の前に重要なシーケンスです。
後者の数字を決定するためにどのようにそれを書くためにどのようにすべきですか?最も簡単な方法は、543から開始することで、プラス緩やかなので、一般的に大きな問題は発生しません。あなたはもう少し専門的なミドルウェアを行いたい場合は、図に示すように、それは、Scrapyミドルウェアを運ぶの順序を知る必要があります。
下の数はそれ以上のそのようなScrapyミドルウェアを来る最初の1としてのミドルウェアの最初の実装、RobotsTxtMiddleware
その役割はの最初のチェックsettings.pyにあるROBOTSTXT_OBEY
この1の構成ですTrue
まだFalse
。その場合True
、robots.txtのプロトコルに準拠することを約束し、それは、次の要求と関連する様々にアクセスすることを許可されていない場合は、その後、実行をアクセスすることができ、アクセスするURLを確認し、この時間をキャンセルする要求を指示しますすべての操作は続行する必要はありません。
カスタムミドルウェアの開発者は、順次Scrapy独自のミドルウェアに挿入されます。クローラは、すべてのミドルウェアを実行すると、順番に100から900まで順に従います。すべてのミドルウェア全体実行するまで完全に、または顔特定のミドルウェアで、要求をキャンセル。
Scrapyは、実際にUAミドルウェア(UserAgentMiddleware)、演技のミドルウェア(HttpProxyMiddleware)、リトライミドルウェア(RetryMiddleware)を付属しています。だから、「原則的には、」彼は言った、それはこれら三つのミドルウェアを開発する必要があり、次の3つのミドルウェアが付属して無効Scrapyする必要があります。無効Scrapyミドルウェアには、settings.py内部でNoneに設定され、このミドルウェアを注文する必要があります。
DOWNLOADER_MIDDLEWARES = {
'AdvanceSpider.middlewares.ProxyMiddleware': 543,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': None
}
复制代码
なぜ、「原則的に」と言うが、それを無効にする必要がありますか?下記に示すように、まずチェックは、Scrapyエージェント・ミドルウェアのソースコードを付属しています。
図から分かるようScrapyは要求がプロキシを設定されていることが判明した場合、その後、ミドルウェアは直接返され何もしません。したがって、エージェントは750のScrapyミドルウェアの順番が来るものの、543をカスタマイズするためのプロキシミドルウェア開発者のオーダーよりも大きくなっているが、それは、システムに付属している場合でもできるわけではありませんヘルプを開発者自身の定義をプロキシ情報を上書きすることはありませんこのエージェントミドルウェアは重要ではありません。
以下に示すミドルウェアsettings.pyの自己定義された部分の完全な活性化。
構成された爬虫類を実行した後、爬虫類は、各要求の前にランダムにプロキシを設定しているでしょう。プロキシミドルウェア業績をテストするには、この演習は、以下のページを使用することができます。
http://exercise.kingname.info/exercise_middleware_ip
复制代码
このページには、図1に示すように、クローラのIPアドレスは、ページ上で直接開く戻ります。
この演習サポートページフリップ機能は、フリップへのURL「/ページ」に追加します。100ページの例URLについて:
http://exercise.kingname.info/exercise_middleware_ip/100
复制代码
使用了代理中间件为每次请求更换代理的运行结果,如下图所示。
代理中间件的可用代理列表不一定非要写在settings.py里面,也可以将它们写到数据库或者Redis中。一个可行的自动更换代理的爬虫系统,应该有如下的3个功能。
- 有一个小爬虫ProxySpider去各大代理网站爬取免费代理并验证,将可以使用的代理IP保存到数据库中。
- 在ProxyMiddlerware的process_request中,每次从数据库里面随机选择一条代理IP地址使用。
- 周期性验证数据库中的无效代理,及时将其删除。 由于免费代理极其容易失效,因此如果有一定开发预算的话,建议购买专业代理机构的代理服务,高速而稳定。
开发UA中间件
开发UA中间件和开发代理中间件几乎一样,它也是从settings.py配置好的UA列表中随机选择一项,加入到请求头中。代码如下:
class UAMiddleware(object):
def process_request(self, request, spider):
ua = random.choice(settings['USER_AGENT_LIST'])
request.headers['User-Agent'] = ua
复制代码
比IP更好的是,UA不会存在失效的问题,所以只要收集几十个UA,就可以一直使用。常见的UA如下:
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
"Dalvik/1.6.0 (Linux; U; Android 4.2.1; 2013022 MIUI/JHACNBL30.0)",
"Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; HUAWEI MT7-TL00 Build/HuaweiMT7-TL00) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"AndroidDownloadManager",
"Apache-HttpClient/UNAVAILABLE (java 1.4)",
"Dalvik/1.6.0 (Linux; U; Android 4.3; SM-N7508V Build/JLS36C)",
"Android50-AndroidPhone-8000-76-0-Statistics-wifi",
"Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI 3 MIUI/V7.2.1.0.KXCCNDA)",
"Dalvik/1.6.0 (Linux; U; Android 4.4.2; Lenovo A3800-d Build/LenovoA3800-d)",
"Lite 1.0 ( http://litesuits.com )",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0",
"Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HTC T528t Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30; 360browser(securitypay,securityinstalled); 360(android,uppayplugin); 360 Aphone Browser (2.0.4)",
]
复制代码
配置好UA以后,在settings.py下载器中间件里面激活它,并使用UA练习页来验证UA是否每一次都不一样。练习页的地址为:
http://exercise.kingname.info/exercise_middleware_ua。
复制代码
UA练习页和代理练习页一样,也是可以无限制翻页的。
运行结果如下图所示。
开发Cookies中间件
对于需要登录的网站,可以使用Cookies来保持登录状态。那么如果单独写一个小程序,用Selenium持续不断地用不同的账号登录网站,就可以得到很多不同的Cookies。由于Cookies本质上就是一段文本,所以可以把这段文本放在Redis里面。这样一来,当Scrapy爬虫请求网页时,可以从Redis中读取Cookies并给爬虫换上。这样爬虫就可以一直保持登录状态。
以下面这个练习页面为例:
http://exercise.kingname.info/exercise_login_success
复制代码
如果直接用Scrapy访问,得到的是登录界面的源代码,如下图所示。
现在,使用中间件,可以实现完全不改动这个loginSpider.py里面的代码,就打印出登录以后才显示的内容。
まず、このログインページによって小さなプログラム、セレンの開発、およびRedisの内ヘッダにサイトとリターンを保存します。アプレットのコードを以下に示します。
このコードの役割は、ページを達成するために実際にログインして、JSON形式の文字列として以降のログオンクッキーを変換し、Redisのにそれを保存するには、ユーザー名とパスワードでセレン及びChromeDriver塗りつぶしを使用することです。
次に、Scrapyにこの使用クッキーのRedisからクッキーを読み取るためのミドルウェアを書き、そして:
class LoginMiddleware(object):
def __init__(self):
self.client = redis.StrictRedis()
def process_request(self, request, spider):
if spider.name == 'loginSpider':
cookies = json.loads(self.client.lpop('cookies').decode())
request.cookies = cookies
复制代码
未来を見るために12から12に示すように、このミドルウェアを設定した後、コード内の爬虫類は、GET HTMLログに記録されたに成功するために変更を加える必要はありません。
100サイトアカウントがある場合には、クッキー、クッキーとのRedisに保存されているを取得するために、セレン及びセレン及びPhantomJS ChromeDriverまたはログインを使用し続けて、単一のプログラムを書きます。大幅検出サイトの危険性またはブロックを減らし、各訪問クロールへのRedisからのCookieの新しい読書を爬虫類。
このアプローチはまた、ログインに適用される検証プロセスコードに適用されていないだけ。
ここで停止します。この1、次は、私たちはダウンローダミドルウェア、要求の再試行、および例外処理にセレンを統合する方法を説明します。
著者:Qingnanの
リンク:https://juejin.im/post/5bf20ac551882578cc546841
出典:ナゲッツの
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。