Pythonクローラーで一般的に使用される予防策とテクニック

urllibライブラリを例として取り上げ、
注意が必要なライブラリファイル名のすべてのコードを紹介します。urllib 、cookielib 、httplib 、StringIO 、gzip 、Thread 、Queue

1.基本的にWebページをクロールする

getメソッド

import urllib2

url = "http://www.baidu.com"
respons = urllib2.urlopen(url)
print(response.read())

ポストメソッド

import urllib
import urllib2

url = "http://abcde.com"
form = {
    
    'name': 'abc', 'password': '1234'}
form_data = urllib.urlencode(form)
request = urllib2.Request(url, form_data)
response = urllib2.urlopen(request)
print(response.read())

2.プロキシIPを使用する

クローラーの開発プロセスでは、IPがブロックされることがよくあります。現時点では、プロキシIPを使用する必要があります。次のコードスニペットに示すように、パッケージにはクラス
があり、それを介してプロキシを設定してWebページにアクセスできます。urllib2ProxyHandler

import urllib2

proxy = urllib2.ProxyHandler({
    
    'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')
print(response.read())

3. Cookieの処理

Cookieは、ユーザーのIDを識別してセッショントラッキングを実行するために、一部のWebサイトがユーザーのローカルターミナルに保存するデータ(通常は暗号化)です。Pythonはcookielibモジュールを提供してcookieを処理します。cookielibモジュールの主な機能は、cookieを保存できるオブジェクトを提供することです。 、urllib2モジュールで使用してインターネットリソースにアクセスするため。

コードセグメント:

import urllib2
import cookielib

cookie_support = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()

キーはCookieJar()です。これは、HTTP Cookie値の管理、HTTPリクエストによって生成されたCookieの保存、発信HTTPリクエストへのCookieオブジェクトの追加に使用されます。Cookie全体がメモリに格納され、CookieJarインスタンスのガベージコレクション後にCookieは失われます。すべてのプロセスを個別に操作する必要はありません。

Cookieを手動で追加する

cookie = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7; kmsign=55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="
request.add_header("Cookie", cookie)

4.ブラウザに変装する

一部のWebサイトはクローラーのアクセスを嫌うため、すべての要求を拒否します。したがって、urllib2を使用してWebサイトに直接アクセスすると、HTTPエラー403:禁止されます。

  • 一部のヘッダーに特に注意してください。サーバー側はこれらのヘッダーをチェックします

  • User-Agent一部のサーバーまたはプロキシは、この値をチェックして、ブラウザによって開始されたリクエストであるかどうかを判断します

  • Content-Type RESTインターフェースを使用する場合、サーバーはこの値をチェックして、HTTP本文のコンテンツを解析する方法を決定します。

これは、ヘッダーを変更することで実現できます。コードスニペットは次のとおりです。

import urllib2

headers = {
    
    
    'User-Agent': 'Mozilla/5.0'
}
request = urllib2.Request(
    url='http://my.oschina.net/jhao104/blog?catalog=3463517',
    headers=headers
)
print(urllib2.urlopen(request).read())

5.ページ分析

  • ページ解析で最も強力なのは、もちろん正規表現です。これは、Webサイトのユーザーによって異なります。
  • 解析ライブラリ。2つの一般的に使用されるlxmlとBeautifulSoupがあります。
  • これら2つのライブラリーは、どちらもHTML / XML処理ライブラリーです。Beautifulsoupは純粋なpythonで実装されているため、非効率的ですが、実用的な機能があります。たとえば、検索結果を使用してHTMLノードのソースコードを取得できます。lxmlは効率的でサポートされているC言語コードです。 Xpath
  • 個人的には、ページ分析にxpathを使用することを好みます

6.確認コードの処理

  • 一部の単純な検証コードでは、単純な識別を実行できます。ただし、12306などの一部の対人検証コードは、コーディングプラットフォームを介して手動でコーディングできますが、これは有料です。

7、gzip圧縮

トランスコードする方法に関係なく、いくつかのWebページに遭遇したことはありますか、それらは厄介なコードです。これは、多くのWebサービスが圧縮データを送信する機能を備えていることを知らないためです。これにより、ネットワーク回線で送信される大量のデータを60%以上削減できます。これは、XMLデータの圧縮率が非常に高くなる可能性があるため、XML Webサービスに特に適しています

が、通常、サーバーは、圧縮データを処理できることをサーバーに通知しない限り、圧縮データを送信しません。

したがって、次のようにコードを変更する必要があります。

import urllib2
import httplib

request = urllib2.Request('http://xxxx.com')
request.add_header('Accept-encoding', 'gzip')
opener = urllib2.build_opener()
f = opener.open(request)

これが重要です。リクエストオブジェクトを作成し、Accept-encodingヘッダーを追加して、gzip圧縮データを受け入れることができることをサーバーに伝えます。

次に、データを解凍します。

import StringIO
import gzip

compresseddata = f.read()
compressedstream = StringIO.StringIO(compresseddata)
gzipper = gzip.GzipFile(fileobj=compressedstream)
print(gzipper.read())

8.マルチスレッドの同時クロール

  • 単一のスレッドが遅すぎる場合は、複数のスレッドが必要です。簡単なスレッドプールテンプレートを次に示します。このプログラムは、1〜10を出力するだけですが、同時に実行されていることがわかります。
  • Pythonのマルチスレッド化は非常に無味ですが、頻繁なタイプのクローラーの効率をある程度向上させることができます。
from threading import Thread
from Queue import Queue
from time import sleep

# q是任务队列
# NUM是并发线程总数
# JOBS是有多少任务
q = Queue()
NUM = 2
JOBS = 10


# 具体的处理函数,负责处理单个任务
def do_somthing_using(arguments):
    print(arguments)


# 这个是工作进程,负责不断从队列取数据并处理
def working():
    while True:
        arguments = q.get()
    do_somthing_using(arguments)
    sleep(1)
    q.task_done()


# fork NUM个线程等待队列
for i in range(NUM):
    t = Thread(target=working)
    t.setDaemon(True)
    t.start()
# 把JOBS排入队列
for i in range(JOBS):
    q.put(i)
# 等待所有JOBS完成
q.join()

PS:高強度のクローラーはサーバーに大きな負荷をかけ、使用時にリクエスト速度を設定し、悪影響を避けるためにそれを合理的に使用します

おすすめ

転載: blog.csdn.net/qq_43562262/article/details/106426954