Автор оригинала: FreeCodeCapm Team.
Ахадом Шерифом
Простой проект для изучения оснований веб-соскоба
Прежде чем мы начнем, давайте убедимся, что мы понимаем, какой веб-соскребник:
В этом уроке я хочу продемонстрировать, насколько легко построить простой URL-скамера в Python, который вы можете использовать для карт веб-сайтов. Хотя эта программа относительно проста, она может обеспечить большое введение в основы соскабливания и автоматизации. Мы будем сосредоточены на рекурсивно извлечении ссылок с веб-страниц, но те же идеи могут быть применены к множеству других решений.
Наша программа будет работать так:
- Посетите веб-страницу
- Scrape все уникальные URL нашли на веб-странице и добавьте их в очередь
- Рекурсивно обрабатывать один за другим, пока не исчерпываем очередь
- Распечатать результаты
Первые вещи в первую очередь
Первое, что мы должны сделать, это импортировать все необходимые библиотеки. Мы будем использовать 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 Отказ