2016-11-02 7 views
-1

beautifulsoupとurllibを使用してWebクローラーを構築しようとしています。クローラは機能していますが、サイトのすべてのページを開くわけではありません。最初のリンクを開き、そのリンクに行き、そのページの最初のリンクを開きます。 はここに私のコードです:Webクローラーがページ内のすべてのリンクを開けない

from bs4 import BeautifulSoup 
from urllib.request import urlopen 
from urllib.parse import urljoin 
import json, sys 

sys.setrecursionlimit(10000) 

url = input('enter url ') 
d = {} 
d_2 = {} 
l = [] 
url_base = url 
count = 0 

def f(url): 
    global count 
    global url_base 
    if count <= 100: 
     print("count: " + str(count)) 
     print('now looking into: '+url+'\n') 
     count += 1 
     l.append(url) 
     html = urlopen(url).read() 
     soup = BeautifulSoup(html, "html.parser") 
     d[count] = soup 
     tags = soup('a') 

     for tag in tags: 
      meow = tag.get('href',None) 

      if (urljoin(url, meow) in l): 
       print("Skipping this one: " + urljoin(url,meow)) 
      elif "mailto" in urljoin(url,meow): 
       print("Skipping this one with a mailer")  
      elif meow == None: 
       print("skipping 'None'") 

      elif meow.startswith('http') == False: 
       f(urljoin(url, meow))  
      else: 
       f(meow) 
    else: 
     return 


f(url) 
print('\n\n\n\n\n') 
print('Scrapping Completed') 
print('\n\n\n\n\n') 
+0

私はこれがより適切だろうと思っています:http://codereview.stackexchange.com/ – Nicarus

+0

それを制御するルールを使用しないなら、それは決して止まらないでしょう。 – furas

答えて

0

この現象が発生する理由は、コードが再帰的に関数を呼び出すためです。コードが有効なリンクを見つけるとすぐに、関数fが再び呼び出され、forループの残りの部分が復帰するまで実行されなくなります。

あなたのやっていることは深みのある最初の検索ですが、インターネットは非常に深いです。代わりに幅広い最初の検索を行いたいとします。

これを行うためのコードを変更する最も簡単な方法は、フォローするリンクのグローバルリストを作成することです。 forループでこのリストの最後にすべての壊れたリンクを追加し、forループの外側にリストの最初の要素を削除し、そのリンクに従います。

ロジックを少し変更しなければならない場合があります。

+0

ありがとうたくさんの男。それは完璧に働いた。しかし、深さの数を指定することはできますか?私は息の5レベルを最初に検索したいのですか? –

+0

深さレベルを追跡する関数にパラメータを追加します:def f(url、depth) - 再帰的に呼び出すときは、(depth + 1)で呼び出します。冒頭のチェックを追加して、それがあなたの希望の深さを超えている場合にすぐに戻るようにしてください。 – yonomitt

0

countが100に達すると、それ以上のリンクが開かれません。したがって、あなたはforループを離れるとcountを1減らすべきだと思います。これを行うと、countは現在のリンク深さ(100は最大リンク深度)に似ています。

変数countが開かれたリンクの数を参照する必要がある場合は、別の方法でリンクの深さを制御することができます。

関連する問題