PythonのWebクローラーのエッセンシャルスターター[Githubのは、レンガを移動します]


:学習PythonのWebクローラーは、三つの主要なセクションに分割され、クロール解析ストレージ

また、より一般的な爬虫類の枠組みScrapy、最終的にはここでは詳細に説明します。

私は、エントリ-Webクローラーに必要な基本的な概念や手法について説明し、関連記事、まとめたものをまずリスト:Ningge駅を-ウェブクローラ


私たちが入るブラウザにURLを入力すると、何が舞台裏をどうなりますか?たとえば、あなたが入力したhttp://www.lining0806.com/を、あなたは駅Ninggeホームが表示されます。

簡単に言えば、このプロセスは、4つのステップをとります。

  • IPアドレスを対応するドメイン名を検索します。
  • IPに対応するサーバにリクエストを送信します。
  • サーバーは、ページのコンテンツへの要求のバックに応答します。
  • ブラウザは、Webコンテンツを解析します。

ウェブクローラはやる、簡単な言葉で、ブラウザの機能を実現することです。取得するには、ブラウザを行うためのステップを操作することなく、直接、バックユーザが所望のデータに、URLを指定して。

クロール

この時点で、それが何を明確に取得したいのですか?それはそうでHTMLソースコード、またはJSON形式の文字列であると。

1.最も基本的なクロール

グラブほとんどの場合は、他の側のサーバから直接データを取得get要求に属します。

まず、Pythonとurllib2のは、一般的なページがフェッチ満たすために、実質的に両方のモジュールurllibは付属しています。また、要求も、そこにこれに似た非常に便利なパッケージ、httplib2などを。

Requests:
    import requests
    response = requests.get(url)
    content = requests.get(url).content
    print "response headers:", response.headers
    print "content:", content
Urllib2:
    import urllib2
    response = urllib2.urlopen(url)
    content = urllib2.urlopen(url).read()
    print "response headers:", response.headers
    print "content:", content
Httplib2:
    import httplib2
    http = httplib2.Http()
    response_headers, content = http.request(url, 'GET')
    print "response headers:", response_headers
    print "content:", content

さらに、クエリのURLフィールドに対して、典型的には要求データは、URLセグメントとデータの送信?に、パラメータ・コネクト複数の将来のリクエストURLを併合GET。

data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
    import requests
    response = requests.get(url=url, params=data)
Urllib2:data为string
    import urllib, urllib2    
    data = urllib.urlencode(data)
    full_url = url+'?'+data
    response = urllib2.urlopen(full_url)

関連資料:網易ニュースランキングクロールレビュー

参考プロジェクト:爬虫類の最も基本的なWebクローラー:クロール網易ニュースランキング

2.は、治療の状況を上陸させました

2.1使用のフォーム・ログイン

この場合はポストの要求、すなわちAのデータがフォームXianxiangサーバーを送信し、ローカルのクッキーに戻すに属します。

data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
    import requests
    response = requests.post(url=url, data=data)
Urllib2:data为string
    import urllib, urllib2    
    data = urllib.urlencode(data)
    req = urllib2.Request(url=url, data=data)
    response = urllib2.urlopen(req)

2.2使用クッキーの着陸

使用クッキー着陸、サーバーは、あなたがそのように、あなたが着弾したコンテンツへの戻りがあるだろう、ユーザーにログインしていると思います。したがって、必要な検証コードの検証コードが解決クッキー着陸と共に使用することができる場合。

import requests         
requests_session = requests.session() 
response = requests_session.post(url=url_login, data=data) 

この時間応答に使用される認証コードがある場合requests_session.post(URL = url_login、データ=データ)が許容できない次のように=、アプローチがなければなりません。

response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!

関連資料:ウェブクローラ-確認コードの着陸

参考プロジェクト:ウェブクローラーのユーザー名とパスワードのログイン認証コード:クロールノウハウはほとんどのウェブサイト

