ホームページ  >  記事  >  バックエンド開発  >  非常に詳細な Python の一般的な面接の質問

非常に詳細な Python の一般的な面接の質問

不言
不言転載
2019-02-23 10:18:4115931ブラウズ

非常に詳細な Python の一般的な面接の質問

この記事の内容は、Python の面接でよくある質問について非常に詳細にまとめたもので、困っている友人にとっては一定の参考になります。 , ご参考になれば幸いです。

おすすめ関連記事:「2020年Python面接質問まとめ(最新)

# # 1. ビッグ データ ファイルの読み取り##① ジェネレーターを使用します

#②反復走査にはイテレーターを使用します: ファイル内の行

2。イテレータとジェネレータの違い

1) イテレータはより抽象的な概念であり、クラスに next メソッドと iter メソッドがある場合、オブジェクトはそれ自体を返します。文字列、リスト、辞書、タプルなどのコンテナ オブジェクトの場合、for ループを使用して走査すると非常に便利です。 for ステートメントのバックグラウンドで、Python の組み込み関数である iter() 関数がコンテナ オブジェクトに対して呼び出されます。 iter() は、コンテナ内の要素に 1 つずつアクセスする next() メソッドを定義するイテレータ オブジェクトを返します。Next() は Python の組み込み関数でもあります。後続の要素がない場合、next() は StopIteration 例外をスローします。

2) Generator は、イテレータを作成するためのシンプルで強力なツールです。これらは、データを返す必要がある場合に yield ステートメントを使用する点を除いて、通常の関数と同じように作成されます。 next() が呼び出されるたびに、ジェネレーターは中断した位置を返します (ステートメントが最後に実行された位置とすべてのデータ値を記憶しています)

違い: ジェネレーターはイテレーターが実行できることをすべて実行できます。 __iter__() および next() メソッドが自動的に作成されるため、ジェネレーターは特に簡潔であり、効率的でもあります。リスト内包表記の代わりにジェネレーター式を使用すると、同時にメモリを節約できます。プログラム状態を作成および保存する自動メソッドに加えて、ジェネレーターが終了するときに StopIteration 例外も自動的にスローされます (

3)。デコレーターの役割と機能:

ログの紹介

関数実行時間の統計

関数実行前の事前処理

関数実行後の関数のクリーニング

権限検証およびその他のシナリオ

キャッシュ

4. GIL について簡単に説明します:

グローバル インタプリタ ロック

Pythonコードの実行は、Python 仮想マシン (インタプリタ メイン ループ、CPython バージョンとも呼ばれます) によって制御されます。Python は元々、インタプリタのメイン ループで同時に実行されるスレッドが 1 つだけになるように設計されました。インタプリタ内で実行されるスレッドは 1 つだけです。 Python 仮想マシンへのアクセスは、グローバル インタープリター ロック (GIL) によって制御され、一度に 1 つのスレッドのみが実行されるようになります。

マルチスレッド環境では、Python 仮想マシンは次のように実行されます:

1. GIL をセットアップします

2. スレッドに切り替えます

3 を実行します。実行:

a. バイトコード命令の数を指定する、または、 b. スレッドが積極的に制御を放棄します (time.sleep(0) を呼び出すことができます)

4. スレッドをスリープ状態に設定します

5. GIL のロックを解除します

6. 外部コード (たとえば、 C/C 拡張関数) の場合、GIL はこの関数が終了するまでロックされます (この期間中に Python バイトコードは実行されないため、スレッドの切り替えは実行されません)。

5. 検索と grep

grep コマンドは強力なテキスト検索ツールで、grep 検索の内容文字列には正規表現を使用でき、テキスト ファイルのパターン化が可能です。探す。一致するパターンが見つかった場合、grep はそのパターンを含むすべての行を出力します。

find は通常、特定のディレクトリ内で条件を満たすファイルを検索するために使用されますが、特定のユーザーが所有するファイルを検索するためにも使用できます。

6. さまざまな理由でオンライン サービスがハングアップする可能性がある場合はどうすればよいですか?

Supervisor、Linux 上の強力なバックグラウンド プロセス管理ツール

ファイルを変更するたびに、Linux はサービス スーパーバイザと再起動を実行します

