Рубрики
Без рубрики

Как построить URL-скамера, чтобы сопоставить сайт с помощью Python

Автор оригинала: FreeCodeCapm Team.

Ахадом Шерифом

Простой проект для изучения оснований веб-соскоба

Прежде чем мы начнем, давайте убедимся, что мы понимаем, какой веб-соскребник:

В этом уроке я хочу продемонстрировать, насколько легко построить простой URL-скамера в Python, который вы можете использовать для карт веб-сайтов. Хотя эта программа относительно проста, она может обеспечить большое введение в основы соскабливания и автоматизации. Мы будем сосредоточены на рекурсивно извлечении ссылок с веб-страниц, но те же идеи могут быть применены к множеству других решений.

Наша программа будет работать так:

  1. Посетите веб-страницу
  2. Scrape все уникальные URL нашли на веб-странице и добавьте их в очередь
  3. Рекурсивно обрабатывать один за другим, пока не исчерпываем очередь
  4. Распечатать результаты

Первые вещи в первую очередь

Первое, что мы должны сделать, это импортировать все необходимые библиотеки. Мы будем использовать Beautifulsoup , Запросы и Урлыб для веб-соска.

from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque

Далее нам нужно выбрать URL для начала ползания. Пока вы можете выбрать любую веб-страницу с HTML-ссылками, я рекомендую использовать Scrapetsite Отказ Это безопасная песочница, которую вы можете ползти, не попадая в беду.

url = "https://scrapethissite.com"

Далее нам придется создать новый Дейко Объект, чтобы мы могли легко добавить вновь найденные ссылки и удалить их, как только мы закончим обработку их. Предварительно заполните укладку вашего URL Переменная:

# a queue of urls to be crawled nextnew_urls = deque([url])

Затем мы можем использовать Установить Для хранения уникальных URL-адресов после того, как они были обработаны:

# a set of urls that we have already processed processed_urls = set()

Мы также хотим отслеживать локальный (тот же домен, что и цель), иностранным (разным доменом в качестве цели), так и разбитые URL:

# a set of domains inside the target websitelocal_urls = set()
# a set of domains outside the target websiteforeign_urls = set()
# a set of broken urlsbroken_urls = set()

Время ползти

Со всеми той на месте мы можем начать писать фактический код для ползания сайта.

Мы хотим посмотреть на каждый URL в очереди, посмотрите, есть ли какие-либо дополнительные URL-адрес на этой странице и добавить каждого к концу очереди, пока не останется ни одного. Как только мы закончим соскоб URL, мы удалим его из очереди и добавьте его в обработка_urls установить для более позднего использования.

# process urls one by one until we exhaust the queuewhile len(new_urls):    # move url from the queue to processed url set    url = new_urls.popleft()    processed_urls.add(url)    # print the current url    print("Processing %s" % url)

Затем добавьте исключение, чтобы поймать все сломанные веб-страницы и добавить их в spring_urls Установите для последующего использования:

try:    response = requests.get(url)
except(requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema):    # add broken urls to it's own set, then continue    broken_urls.add(url)    continue

Затем нам нужно получить базовый URL веб-страницы, чтобы мы могли легко дифференцировать локальные и зарубежные адреса:

# extract base url to resolve relative linksparts = urlsplit(url)base = "{0.netloc}".format(parts)strip_base = base.replace("www.", "")base_url = "{0.scheme}://{0.netloc}".format(parts)path = url[:url.rfind('/')+1] if '/' in parts.path else url

Инициализировать BeautifulSoup для обработки HTML-документа:

soup = BeautifulSoup(response.text, "lxml")

Теперь соскребайте веб-страницу для всех ссылок и сортируйте их в соответствующий набор:

for link in soup.find_all('a'):    # extract link url from the anchor    anchor = link.attrs["href"] if "href" in link.attrs else ''
if anchor.startswith('/'):        local_link = base_url + anchor        local_urls.add(local_link)    elif strip_base in anchor:        local_urls.add(anchor)    elif not anchor.startswith('http'):        local_link = path + anchor        local_urls.add(local_link)    else:        foreign_urls.add(anchor)

Поскольку я хочу только ограничить мою сканет только к локальным адресам, добавляю следующее, чтобы добавить новые URL-адреса в нашу очередь:

for i in local_urls:    if not i in new_urls and not i in processed_urls:        new_urls.append(i)

Если вы хотите заполнить все URL-адреса:

if not link in new_urls and not link in processed_urls:    new_urls.append(link)

Предупреждение: То, как работает программа в настоящее время, ползучая иностранный URL-адрес займет Очень много времени. Вы могли бы попасть в беду для соскабливания веб-сайтов без разрешения. Используйте на свой риск!

Вот все мой код:

И это должно быть это. Вы только что создали простой инструмент для ползания на веб-сайте и отображение всех URL-адресов!

В заключении

Не стесняйтесь строить и улучшить этот код. Например, вы можете изменить программу для поиска веб-страниц для адресов электронной почты или номера телефонов, когда вы затрагиваете их. Вы даже можете расширить функциональность, добавив аргументы командной строки, чтобы обеспечить возможность определить выходные файлы, ограничить поиск глубины и многое другое. Узнайте о том, как создать интерфейсы командной строки для приема аргументов здесь Отказ

Если у вас есть дополнительные рекомендации, советы или ресурсы, пожалуйста, поделитесь в комментариях!

Спасибо за прочтение! Если вам понравилось это учебное пособие и хотите больше контента, как это, обязательно разбивайте, что следуют кнопки. ❤️.

Также обязательно проверьте мой Сайт , Twitter , LinkedIn и Github Отказ