0

指定されたアドレスのすべてのサイトのリンクとリンクからのテキストを提供する Web クローラーを作成しました。次のようになります。

import urllib
from bs4 import BeautifulSoup
import urlparse
import mechanize

url = ["http://adbnews.com/area51"]


for u in url:
    br = mechanize.Browser()
    urls = [u]
    visited = [u]
    i = 0
    while i<len(urls):
        try:
            br.open(urls[0])
            urls.pop(0)

            for link in br.links():

                levelLinks = []
                linkText = [] 

                newurl = urlparse.urljoin(link.base_url, link.url)
                b1 = urlparse.urlparse(newurl).hostname
                b2 = urlparse.urlparse(newurl).path
                newurl = "http://"+b1+b2
                linkTxt = link.text
                linkText.append(linkTxt)
                levelLinks.append(newurl)


                if newurl not in visited and urlparse.urlparse(u).hostname in newurl:
                    urls.append(newurl)
                    visited.append(newurl)
                    #print newurl

                    #get Mechanize Links
                    for l,lt in zip(levelLinks,linkText):
                        print newurl,"\n",lt,"\n"


        except:
            urls.pop(0)

次のような結果が得られます。

http://www.adbnews.com/area51/contact.html 
CONTACT 

http://www.adbnews.com/area51/about.html 
ABOUT 

http://www.adbnews.com/area51/index.html 
INDEX 

http://www.adbnews.com/area51/1st/ 
FIRST LEVEL! 

http://www.adbnews.com/area51/1st/bling.html 
BLING 

http://www.adbnews.com/area51/1st/index.html 
INDEX 

http://adbnews.com/area51/2nd/ 
2ND LEVEL 

そして、クローラーの深さを制限できる何らかのカウンターを追加したいと思います..

たとえばsteps = 3、追加して変更しようとwhile i<len(urls)しましたwhile i<steps:

しかし、それは数字が3と言っても最初のレベルにしか行きません...

どんなアドバイスでも大歓迎です

4

1 に答える 1

0

特定の「深さ」を検索する場合は、URL のリストを追加するだけでなく、再帰関数の使用を検討してください。

def crawl(url, depth):
  if depth <= 3:
    #Scan page, grab links, title
    for link in links:
      print crawl(link, depth + 1)
  return url +"\n"+ title

これにより、再帰検索をより簡単に制御できるだけでなく、より高速でリソースの負担が少なくなります:)

于 2013-08-06T08:38:59.327 に答える