7。 Python の操作 効率

#ジェネレーターを使用する; キー コードは外部関数パッケージ (Cython、pylnlne、pypy、pyrex) を使用する; ループの最適化 – ループ内の変数のプロパティへのアクセスを避けるようにする

8. 一般的に使用される Linux コマンド:

ls,help,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date

9. Python での Yield の使用法

Yield は単なるジェネレーターであるため、関数は最後に返されたときの関数本体内の位置を記憶します。ジェネレーターへの 2 番目 (または n) の呼び出しは、この関数にジャンプします。

10. Python がメモリ管理を実行する方法

1. ガベージ コレクション: Python は C や Java などの言語とは異なり、変数の型を事前に宣言せずに直接変数に値を割り当てることができます。 Python 言語の場合、オブジェクトのタイプとメモリは実行時に決定されます。これは、Python 言語を動的型付けと呼ぶ理由でもあります (ここでは、動的型付けを単に変数メモリ アドレスの割り当てに要約することができます。これは、変数の型を自動的に決定し、実行時に変数に値を割り当てることです)。

2. 参照カウント: Python は、Windows カーネル オブジェクトと同様のメソッドを使用してメモリを管理します。各オブジェクトは、そのオブジェクトを指す参照の数を保持します。変数がオブジェクトにバインドされている場合、変数の参照カウントは 1 になります (変数の参照カウントが増加する状況は他にもあります)。システムはこれらのラベルを自動的に維持し、定期的にスキャンします。参照カウントが 0 になると、ペアはリサイクルされます。

3. メモリプールの仕組み Python のメモリの仕組みはピラミッドの列で構成されており、-1 層と -2 層は主にオペレーティング システムによって動作します

0 層目は malloc や malloc などのメモリですC では free 割り当て関数と解放関数が動作します;

最初の層と 2 番目の層はメモリ プールであり、Python インターフェイス関数 PyMem_Malloc 関数によって実装されます。オブジェクトが 256K 未満の場合、この層は直接メモリを割り当てます。

3 番目の層は最上位層であり、Python オブジェクトの直接操作です;

C で malloc と free が頻繁に呼び出される場合、パフォーマンスの問題が発生します。メモリの小さなブロックを解放するとメモリの断片化が発生します。Python がここで実行する主なタスクは次のとおりです:

要求されたメモリ割り当てが 1 ~ 256 バイトの場合は、独自のメモリ管理システムを使用し、それ以外の場合は malloc を直接使用します。

## メモリを割り当てるためにここでも Malloc が呼び出されますが、毎回、サイズ 256k の大きなメモリ ブロックが割り当てられます。

メモリ プールを通じて登録されたメモリは引き続き次の場所にリサイクルされます。最終的にメモリ プールが解放されます。C の free は、次回使用するために解放するために呼び出されません。値、文字列、タプルなどの単純な Python オブジェクト (タプルは変更できません) の場合、コピー メソッド (ディープ コピー) ?) が使用されます。つまり、変数 A に別の変数 B が代入されると、A と B のメモリ空間は同じであっても、A の値が変更されると、その空間が再割り当てされると言われています。

11. 配列、リンク リスト、キュー、スタックの違いについて説明してください。

配列とリンク リストはデータ ストレージの概念です。配列はデータを連続空間に保存しますが、リンク リストはデータを非連続空間に保存できます。

キューとスタックは、データ アクセス方法の概念では、キューは先入れ先出し、スタックは後入れ先出しです。キューとスタックは配列またはリンク リストを使用して実装できます。

12. いくつかの種類の並べ替えをご存知ですか?最もよく知っている並べ替えについて教えていただけますか?

Web フレームワーク パート

1. Django で、ユーザーがアプリケーション サーバー A にログインする (ログイン状態になる) とき、次のリクエストが nginx によってアプリケーション サーバー B にプロキシされた場合、どのような影響がありますか?

A アプリケーション サーバーにログインしているユーザーのセッション データが B アプリケーション サーバーに共有されていない場合、Nano の以前のログイン状態は失われます。

2. Django のクロスドメイン リクエストの問題を解決する方法 (原則)

ミドルウェアを有効にする
post request
検証コード
form

3. Django のアーキテクチャについて説明してください

