2013-05-29 177 views
2

我想如下寫一個函數:是否有可能獲得所有可能的網址?

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']} 

抓取實例和美麗的湯是偉大的,但如果有一些網址並非直接在任一頁面的鏈接,那麼我無法找到它。是的,這通常不是一個問題,但我希望能夠!

+4

除非網站有一個易於解析的網站地圖,否則您可能需要抓取它。 – GWW

+1

「所有可能」有多廣?該頁面上的所有鏈接?整個網站的所有鏈接?你試過什麼了? – Blender

+0

@Blender:我沒有嘗試過任何東西,因爲我無法找到這個庫。看到我不知道如何獲得給定網站上的所有網址,我想知道哪個模塊能夠做到。所有可能的都是,但是會有一個「限制」部分的功能,所以它只能做一些。 –

回答

8

我正在將您的問題解釋爲「給定網址,找到存在於該網址下方的一組網址。」 - 如果這不正確,請更新您的問題,但不是很清楚。

無法發現域上的整個有效路徑集合,唯一的選擇就是從字面上遍歷每個有效的字符,例如, /,/a,/b,/c,...,/aa,....並訪問這些URL中的每一個以確定服務器是否返回200。我希望這顯然不可行。

可以通過訪問預定義的一組頁面來抓取域,儘管存在警告,並且網站所有者可能不喜歡它/阻止您),然後將所有鏈接抓取到頁面之外轉動,然後重複。這基本上是Google所做的。這會爲您提供一組域上的「發現」路徑,根據您抓取的時間長短以及您在頁面中查找網址的方式,這些路徑將完全或多或少完整。雖然更可行,但這仍然非常緩慢,並且不會給你「所有」URL。

你試圖解決什麼問題?抓取整個網站可能不是正確的方式,或許如果你再解釋一下你的最終目標,我們可以幫助確定比你目前想象的更好的行動方案。


潛在的問題是,對URL的「擴展」沒有任何明確的含義。如果我運行一個網站(無論我的網站是否在http://example.comhttp://subdomain.example.comhttp://example.com/page/都無所謂),我可以簡單地配置我的服務器以成功響應您向其發送的任何請求。這可能很簡單,只要說「每個請求http://example.com/page/.*返回Hello World.」並且突然間我有無限數量的有效頁面。 Web服務器和URL類似,但基本上與硬盤和文件不同。與擁有有限數量文件的硬盤驅動器不同,網站可以說「是的,存在的路徑!」儘可能多的請求,因爲它喜歡。這使得獲得「所有可能的」URL是不可能的。

除此之外,網絡服務器通常不會想要您能夠找到所有有效的網頁 - 也許只有在您登錄後,或在一天中的某些時間或來自請求中國 - 沒有要求一直存在URL,或者Web服務器告訴你它存在。我可以非常輕鬆地將我的無限網址行爲放在http://example.com/secret/path/no/one/knows/about/.*以下,除非我告訴過您(或者您手動抓取所有可能的網址......),否則您永遠不會知道它存在。

所以長話短說:不,不可能獲得所有的網址,甚至不可能獲得所有的網址,因爲理論上可能有無數網址,而且您無法知道這是否是案子。


,如果我可以加限制,這將使它更容易!

我明白你爲什麼這樣想,但不幸的是,這並不是真的。考慮像正則表達式這樣的URL。有多少個字符串匹配正則表達式.*?無限的數字,對吧? /path/.*怎麼樣?減?或者/path/that/is/long/and/explicit/.*?雖然看起來很直觀,但there are actually no fewer URLs that match the last case than the first

既然這樣說了,我的回答就是關於一般情況,因爲這就是您提出問題的方式。如果你明確定義和限制搜索空間,或者放寬問題的要求,你可以得到答案。假設您改爲說:「是否有可能獲得本頁面列出的所有網址並匹配我的過濾器?」那麼答案是肯定的。並在某些情況下(如Apache's Directory Listing行爲),這將巧合是與您原來的問題的答案相同。然而,沒有辦法保證這實際上是真的 - 我可以很容易地擁有一個目錄列表,其中包含與您的模式相匹配的祕密,不公開的URL,並且您不會找到它們。

+0

,我添加了一個編輯,使其更加清晰!至於我試圖解決的問題,目前還沒有一個,這只是我想要做的事情 –

+0

無論您是想要一個域中的所有URL的列表還是僅僅在一個子路徑中不幸的是,問題(和問題空間,即可能的URL數量)並不容易。 – dimo414

+0

沒錯,但是如果我可以添加限制,那會更容易!由於你指出的內容,沒有限制地運行這樣的東西是很少見的。 –

0

這個question有個很好的答案。從本質上講,你在問爲什麼爬蟲是必要的,而不是所有目錄的列表。 Wikipedia解釋說:「基本前提是一些網站有大量的動態網頁,只有通過使用表單和用戶條目才能獲得。」

相關問題