抗ハンドリング機構爬虫類3.

3.1プロキシを使用します

状況:IPアドレス制限の状況だけでなく、原因の検証コードの着陸を入力する必要がある「を頻繁にクリックして」に事件を解決します。

このような状況を維持するための最良の方法は、多くのオンラインフリーエージェントIP、良い面と悪い面があり、プロキシIPプールで、あなたはスクリーニングすることによって見つけることができます。「上の頻繁クリック」の場合には、我々はまた、クローラがサイトの禁止であることを避けるために周波数を訪れる制限することができます。

proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
    import requests
    response = requests.get(url=url, proxies=proxies)
Urllib2:
    import urllib2
    proxy_support = urllib2.ProxyHandler(proxies)
    opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
    urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
    response = urllib2.urlopen(url)

3.2時間の設定

状況:周波数を制限します。

要求は、urllib2のは時間のライブラリスリープ()関数を使用することができます。

import time
time.sleep(1)

3.3ブラウザとして、または「抗ホットリンク」に対して装っ

一部のサイトではあなたが本当にアクセス、または自動的にマシンにアクセスするブラウザでないことを確認します。この状況は、ブラウザの缶のアクセスであることを、ユーザエージェントと相まって。あなたのリファラーリファラー情報をチェックし、チェックが正当なものである時々で、通常のRefererと相まって。

headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
    response = requests.get(url=url, headers=headers)
Urllib2:
    import urllib, urllib2   
    req = urllib2.Request(url=url, headers=headers)
    response = urllib2.urlopen(req)

再接続のために4

言っても過言ではありません。

def multi_session(session, *arg):
    retryTimes = 20
    while retryTimes>0:
        try:
            return session.post(*arg)
        except:
            print '.',
            retryTimes -= 1

若しくは

def multi_open(opener, *arg):
    retryTimes = 20
    while retryTimes>0:
        try:
            return opener.open(*arg)
        except:
            print '.',
            retryTimes -= 1

だから我々はmulti_sessionまたは開催爬虫類クロールセッションやオープナーのmulti_openを使用することができます。

5.マルチ・クロールプロセス

ここのためのウォールストリートの知識、実験比較並列クロール:Pythonはクロールマルチプロセッシングクロールは単一およびJavaのマルチスレッド

関連資料:マルチプロセス、マルチスレッドPythonとJavaの比較の算出方法について

リクエストの処理6.アヤックス

「負荷より」の場合には、使用アヤックスは、大量のデータを転送します。

その動作原理は次のとおりです。負荷からページのURLページのソースコードの後に​​、プログラムがお使いのブラウザでJavaScriptを実行します。これらのプログラムは、中のWebページへの「塗りつぶし」をより多くのコンテンツをロードします。ページ自体の直接URLを登る場合は、ページの実際のコンテンツを見つけることができません理由です。

あなたがGoogle Chromeを使用している場合ここで、(「要求」のリンクを分析:右→空→エレメント→ネットワークを点検し、「より多くの負荷」をクリックし、対応するリンクの種類を見つけるように見えるGET text / htmlであり、GETパラメータを参照してくださいにクリックしてくださいまたはコピーリクエストURL)、循環プロセス。

  • 「要求」があっページの前にした場合、分析はステップ1ページのURLに基​​づいて導出されます。ように、グラブのデータはAjaxのアドレスをつかみます。
  • データ(文字列)のJSON形式は、通常の試合で返されます。JSON形式のデータは、「\ uXXXXという」UnicodeエンコードのUに符号化された「\ uXXXXという」フォームunicode_escapeから変換されます。

7.セレン自動テストツール

セレンは、自動テストツールです。これは、パディング文字、マウスクリックなどの操作ブラウザを達成要素と、ページ切り替えの一連の動作を得ることができます。要するに、すべてのブラウザが行うことができ、セレンは行うことができます。