Django フレームワークは MVC 設計に従っており、固有名詞があります: MVT

M は Model と綴られ、同じ機能があります。 MVC の M として、埋め込み ORM フレームワークを使用したデータ処理を担当します。
V は View と綴られ、MVC の C と同じ機能を持ちます。HttpRequest を受信し、ビジネス処理を実行し、HttpResponse を返します。
Tは Template と綴られており、MVC の V 関数と同じです。同じで、返される HTML のカプセル化と構築を担当し、テンプレート エンジンが埋め込まれています

4. Django でデータ クエリの結果を並べ替える方法、方法降順を行うには、特定のフィールドより大きいクエリを実行する方法

order_by( ) を使用して並べ替えます
降順には、並べ替えフィールド名の前に -
を追加する必要があります: 特定の値より大きいフィールドをクエリ: フィルターを使用します(フィールド名_gt=値)

5. MIDDLEWARES ミドルウェアの役割である Django について教えてください。

ミドルウェアはリクエスト処理とレスポンス処理の間の処理プロセスで、比較的軽量でDjangoの入出力をグローバルに変更します。

6. Django について何を知っていますか?

Django は、大きく包括的な方向性を目指しています。完全に自動化された管理バックエンドで最も有名です。ORM を使用して単純なオブジェクト定義を行うだけで、データベース構造とフル機能の管理バックエンドを自動的に生成できます。 . .
Django の組み込み ORM は、フレームワーク内の他のモジュールと高度に結合しています。

アプリケーションは Django の組み込み ORM を使用する必要があります。そうしないと、フレームワークで提供されるさまざまな ORM ベースの利便性を享受できません。理論的には、ORM モジュールを切り替えることができますが、これは同等です完成した家をリノベーションする場合 家を取り壊してリノベーションする場合は、最初からラフハウスに行って新しい装飾を行う方が良いです。

Django は超高い開発効率が売りですが、その性能拡張には限界があり、Django を使用したプロジェクトはトラフィックが一定規模に達すると性能要件を満たすように再構築する必要があります。

Django は、中小規模の Web サイト、または大規模な Web サイトが製品プロトタイプを迅速に実装するためのツールとして適しています。

Django テンプレートの設計哲学は、コードとスタイルを完全に分離することであり、Django はテンプレート内のデータのコーディングと処理の可能性を根本的に排除します。

7. Django リダイレクトはどのように実装しますか?どのようなステータス コードが使用されますか?
HttpResponseRedirect を使用する
リダイレクトとリバース
ステータス コード: 302,301

8.ngnix フォワード プロキシとリバース プロキシ?
フォワード プロキシは、クライアントとオリジン サーバーの間にあるサーバーです。オリジン サーバーからコンテンツを取得するために、クライアントはプロキシにリクエストを送信し、ターゲット (オリジン サーバー) を指定すると、プロキシはコンテンツをオリジンサーバーに送信し、リクエストをハンドオフし、取得したコンテンツをクライアントに返します。フォワード プロキシを使用するには、クライアントで特別な設定を行う必要があります。
リバース プロキシはその逆で、クライアントにとっては元のサーバーのようなもので、クライアントは特別な設定を行う必要はありません。クライアントはリバース プロキシの名前空間内のコンテンツに通常のリクエストを送信します。その後、リバース プロキシはリクエストの転送先 (元のサーバー) を決定し、コンテンツ自体が同じであるかのように、取得したコンテンツをクライアントに返します。

9.Tornado の核心は何ですか?
Tornado のコアは 2 つのモジュール ioloop と iostream です。前者は効率的な I/O イベント ループを提供し、後者はノンブロッキング ソケットをカプセル化します。ネットワーク I/O イベントを ioloop に追加し、ノンブロッキング ソケットを使用し、対応するコールバック関数と一致させることで、待望の効率的な非同期実行を実現できます。

