2014-06-21 132 views
-2

我正在學習構建網絡抓取工具,並且正在努力從網站獲取所有網址。我一直在玩,沒有像以前一樣的代碼,但我已經能夠獲得所有的鏈接,但我的問題是遞歸,我需要一遍又一遍地做同樣的事情,但是我認爲我的問題是遞歸它所做的對我寫的代碼來說是正確的。我的代碼是波紋管使用python從網站獲取所有網址

#!/usr/bin/python 
import urllib2 
import urlparse 
from BeautifulSoup import BeautifulSoup 

def getAllUrl(url): 
    page = urllib2.urlopen(url).read() 
    urlList = [] 
    try: 
     soup = BeautifulSoup(page) 
     soup.prettify() 
     for anchor in soup.findAll('a', href=True): 
      if not 'http://' in anchor['href']: 
       if urlparse.urljoin('http://bobthemac.com', anchor['href']) not in urlList: 
        urlList.append(urlparse.urljoin('http://bobthemac.com', anchor['href'])) 
      else: 
       if anchor['href'] not in urlList: 
        urlList.append(anchor['href']) 

     length = len(urlList) 

     for url in urlList: 
      getAllUrl(url) 

     return urlList 
    except urllib2.HTTPError, e: 
     print e 

if __name__ == "__main__": 
    urls = getAllUrl('http://bobthemac.com') 
    for x in urls: 
     print x 

我試圖做到的,是讓所有的網址,與目前的設置程序中的站點運行,直到它運行的內存中的所有我想要的是得到一個網址現場。有沒有人有任何想法如何做到這一點,認爲我有正確的想法只需要一些小的代碼更改。

編輯

對於那些你有什麼intrested波紋管是我的工作代碼,得到了現場所有的人的URS可能會發現它很有用。這不是最好的代碼,需要一些工作,但有一些工作可能會很好。

#!/usr/bin/python 
import urllib2 
import urlparse 
from BeautifulSoup import BeautifulSoup 

def getAllUrl(url): 
urlList = [] 
try: 
    page = urllib2.urlopen(url).read() 
    soup = BeautifulSoup(page) 
    soup.prettify() 
    for anchor in soup.findAll('a', href=True): 
     if not 'http://' in anchor['href']: 
      if urlparse.urljoin('http://bobthemac.com', anchor['href']) not in urlList: 
       urlList.append(urlparse.urljoin('http://bobthemac.com', anchor['href'])) 
     else: 
      if anchor['href'] not in urlList: 
       urlList.append(anchor['href']) 

    return urlList 

except urllib2.HTTPError, e: 
    urlList.append(e) 

if __name__ == "__main__": 
urls = getAllUrl('http://bobthemac.com') 

fullList = [] 

for x in urls: 
    listUrls = list 
    listUrls = getAllUrl(x) 
    try: 
     for i in listUrls: 
      if not i in fullList: 
       fullList.append(i) 
    except TypeError, e: 
     print 'Woops wrong content passed' 

for i in fullList: 
    print i 
+0

看起來你的函數不返回任何東西。 –

+0

是的,這是一個正在進行的工作,'print urlList'是返回的地方,我只是想玩它。編輯以顯示返回時的情況。 – bobthemac

+0

當人們無理由地給出負面標記時,恨它 – bobthemac

回答

1

在你的功能getAllUrl,你在for循環再打電話getAllUrl,它使一個遞歸。

元素一旦放入urlList就不會被移出,所以urlList永遠不會爲空,然後,遞歸永遠不會中斷。

這就是爲什麼你的程序永遠不會結束使用內存不足的原因。

+0

我知道這個我站在這裏我可能沒有解釋我需要什麼我正在尋找做一些遞歸。 – bobthemac

+0

我無法用幾句話來解釋它,但我爲類似的工作(遞歸抓取鏈接)寫了一個lib,這裏是一個鏈接:https://github.com/zhaoqifa/scod/blob/master/lib/utils。 PY。開始使用'crawl_links'函數。 – WKPlus

+0

感謝您設法讓它在最終排序中指出我幫助我的功能,但可能不是您的想法。一些小的調整讓我得到了正確的代碼,效果很好。這可能會更快,我會在上面發佈。 – bobthemac

1

我想這樣的作品:

#!/usr/bin/python 
import urllib2 
import urlparse 
from BeautifulSoup import BeautifulSoup 

def getAllUrl(url): 
    try: 
     page = urllib2.urlopen(url).read() 
    except: 
     return [] 
    urlList = [] 
    try: 
     soup = BeautifulSoup(page) 
     soup.prettify() 
     for anchor in soup.findAll('a', href=True): 
      if not 'http://' in anchor['href']: 
       if urlparse.urljoin(url, anchor['href']) not in urlList: 
        urlList.append(urlparse.urljoin(url, anchor['href'])) 
      else: 
       if anchor['href'] not in urlList: 
        urlList.append(anchor['href']) 

     length = len(urlList) 

     return urlList 
    except urllib2.HTTPError, e: 
     print e 

def listAllUrl(urls): 
    for x in urls: 
     print x 
     urls.remove(x) 
     urls_tmp = getAllUrl(x) 
     for y in urls_tmp: 
      urls.append(y) 


if __name__ == "__main__": 
    urls = ['http://bobthemac.com'] 
    while(urls.count>0): 
     urls = getAllUrl('http://bobthemac.com') 
     listAllUrl(urls) 
+0

這和我剛剛做的事情一樣,找到頁面上的鏈接,然後重複它們。 – bobthemac

+0

我在print(x)後用一行urls.remove(x)編輯了代碼,這樣即使遞歸完成,內存也不會被收回。您可以通過添加帶有urls.remove(x)註釋和取消註釋的行的print len(url)來檢查差異。 –