ここで指定した都市の後にリスト、クロールダイナミックにセレンを使用しているネットワークの運賃情報のコードが。

参考プロジェクト:セレン代理ログインを使用してWebクローラーは:どこクライミングサイトを奪います

8.識別コード

サイトの検証コードのために、我々は3つのオプションがあります。

  • プロキシを使用して、IPを更新します。
  • クッキーの着陸を使用してください。
  • 識別コード。

プロキシと使用クッキーを使用する前に、すでにここで検証コード認識について話をする、と述べた上陸しました。

絵を識別し、ダウンロードするために、オープンソース・たTesseract OCRコード検証システムを活用することができ、認識した文字をシミュレート着陸にクローラシステムを転送されます。もちろん、あなたがコーディングのプラットフォーム上の識別コードを検証するために写真をアップロードすることができます。失敗した場合、それが成功するまで、それは、再び検証コード識別を更新することができます。

参照項目:項目初版を識別コード:Captcha1

ノートにクロール2つの問題があります。

  • どのように増分クロールに、と言うことですサイトに一連の更新を監視するには?
  • 大量のデータのために、どのようにクロールの分散を実装するには?

分析

コンテンツをクロールした後、我々は、関連コンテンツの中から抽出し、必要なもの、分析のために捕獲されています。

一般的な分析ツールを持っている正規表現BeautifulSouplxmlのなどを。

メモリ

私たちが必要とするコンテンツを分析した後、次のステップは、保存されています。

我々は、テキストファイルを堆積させるために選択することができます。また、預金選択することができますMySQLののMongoDBデータベースを。

二つの記憶の問題に注意が必要があります。

  • どのように類似したWebページ?
  • コンテンツは、どのような形で保存されていますか?

Scrapy

Scrapyは、Pythonベースのオープンソースのクローラーツイストフレームワークであり、業界で広く使用されています。

関連コンテンツを参照することができScrapyビルドのWebクローラをベースこの記事を与えることを説明しながら、マイクロチャネルの検索基準として、あなたに学んで、プロジェクトコードクロール。

参考プロジェクト:Scrapyまたは要求再帰的クロールマイクロ文字の検索結果を使用して

ロボット契約

グッドウェブクローラは、最初を遵守する必要がロボット契約ロボット協定(とも呼ばれるクローラ契約、ロボットプロトコルなど)の完全な名前は、「ウェブクローラ除外基準」(ロボット排除プロトコル)であるが、サイトはページをクロールすることはできませんページがロボット契約によってクロールできる検索エンジンを、伝えます。

ウェブサイトのrobots.txtのテキストファイルのルートディレクトリに地方分権(のようなhttps://www.taobao.com/robots.txtあなたがアクセスできる別のページのWebクローラやページへのアクセス禁止、定期で指定されたページを指定することができます)、表現手段。robots.txtのテキストファイルへの最初のすべてのgetの、前にこのサイトを収集し、それらを支配するために解決し、サイトの規則に従って収集データの中のWebクローラ。

1.ロボットプロトコルルール

User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址

注:アン英語サイト全体を代表して「/」、コロンの後にスペースがある、コロンは、英語の状態であり、大文字にする必要があります

例2ロボットプロトコル

禁止所有机器人访问
    User-agent: *
    Disallow: /
允许所有机器人访问
    User-agent: *
    Disallow: 
禁止特定机器人访问
    User-agent: BadBot
    Disallow: /
允许特定机器人访问
    User-agent: GoodBot
    Disallow: 
禁止访问特定目录
    User-agent: *
    Disallow: /images/
仅允许访问特定目录
    User-agent: *
    Allow: /images/
    Disallow: /
禁止访问特定文件
    User-agent: *
    Disallow: /*.html$
仅允许访问特定文件
    User-agent: *
    Allow: /*.html$
    Disallow: /

おすすめ

転載: www.cnblogs.com/upcwsh/p/12363654.html