10.Django 自体が runserver を提供しているのに、なぜそれをデプロイメントに使用できないのですか?
runserver メソッドは、Django のデバッグ時によく使用される実行メソッドです。Django 独自の
WSGI サーバーを使用して実行されます。主にテストと開発で使用され、runserver メソッドも単一プロセスです。
uWSGI は、WSGI プロトコル、uwsgi、http、およびその他のプロトコルを実装する Web サーバーです。なお、uwsgiは通信プロトコルであり、uWSGIはuwsgiプロトコルとWSGIプロトコルを実装したWebサーバーです。 uWSGI には、超高速パフォーマンス、低メモリ使用量、マルチアプリ管理という利点があり、Nginx
と組み合わせると運用環境となり、ユーザー アクセス リクエストをアプリケーション アプリから分離して実際のデプロイメントを実現できます。比較すると、より多くの同時実行性がサポートされ、複数のプロセスの管理が容易になり、マルチコアが活用され、パフォーマンスが向上します。

ネットワーク プログラミングとフロントエンド部分

1.AJAX とは何ですか? AJAX の使用方法は?
ajax (非同期 JavaScript および XML) は、Web ページ全体を再ロードするのではなく、部分的な Web ページ データを更新できます。
最初のステップは、xmlhttprequest オブジェクト var xmlhttp =new XMLHttpRequest() を作成することです。XMLHttpRequest オブジェクトは、サーバーとデータを交換するために使用されます。
2 番目のステップは、xmlhttprequest オブジェクトの open() メソッドと send() メソッドを使用して、リソース要求をサーバーに送信することです。
3 番目のステップは、xmlhttprequest オブジェクトの responseText または responseXML 属性を使用してサーバーの応答を取得することです。
4 番目のステップである onreadystatechange 関数は、サーバーにリクエストを送信するときに、サーバーに応答していくつかの機能を実行してもらいたい場合は、onreadystatechange 関数を使用する必要があります。onreadystatechange 関数は、xmlhttprequest の readyState が返されるたびにトリガーされます。オブジェクトが変化します。

2. 一般的な HTTP ステータス コードは何ですか?

200 OK
301 完全に移動されました
302 見つかりました
304 未変更
307 一時的なリダイレクト
400 不正なリクエスト
401 未承認
403 禁止
404 見つかりません
410 消えました
500 内部サーバー エラー
501 実装されていません

3. Post と get の違いは何ですか?

GETリクエストでは、リクエストされたデータをURLに付加してURLを分割して送信します複数のパラメータは&で連結されます。 URL エンコード形式では、uniclde ではなく ASCII エンコードが使用されます。つまり、すべての非 ASCII 文字は送信前にエンコードする必要があります。
POST リクエスト: POST リクエストは、リクエストされたデータを HTTP リクエスト パッケージの本文に配置します。上の item=bandsaw が実際の送信データです。
したがって、GET リクエストのデータはアドレス バーに表示されますが、POST リクエストのデータは表示されません。

2. 送信データのサイズ

HTTP 仕様では、URL の長さと送信データのサイズに制限はありません。しかし、実際の開発プロセスでは、GET の場合、特定のブラウザとサーバーには URL の長さに関する制限があります。したがって、GET リクエストを使用する場合、転送されるデータは URL の長さによって制限されます。

POST の場合、URL 値ではないため理論上は制限されませんが、実際には各サーバーごとに POST 送信データのサイズ制限が規定されており、Apache と IIS にはそれぞれの制限があります。独自の構成。

3. セキュリティ

POST のセキュリティは GET よりも高いです。ここでいうセキュリティとは、上記の GET におけるセキュリティ方式のセキュリティとは異なり、サーバーのデータを変更しないだけの実際のセキュリティのことです。たとえば、ログイン操作を実行する場合、GET リクエストを通じてユーザー名とパスワードが URL に公開されますが、ログイン ページがブラウザにキャッシュされ、他の人がブラウザの履歴を閲覧する可能性があるため、この時点でのユーザー名とパスワードは他の人に簡単に入手できます。さらに、GET リクエストによって送信されたデータは、クロスサイト リクエスト フロジェリ攻撃を引き起こす可能性もあります。

4. Cookie とセッションの違いは何ですか?

