URL-адреса сканирования в Интернете и их URL-адреса рекурсивно - PullRequest
0 голосов
/ 09 марта 2020

поэтому я несколько дней пытался написать этот сканер, и я не знаю, как заставить его работать. Я искал похожие вопросы и решения, но ничего не могу найти, поэтому, пожалуйста, обратитесь к другому вопросу, если он уже был задан.

Мой веб-сканер должен найти n URL-адреса, на которые ссылается первый веб-сайт, а затем найти x URL-адресов, для которых эти n URL-адреса связаны с и так далее, пока не будет достигнута определенная глубина и с определенным количеством URL-адресов на каждом уровне. Например, я ввожу URL, который хочу сканировать, нахожу 3 ссылки, 3 ссылки на каждый из этих 3 URL и т. Д. 1 + 3 ^ 1 + 3 ^ 2 + 3 ^ 4 ... URL. Пока я написал это, но я не могу заставить его работать так, как я хочу.

from bs4 import BeautifulSoup
import requests

url = 'http://www.baidu.com'
depth = 3 #3 levels
count = 3 #amount of urls in each level

def extractURL(url, depth, count):
  list = []
  response = requests.get(url)
  soup = BeautifulSoup(response.text, 'lxml')
  tags = soup.find_all('a')
  newtags = tags[:depth]
  for link in newtags:
      url2 = link.get('href')
      if url2 is not None and url2.startswith("http"):
          list.append(url2)
  for url3 in list:
      if(count > 0):
          if not url3 is None and "http" in url:
             print(url, "->", url3)
             count = count-1
             print("----------------") #divider for each url and connecting urls..?
             extractURL(url3, depth, count)

extractURL(url, depth, count)
print("Done")

Смысл в том, чтобы он напечатал "url -> (linking) url2". Я думаю, что мой счетчик не работает, поскольку он никогда не сбрасывается, но я понятия не имею, как решить эту проблему. Заранее спасибо!

1 Ответ

1 голос
/ 09 марта 2020

Вы можете использовать этот код для извлечения ссылок. Вы должны отделить каждый слой ссылок, чтобы исключить дублирование анализа ссылок

from bs4 import BeautifulSoup
import requests

url = 'http://www.baidu.com'
depth = 3  # 3 levels
count = 3  # amount of urls in each level
url_list_depth = [[] for i in range(0, depth + 1)]
url_list_depth[0].append(url)
for depth_i in range(0, depth):
    for links in url_list_depth[depth_i]:
        response = requests.get(links)
        soup = BeautifulSoup(response.text, 'html.parser')
        tags = soup.find_all('a')
        for link in tags:
            url_new = link.get('href')
            flag = False
            for item in url_list_depth:
                for l in item:
                    if url_new == l:
                        flag = True

            if url_new is not None and "http" in url_new and flag is False:
                url_list_depth[depth_i + 1].append(url_new)
                print(links, "->", url_new)

print('Done')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...