5

次のように関数を記述しようとしています。

def get_urls(*urls,restrictions=None):
    #here there should be some code that
    #iterates through the urls and create
    #a dictionary where the keys are the 
    #respective urls and their values are
    #a list of the possible extentions. The
    #function should return that dictionary.

まず、説明します。www.example.com というサイトがあり、www.example.com/faq、www.example.com/history、および www.example.com/page/2 のページしかない場合。これはアプリケーションになります:

In[1]: site = 'http://example.com'
In[2]: get_urls(site)
Out[2]: {'http://example.com':['/faq','/history','/page/2']}

私は何時間も研究に費やしてきましたが、今のところこれは不可能に思えます! それで、これを行うことができるいくつかのモジュールがありませんか? 存在するがPythonにはないものはありますか? もしそうなら、何語ですか?

ここで、なぜ があるのか​​疑問に思われるかもしれませんが、そのrestrictions=None理由は次のとおりです。

許容される URL に制限を追加できるようにしたいと考えています。たとえば、restrictions='first'が存在するページのみを実行するようにすることができます'/'。次に例を示します。

In[3]: get_urls(site,restrictions='first')
Out[3]: {'http://example.com':['/faq','/history']}

制限のアイデアを説明し続ける必要はありませんが、その必要性は理解できます! 一部のサイト、特にソーシャル ネットワークには、写真を追加するクレイジーなアドオンがいくつかあります。すべての写真で構成される元のページを維持しながら、それらを削除することが重要です。

そうです、私はこれのためのコードを全く持っていませんが、それは私が何をすべきか見当がつかないからです! しかし、私は自分ができるようにする必要があることを明確にしたと思います。それで、これは可能ですか? はいの場合、どのように?いいえの場合、なぜですか?

編集:

いくつかの回答とコメントの後、ここにいくつかの詳細情報があります。必ずしもドメインではなく、URL を指定して、元の URL をキーとして辞書を返し、その URL のすべての拡張子のリストを項目として返します。これが私の以前の例です'example.com'

In[4]: site = 'http://example.com/page'
In[5]: get_urls(site)
Out[5]: {'http://example.com/page':['/2']}

クロールの例と美しいスープは素晴らしいですが、どのページにも直接リンクされていない URL がある場合、それを見つけることができません。はい、それは一般的には問題ではありませんが、できるようにしたいと思います!

4

2 に答える 2

13

私はあなたの質問を「与えられた URL から、その URL の「下」に存在する一連の URL を見つけてください」と解釈しています。-それが正しくない場合は、質問を更新してください。あまり明確ではありません。

ドメイン上の有効なパスのセット全体を検出することはできません。唯一のオプションは、すべての有効な文字 ( 、 、 、...、 ... など) を文字通り反復処理し、/これらのURLのそれぞれにアクセスして、サーバーが 200 を返すかどうかを判断します。これが単に実現不可能であることは明らかだと思います。/a/b/c/aa

事前に定義された一連のページにアクセスし、ページからすべてのリンクをスクレイピングし、それらのリンクを順番にたどり、繰り返してドメインをクロールすることは可能です (ただし、注意点があり、Web サイトの所有者はそれを好まない/ブロックする可能性があります)。 . これは基本的に Google が行うことです。これにより、ドメイン上の一連の「検出可能な」パスが得られます。これは、クロールする時間や、ページ内の URL をどれだけ精力的に探すかによって、ほぼ完全になります。より実現可能ではありますが、それでも非常に遅く、「すべての」URL が得られるわけではありません。

正確にどのような問題を解決しようとしていますか? ウェブサイト全体をクロールすることはおそらく正しい方法ではありません。最終的な目標をもう少し説明していただければ、現在想像しているよりも優れた行動方針を特定するのに役立ちます.


根底にある問題は、URL への「拡張」に明確な意味があるとは限らないことです。私が Web サイトを運営している場合 (私のサイトがhttp://example.comhttp://subdomain.example.com、またはhttp://example.com/page/関係ない) にスローされた要求に正常に応答するようにサーバーを簡単に構成できます。http://example.com/page/.*「すべてのリクエストを返す」と言うのと同じくらい簡単かもしれませんがHello World.、突然、無限の数の有効なページがあります。Web サーバーと URL は似ていますが、基本的にハード ドライブやファイルと同じではありません。限られた数のファイルを保持するハード ドライブとは異なり、Web サイトは「はい、そのパスは存在します!」と言うことができます。好きなだけリクエストに。これにより、「すべての可能な」URL を取得できなくなります。

さらに、Web サーバーは、有効なページをすべて見つけられるようにすることを望んでいないことがよくあります。おそらく、ログインしている場合、特定の時間帯、または中国からのリクエストにのみアクセスできるようにする必要があります。 URL は常に存在するか、Web サーバーがその存在を通知します。無限 URL の動作を以下に簡単に示すことができhttp://example.com/secret/path/no/one/knows/about/.*ますが、それについて説明しない限り (または、可能性のあるすべての URL を手動でクロールした場合など)、その存在に気付くことはありません。

簡単に言うと、すべての URL を取得することはできません。また、URL のサブセットを取得することもできません。


制限を追加できれば、簡単になります。

あなたがそう思う理由は理解できますが、残念ながらこれは実際には真実ではありません。URL は正規表現のようなものと考えてください。正規表現に一致する文字列の数は.*? 無限の数ですよね?どう/path/.*ですか?以下?それとも/path/that/is/long/and/explicit/.*?直感に反するように思われるかもしれませんが、実際には、最初のケースよりも最後のケースに一致する URL の方が少なくありません

そうは言っても、これまでの私の答えは一般的なケースについてでした。それがあなたが質問を提起した方法だからです。検索スペースを明確に定義して制限するか、質問の要件を緩めると、答えが得られます。代わりに、「このページにリストされていてフィルターに一致するすべての URL を取得することは可能ですか?」と言ったとします。その場合、答えはイエスです。また、場合によっては ( Apache の Directory Listing動作など)、これは偶然にも元の質問に対する回答と同じになります。ただし、これが実際に正しいことを保証する方法はありません。パターンに一致する秘密のリストされていない URL を含むディレクトリ リストを完全に簡単に作成できますが、それらは見つかりません。

于 2013-05-29T04:18:00.850 に答える
0

この質問には良い答えがあります。基本的に、すべてのディレクトリのリストではなく、クローラーが必要な理由を尋ねています。ウィキペディアは、「基本的な前提は、一部のサイトには、フォームとユーザー エントリを使用することによってのみ利用可能な動的ページが多数あるということです」と説明しています。

于 2013-05-29T04:13:32.933 に答える