1. Cookie データはクライアントのブラウザに保存され、セッション データはサーバーに保存されます。
2. Cookie は安全性が高くなく、ローカルに保存された COOKIE を他人が解析して COOKIE を騙すことができるため、セキュリティを考慮するとセッションを使用する必要があります。
3. セッションは一定期間内にサーバーに保存されます。アクセスが増えるとサーバーのパフォーマンスを圧迫するため、サーバーのパフォーマンスを下げるにはCOOKIEを使用する必要があります。
4. 1 つの Cookie によって保存されるデータは 4K を超えることはできません。多くのブラウザでは、サイトで保存できる Cookie は 20 個までに制限されています。
5. 提案:
ログイン情報などの重要な情報を SESSION として保存する
他の情報を保持する必要がある場合は、COOKIE

5 に配置できます。シンプルな TCP サーバー Process

1.socket はソケットを作成します
2.bind は IP とポートをバインドします
3.listen してソケットが受動的に接続できるようにします
4. acceptクライアントのリンク
5.recv/sendがデータを送受信するのを待ちます

クローラーとデータベース部分

1. スクレイピーとスクレイピーの違いは何ですか-レディス?なぜ Redis データベースを選ぶのですか?

(1) Scrapy は、非常に高いクローリング効率と高度なカスタマイズを備えた Python クローラー フレームワークですが、配布はサポートしていません。 Scrapy-redis は、redis データベースをベースにし、scrapy フレームワーク上で実行されるコンポーネントのセットであり、scrapy が分散戦略をサポートできるようにします。スレーバー側は、マスター側の redis データベースに設定されたアイテム キュー、リクエスト キュー、およびリクエスト フィンガープリントを共有します。

(2) redis データベースを選択する理由 redis はマスター/スレーブ同期をサポートしており、データはメモリにキャッシュされるため、redis ベースの分散クローラはリクエストとデータの高頻度の読み取りにおいて非常に効率的です。高い。

2.どのようなクローラー フレームワークまたはモジュールを使用しましたか?それらの違いや長所と短所について話してください。
Python には次のものが付属します: urllib、urllib2
サードパーティ:requests
フレームワーク:Scrapy
urllib モジュールと urllib2 モジュールは両方とも URL のリクエストに関連する操作を実行しますが、提供する機能は異なります。
urllib2.: urllib2.urlopen は Request オブジェクトまたは URL を受け入れることができます (Request オブジェクトを受け入れる場合、URL のヘッダーを設定できます)、urllib.urlopen は URL のみを受け入れます
urllib には urlencode があり、ありませんurllib2 なので、常に urllib です。urllib2 がよく一緒に使用される理由
scrapy はカプセル化されたフレームワークです。これには、ダウンローダー、パーサー、ログ、および例外処理が含まれています。マルチスレッドとツイスト処理に基づいています。単一 Web サイトのクローリング開発には利点がありますが、複数の Web サイトから 100 の Web サイトをクローリングする場合、同時処理および分散処理の点で柔軟性が十分ではなく、調整や拡張には不便です。

request は HTTP ライブラリです。リクエストの作成のみに使用されます。HTTP リクエストの場合、強力なライブラリです。ダウンロードと解析はすべて自分で処理されます。柔軟性が高く、同時実行性が高く、分散配置が可能です。非常に柔軟で、関数をより適切に実装できます。

Scrapy の長所と短所:

長所:scrapy は非同期です

正規表現の代わりに、より読みやすい xpath を使用します。

強力な統計とログ システム

異なる URL を同時にクロールします。

独立したデバッグを容易にするシェル モードをサポートします

統合フィルターの作成を容易にするミドルウェアを作成する

##パイプラインを通じてデータベースに保存

##欠点:

Python クローラー フレームワークに基づいており、比較的スケーラブルな違い

ねじれたフレームワークに基づいているため、例外を実行してもリアクターが強制終了せず、非同期フレームワークはエラー発生後に他のタスクを停止しないため、データエラーの検出が困難です。

3. よく使用される mysql エンジンは何ですか?エンジン間の違いは何ですか?

MyISAM と InnoDB という 2 つの主要なエンジンがあります。主な違いは次のとおりです:

1. InnoDB はトランザクションをサポートしますが、MyISAM はサポートしません。これは非常に重要です。トランザクションは高度な処理方法であり、たとえば一連の追加、削除、変更では、エラーが発生した場合はロールバックして復元できますが、MyISAM

ではそれができません。

#2. MyISAM はクエリや挿入ベースのアプリケーションに適していますが、InnoDB は頻繁な変更や

高セキュリティを伴うアプリケーションに適しています;

3. InnoDB は外部キーをサポートしていますが、 MyISAM はこれをサポートしません;

4. MyISAM はデフォルトのエンジンであり、InnoDB を指定する必要があります;

5. InnoDB は FULLTEXT タイプのインデックスをサポートしません;

6.テーブル内の行数は InnoDB に保存されません。たとえば、テーブルから count(*) を選択する場合、InnoDB はテーブル全体を

スキャンして行数を計算する必要がありますが、MyISAM は必要なのはテーブル全体をスキャンするだけです。単に保存された行数を読み出すだけです。 count(*) ステートメントに where 条件が含まれている場合、MyISAM はテーブル全体をスキャンする必要があることに注意してください;

7. 自己増加フィールドの場合、InnoDB にはそのフィールドのみのインデックスが含まれている必要がありますが、MyISAM には

テーブルは他のフィールドとの結合インデックスを作成できます;

8. テーブル全体をクリアする場合、InnoDB は行を 1 つずつ削除するため、非常に時間がかかります。 MyISAM はテーブルを

再構築します;

9. InnoDB は行ロックをサポートします (場合によっては、テーブル全体がロックされます (テーブル セット a=1 の更新など)

# user like '%lee%'

4.Scrapy フレームワークの動作メカニズムについて説明してください?

start_urls から URL の最初のバッチを取得し、リクエストを送信します。リクエストはエンジンによってスケジューラに渡され、リクエスト キューに入れられます。取得が完了すると、スケジューラはリクエスト キュー内のリクエストをダウンローダーはリクエストに対応する応答リソースを取得し、抽出処理のために作成した解析メソッドに応答を渡します: 1. 必要なデータが抽出された場合は、処理のためにパイプライン ファイルに渡します。2. URL が抽出された後は、リクエスト キューにリクエストがなくなりプログラムが終了するまで、前の手順 (URL リクエストを送信し、エンジンがリクエストをスケジューラに渡してキューに入れます...) を実行し続けます。

5. 関連クエリとは何ですか?

主に内部結合、左結合、右結合、完全結合 (外部結合) を含む複数のテーブルをクエリ用に結合します

6. 複数のプロセスを使用してクローラーを記述するのは良いですか? ?それともマルチスレッドの方が良いのでしょうか?なぜ?

IO 集中型のコード (ファイル処理、Web クローラーなど) の場合、マルチスレッドは効率を効果的に向上させることができます (単一スレッドで IO 操作がある場合、IO 待機が発生し、不要な処理が発生します)時間の無駄、複数のオープン (スレッド A が待機している間、スレッドは自動的にスレッド B に切り替わるので、CPU リソースが無駄にならず、それによってプログラムの実行効率が向上します)。実際のデータ収集プロセスでは、ネットワーク速度や応答の問題だけでなく、自分のマシンのハードウェア条件も考慮してマルチプロセスまたはマルチスレッドを設定する必要があります。 #7. データベースの最適化?

#1. インデックス、SQL ステートメントを最適化し、遅いクエリを分析する;

2. テーブルを設計するときは、データベース設計パラダイムに従って厳密にデータベースを設計する;

3. キャッシュを使用して、頻繁にアクセスされるデータと頻繁に変更する必要のないデータをキャッシュに置き、

ディスク IO を節約できます;

4. ハードウェアを最適化します。SSD を使用し、ディスク キュー テクノロジ (RAID0、RAID1、RDID5) など;

5. MySQL 独自のテーブル パーティショニング テクノロジを使用してデータをさまざまなファイルに階層化すると、ディスクの読み取り効率を向上させることができます

;

6. 垂直テーブルパーティショニング; ディスク I/O を節約するために、まれに読み取られるデータを 1 つのテーブルに配置します;

7. 読み取りと書き込みのマスターとスレーブの分離; マスターとスレーブのレプリケーションを使用して、データベースの読み取り操作と書き込み操作;

8. データベース、テーブル、マシンを分割する (データ量が非常に多い). 主な原則はデータ ルーティングです;

9 .Select適切なテーブル エンジンとパラメータの最適化;

10. アーキテクチャ レベルのキャッシュ、静的化、分散の実行;

11. フルテキスト インデックスを使用しない;

12頻繁にアクセスされるデータを保存するには、NoSQL などのより高速なストレージ方法を使用します。

8. 一般的なクローラ対策とその対策方法は?

1). ヘッダーによるクロール対策

ユーザーから要求されたヘッダーのクロール対策は、最も一般的なクロール対策戦略です。多くの Web サイトはヘッダーのユーザー エージェントを検出し、一部の Web サイトはリファラーを検出します (一部のリソース Web サイトのリーチ防止はリファラーを検出することです)。このタイプのクローラー対策メカニズムが発生した場合は、ヘッダーをクローラーに直接追加してブラウザーのユーザー エージェントをクローラーのヘッダーにコピーするか、リファラー値をターゲット Web サイトのドメイン名に変更します。ヘッダーを検出するアンチクローラーの場合、クローラーにヘッダーを変更または追加することで簡単にバイパスできます。

2). ユーザーの行動に基づくクローラー対策

同じ IP が短期間に同じページに複数回アクセスするなど、ユーザーの行動を検出する Web サイトもいくつかあります。または同じアカウントを短期間に複数回同じことを行います。

ほとんどの Web サイトは前者の状況にありますが、この状況については、IP プロキシを使用することで解決できます。特別なクローラーを作成して、インターネット上で公開されているプロキシ IP をクロールし、検出後にそれらをすべて保存できます。このようなプロキシ IP クローラーはよく使用されるため、自分で用意するのが最善です。多数のプロキシ IP を取得した後は、数リクエストごとに 1 つの IP を変更できます。これはリクエストまたは urllib2 で簡単に実行できるため、最初のアンチクローラーを簡単にバイパスできます。

2 番目のケースでは、各リクエストの後、次のリクエストを行う前にランダムに数秒待つことができます。論理的な抜け穴のある一部の Web サイトでは、リクエストを数回行い、ログアウトし、再度ログインし、リクエストを続けることで、同じアカウントが短期間に同じリクエストを複数回行うことができないという制限を回避できます。

3). 動的ページのアンチクローラー

上記の状況のほとんどは静的ページで発生しますが、クロールする必要のあるデータが ajax リクエストを通じて取得される Web サイトもいくつかあります。または JavaScript 経由で生成されます。まず、Fiddler を使用してネットワーク リクエストを分析します。 ajax リクエストを見つけて、特定のパラメーターとレスポンスの特定の意味を分析できれば、上記の方法を使用して、リクエストまたは urllib2 を使用して ajax リクエストを直接シミュレートし、レスポンスの json を分析して必要なデータを取得できます。

Ajax リクエストを直接シミュレートしてデータを取得できるのは素晴らしいことですが、一部の Web サイトでは、Ajax リクエストのすべてのパラメータが暗号化されています。必要なデータのリクエストを作成する方法がありません。この場合、Selenium phantomJS を使用してブラウザ カーネルを呼び出し、phantomJS を使用して js を実行して人間の操作をシミュレートし、ページ内で js スクリプトをトリガーします。フォームへの入力からボタンのクリック、ページのスクロールに至るまで、特定のリクエストとレスポンスのプロセスに関係なく、ユーザーがデータを取得するためにページを閲覧するプロセスを完全にシミュレートできます。

このフレームワークを使用すると、ほとんどのアンチクローラーを回避できます。これは、データを取得するためにブラウザーのふりをしていないためです (上記のヘッダーの追加は、ある程度ブラウザーのふりをしています)。ブラウザ自体、phantomJS はインターフェイスのないブラウザですが、ブラウザは人間によって制御されません。 Selenium phantomJS は、タッチ (12306) やスライド検証コードの識別、ページ フォームのブルート フォース クラッキングなど、さまざまな機能を実行できます。

9. 分散型クローラは主にどのような問題を解決しますか?

1)ip

2)帯域幅

3)cpu

4)io

10.クローラープロセス中に検証コードを処理するにはどうすればよいですか?

1.Scrapy には

2.有料インターフェイスが付属しています

関連学習の推奨事項: Python ビデオ チュートリアル

以上が非常に詳細な Python の一般的な面接の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。