Как получить ссылку из тега python
Перейти к содержимому

Как получить ссылку из тега python

  • автор:

Python Beautifulsoup Как достать ссылку из тега ?

Почему я не могу спарсить ссылку из тега ? Я делаю вроде всё правильно. Этот вопрос связан с моим предыдущим вопросом. Я хочу, чтобы выдавало ссылку, а выдаёт None. Сам код:

def get_content(html): soup = BeautifulSoup(html, 'html.parser') items = soup.find_all('section', class_='proposition') cars = [] for item in items: titles = None if titles_tag := item.find('div', class_='proposition_title'): if titles_1_tag := titles_tag.find('h3'): titles = titles_1_tag.get_text(strip=True) links = None if links_tag := item.find('section', class_='proposition'): if links_1_tag := links_tag.find('a'): links = links_1_tag.get('href') usd_prices = None if usd_prices_tag := item.find('div', class_='proposition_price'): if usd_prices_1_tag := usd_prices_tag.find('span'): usd_prices = usd_prices_1_tag.get_text(strip=True) cars.append( < 'title': titles, 'link': links, 'usd_price': usd_prices, >) print(cars) 

Проблема в:

links = None if links_tag := item.find('section', class_='proposition'): if links_1_tag := links_tag.find('a'): links = links_1_tag.get('href') 

Если нужно, то скину сайт, на котором я парсю.

Как с помощью в Python извлечь все ссылки на веб‑сайты

Извлечение всех ссылок на веб-странице — обычная задача для веб-парсеров, полезно создавать продвинутые парсеры, которые сканируют каждую страницу определенного веб-сайта для извлечения данных, его также можно использовать для процесса диагностики SEO или даже на этапе сбора информации для проникновения. тестеры. В этом руководстве я расскажу, как с нуля на Python создать инструмент для извлечения ссылок, используя только запросы и библиотеки BeautifulSoup.

pip3 install requests bs4 colorama

Откроем новый файл Python и импортируем необходимые нам модули:

import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup import colorama

Мы собираемся использовать colorama только для использования разных цветов при печати, чтобы различать внутренние и внешние ссылки:

# init the colorama module colorama.init() GREEN = colorama.Fore.GREEN GRAY = colorama.Fore.LIGHTBLACK_EX RESET = colorama.Fore.RESET YELLOW = colorama.Fore.YELLOW

Нам понадобятся две глобальные переменные, одна для всех внутренних ссылок сайта, а другая для всех внешних ссылок:

# initialize the set of links (unique links) internal_urls = set() external_urls = set()
  • Внутренние ссылки — это URL-адреса, которые ведут на другие страницы того же веб-сайта.
  • Внешние ссылки — это URL-адреса, которые ведут на другие веб-сайты.

Поскольку не все ссылки в тегах привязки (теги) действительны (я экспериментировал с этим), некоторые из них являются ссылками на части веб-сайта, некоторые — javascript, поэтому давайте наишем функцию для проверки URL-адресов:

def is_valid(url): """ Проверяет, является ли url допустимым """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme)

Здесь проверяем наличие в URL-адресе правильной схемы (протокола, например http или https) и имени домена.

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

def get_all_website_links(url): """ Возвращает все найденные URL-адреса на `url, того же веб-сайта. """ # все URL-адреса `url` urls = set() # доменное имя URL без протокола domain_name = urlparse(url).netloc soup = BeautifulSoup(requests.get(url).content, "html.parser")

Во-первых, инициализирована переменную urls набора URL-адресов, использован set Python, так-как нам не нужны лишние повторяющиеся ссылки.

Во-вторых, извлекается доменное имя из URL-адреса, которое понадобится для проверки полученных ссылок, на предмет внешних или внутренних.

В третьих, загружен HTML-контент веб-страницы, который обернул объектом soup для облегчения синтаксического анализа HTML.

Получим все HTML-теги (теги привязки, содержащие все ссылки на веб-страницы):

for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # пустой тег href continue

Итак, мы получаем атрибут href и проверяем, есть ли там что-нибудь. В противном случае мы просто переходим к следующей ссылке.

Поскольку не все ссылки являются абсолютными, нам нужно будет объединить относительные URL-адреса с его доменным именем (например, когда href равен «/search», а url равен «google.com», результатом будет «google.com/search»):

# присоединяемся к URL, если он относительный (не абсолютная ссылка) href = urljoin(url, href)

Теперь нам нужно удалить параметры HTTP GET из URL-адресов, поскольку это приведет к избыточности в наборе, приведенный ниже код для этого:

parsed_href = urlparse(href) # удалить параметры URL GET, фрагменты URL и т. д. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path
if not is_valid(href): # недействительный URL continue if href in internal_urls: # уже в наборе continue if domain_name not in href: # внешняя ссылка if href not in external_urls: print(f"[!] External link: ") external_urls.add(href) continue print(f"[*] Internal link: ") urls.add(href) internal_urls.add(href) return urls

В сухом остатке всё, что здесь сделано и проверяется:

  • Если URL-адрес недействителен, перейдём к следующей ссылке.
  • Если URL-адрес уже находится в internal_urls , нам он уже не нужен.
  • Если URL-адрес является внешней ссылкой, распечатаем её серым цветом и добавив в наш глобальный набор external_urls , перейдём к следующей ссылке.

Наконец, после всех проверок URL будет внутренней ссылкой, распечатываем её и добавляем в наши наборы urls и internal_urls .

Вышеупомянутая функция будет захватывать только ссылки одной конкретной страницы, что, если мы хотим извлечь все ссылки всего веб-сайта? Сделаем это:

# количество посещенных URL-адресов будет сохранено здесь total_urls_visited = 0 def crawl(url, max_urls=30): """ Сканирует веб-страницу и извлекает все ссылки. Все ссылки будут в глобальных переменных набора external_urls и internal_urls. параметры: max_urls (int): максимальное количество URL-адресов для сканирования, по умолчанию 30 """ global total_urls_visited total_urls_visited += 1 print(f"[*] Crawling: ") links = get_all_website_links(url) for link in links: if total_urls_visited > max_urls: break crawl(link, max_urls=max_urls)

Эта функция сканирует веб-сайт, что означает, что она получает все ссылки первой страницы, а затем рекурсивно вызывает себя, чтобы перейти по всем ранее извлеченным ссылкам. Однако это может вызвать некоторые проблемы, программа будет зависать на крупных веб-сайтах (на которых есть много ссылок), таких как google.com, поэтому, добавлен параметр max_urls для выхода, когда мы достигаем определенного количества проверенных URL.

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

if __name__ == "__main__": crawl("https://www.thepythoncode.com") print("[+] Total Internal links:", len(internal_urls)) print("[+] Total External links:", len(external_urls)) print("[+] Total URLs:", len(external_urls) + len(internal_urls)) print("[+] Total crawled URLs:", max_urls)

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

Вот часть вывода:
Тут нужна картинка

После завершения сканирования будет выведено общее количество извлеченных и просканированных ссылок:

[+] Total Internal links: 90 [+] Total External links: 137 [+] Total URLs: 227 [+] Total crawled URLs: 30

Классно, правда? Я надеюсь, что этот рецепт будет вам полезен и вдохновит на создание подобных инструментов с использованием Python.

Я собрал все фрагменты и немного отредактировал код для сохранения найденных URL-адресов в файле, а также для получения URL-адреса из аргументов командной строки функции main, посмотрите содержимое файла link_extractor.py.

import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup import colorama # запускаем модуль colorama colorama.init() GREEN = colorama.Fore.GREEN GRAY = colorama.Fore.LIGHTBLACK_EX RESET = colorama.Fore.RESET YELLOW = colorama.Fore.YELLOW # инициализировать set's для внутренних и внешних ссылок (уникальные ссылки) internal_urls = set() external_urls = set() total_urls_visited = 0 def is_valid(url): """ Проверка url """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme) def get_all_website_links(url): """ Возвращает все найденные URL-адреса на `url, того же веб-сайта. """ # все URL-адреса `url` urls = set() # доменное имя URL без протокола domain_name = urlparse(url).netloc soup = BeautifulSoup(requests.get(url).content, "html.parser") for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # пустой тег href continue # присоединяемся к URL, если он относительный (не абсолютная ссылка) href = urljoin(url, href) parsed_href = urlparse(href) # удалить параметры URL GET, фрагменты URL и т. д. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path if not is_valid(href): # неверный URL continue if href in internal_urls: # уже в наборе continue if domain_name not in href: # внешняя ссылка if href not in external_urls: print(f"[!] Внешняя ссылка: ") external_urls.add(href) continue print(f"[*] Внутреннея ссылка: ") urls.add(href) internal_urls.add(href) return urls def crawl(url, max_urls=30): """ Сканирует веб-страницу и извлекает все ссылки. Вы найдете все ссылки в глобальных переменных набора external_urls и internal_urls. параметры: max_urls (int): максимальное количество URL-адресов для сканирования, по умолчанию 30. """ global total_urls_visited total_urls_visited += 1 print(f"[*] Проверено: ") links = get_all_website_links(url) for link in links: if total_urls_visited > max_urls: break crawl(link, max_urls=max_urls) if __name__ == "__main__": import argparse """ parser = argparse.ArgumentParser(description="Link Extractor Tool with Python") parser.add_argument("url", help="The URL to extract links from.") parser.add_argument("-m", "--max-urls", help="Number of max URLs to crawl, default is 30.", default=30, type=int) args = parser.parse_args() url = args.url max_urls = args.max_urls """ url = 'https://alumnus.susu.ru' max_urls = 500 crawl(url, max_urls=max_urls) print("[+] Total Internal links:", len(internal_urls)) print("[+] Total External links:", len(external_urls)) print("[+] Total URLs:", len(external_urls) + len(internal_urls)) print("[+] Total crawled URLs:", max_urls) domain_name = urlparse(url).netloc # сохранить внутренние ссылки в файле with open(f"_internal_links.txt", "w") as f: for internal_link in internal_urls: print(internal_link.strip(), file=f) # сохранить внешние ссылки в файле with open(f"_external_links.txt", "w") as f: for external_link in external_urls: print(external_link.strip(), file=f)

Есть некоторые веб-сайты, которые загружают большую часть своего контента с помощью JavaScript, в результате нам нужно вместо этого использовать библиотеку request_html , которая позволяет нам выполнять Javascript с помощью Chromium . Я уже написал для этого сценарий, добавив всего несколько строк (поскольку request_html очень похож на requests ). Вот посмотрите код записанный в файле link_extractor_js.py:

from requests_html import HTMLSession from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup import colorama # init the colorama module colorama.init() GREEN = colorama.Fore.GREEN GRAY = colorama.Fore.LIGHTBLACK_EX RESET = colorama.Fore.RESET YELLOW = colorama.Fore.YELLOW # initialize the set of links (unique links) internal_urls = set() external_urls = set() total_urls_visited = 0 def is_valid(url): """ Checks whether `url` is a valid URL. """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme) def get_all_website_links(url): """ Returns all URLs that is found on `url` in which it belongs to the same website """ # all URLs of `url` urls = set() # domain name of the URL without the protocol domain_name = urlparse(url).netloc # initialize an HTTP session session = HTMLSession() # make HTTP request & retrieve response response = session.get(url) # execute Javascript try: response.html.render() except: pass soup = BeautifulSoup(response.html.html, "html.parser") for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # href empty tag continue # join the URL if it's relative (not absolute link) href = urljoin(url, href) parsed_href = urlparse(href) # remove URL GET parameters, URL fragments, etc. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path if not is_valid(href): # not a valid URL continue if href in internal_urls: # already in the set continue if domain_name not in href: # external link if href not in external_urls: print(f"[!] External link: ") external_urls.add(href) continue print(f"[*] Internal link: ") urls.add(href) internal_urls.add(href) return urls def crawl(url, max_urls=30): """ Crawls a web page and extracts all links. You'll find all links in `external_urls` and `internal_urls` global set variables. params: max_urls (int): number of max urls to crawl, default is 30. """ global total_urls_visited total_urls_visited += 1 print(f"[*] Crawling: ") links = get_all_website_links(url) for link in links: if total_urls_visited > max_urls: break crawl(link, max_urls=max_urls) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Link Extractor Tool with Python") parser.add_argument("url", help="The URL to extract links from.") parser.add_argument("-m", "--max-urls", help="Number of max URLs to crawl, default is 30.", default=30, type=int) args = parser.parse_args() url = args.url max_urls = args.max_urls crawl(url, max_urls=max_urls) print("[+] Total Internal links:", len(internal_urls)) print("[+] Total External links:", len(external_urls)) print("[+] Total URLs:", len(external_urls) + len(internal_urls)) print("[+] Total crawled URLs:", max_urls) domain_name = urlparse(url).netloc # save the internal links to a file with open(f"_internal_links.txt", "w") as f: for internal_link in internal_urls: print(internal_link.strip(), file=f) # save the external links to a file with open(f"_external_links.txt", "w") as f: for external_link in external_urls: print(external_link.strip(), file=f)

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

Если вы хотите вместо этого получать изображения, проверьте это руководство: Как загрузить все изображения с веб-страницы в Python, или, если вы хотите извлечь таблицы HTML, проверьте это руководство.

Print Friendly, PDF & Email

Как с помощью в Python извлечь все ссылки на веб‑сайты , опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха

Как в Python извлечь все ссылки на веб‑странице

Получение всех ссылок на веб-странице — обычная задача для веб-парсеров, полезно создавать продвинутые парсеры, которые сканируют каждую страницу определенного веб-сайта для извлечения данных, его также можно использовать для процесса диагностики SEO или даже на этапе сбора информации для проникновения. тестеры. Здесь узнаете, как создать инструмент для извлечения ссылок на Python с нуля, используя только библиотеки requests и BeautifulSoup .

pip3 install requests bs4 colorama

Мы будем использовать requests для удобного выполнения HTTP-запросов, BeautifulSoup для синтаксического анализа HTML и colorama для изменения цвета текста.

Откройте новый файл, назовем его link_extractor.py и следуйте инструкциям, импортируем необходимые нам модули:

import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup import colorama

Мы собираемся использовать colorama только для раскраски текста при печати, чтобы различать внутренние и внешние ссылки:

# инициализация модуля colorama colorama.init() GREEN = colorama.Fore.GREEN GRAY = colorama.Fore.LIGHTBLACK_EX RESET = colorama.Fore.RESET YELLOW = colorama.Fore.YELLOW

Нам понадобятся две глобальные переменные, одна для всех внутренних ссылок сайта, а другая для всех внешних ссылок:

# инициализация наборов для ссылок (обеспечивается уникальность ссылок) internal_urls = set() external_urls = set()
  • internal_urls — URL-адреса, которые ведут на другие страницы того же веб-сайта.
  • external_urls — URL-адреса, которые ведут на другие веб-сайты.

Поскольку не все ссылки в тегах привязки (теги) действительны, я это проверял, некоторые из них являются ссылками на части веб-сайта, некоторые — javascript, поэтому напишем функцию для проверки URL-адресов:

def is_valid(url): """ Проверяет, является ли 'url' действительным URL """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme)

Признаком истинности ссылки являются наличие в URL-адресе правильной scheme (протокола, например http или https) и имени домена netloc.

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

def get_all_website_links(url): """ Возвращает все URL-адреса, найденные на `url`, в котором он принадлежит тому же веб-сайту. """ # все URL-адреса `url` urls = set() # доменное имя URL без протокола domain_name = urlparse(url).netloc soup = BeautifulSoup(requests.get(url).content, "html.parser")

Во-первых, я инициализировал переменную набора URL-адресов, здесь я использовал set Python, потому как нам не нужны повторяющиеся ссылки.

Во-вторых, я извлек доменное имя из URL-адреса, которое нам понадобится, для проверки, является ли полученная ссылка внешней или внутренней.

В третьих, я загрузил HTML-содержимое веб-страницы и обернул его объектом soup для облегчения синтаксического анализа HTML.

Получим все HTML-теги a (теги привязки, содержащие все ссылки веб-страницы):

for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # href пустой тег continue

Поскольку не все ссылки являются абсолютными, нам нужно объединить относительные URL-адреса с их доменными именами (например, когда href равно « /search », а url — « google.com », результатом будет « google.com/search »):

# присоединяемся к URL, если он относительный (не абсолютная ссылка) href = urljoin(url, href)

Теперь нам нужно удалить GET-параметры HTTP из URL-адресов, поскольку это приведет к избыточности в наборе, приведенный ниже код обрабатывает это:

parsed_href = urlparse(href) # удалить GET-параметры URL, фрагменты URL и т. д. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path
if not is_valid(href): # недействительный URL continue if href in internal_urls: # уже в наборе continue if domain_name not in href: # внешняя ссылка if href not in external_urls: print(f"[!] Внешняя ссылка: ") external_urls.add(href) continue print(f"[*] Внутренняя ссылка: ") urls.add(href) internal_urls.add(href) return urls

Все, что мы здесь сделали, это проверили:

  • Если URL-адрес недействителен, перейдите к следующей ссылке.
  • Если URL-адрес уже находится в internal_urls , нам это тоже не нужно.
  • Если URL-адрес является внешней ссылкой, распечатайте ее серым цветом и добавьте в наш глобальный набор external_urls и перейдите к следующей ссылке.

Наконец, после всех проверок URL будет внутренней ссылкой, мы распечатываем его и добавляем в наши наборы urls и internal_urls .

Вышеупомянутая функция будет захватывать только ссылки одной конкретной страницы, что, если мы хотим извлечь все ссылки всего веб-сайта? Давай сделаем это:

# number of urls visited so far will be stored here total_urls_visited = 0 def crawl(url, max_urls=30): """ Сканирует веб-страницу и извлекает все ссылки. Вы найдете все ссылки в глобальных переменных набора external_urls и internal_urls. параметры: max_urls (int): максимальное количество URL-адресов для сканирования, по умолчанию - 30. """ global total_urls_visited total_urls_visited += 1 print(f"[*] Проверено: ") links = get_all_website_links(url) for link in links: if total_urls_visited > max_urls: break crawl(link, max_urls=max_urls)

Эта функция сканирует веб-сайт, что означает, что она получает все ссылки первой страницы, а затем рекурсивно вызывает себя, чтобы перейти по всем ранее извлеченным ссылкам. Однако это может вызвать некоторые проблемы, программа будет зависать на крупных веб-сайтах (на которых есть много ссылок), таких как google.com, в результате, был добавлен параметр max_urls для выхода, когда мы достигаем определенного количества проверенных URL.

Хорошо, давайте проверим это, используя известный вам url:

if __name__ == "__main__": crawl('https://waksoft.susu.ru') print("[+] Итого внутренних ссылок:", len(internal_urls)) print("[+] Итого внешних ссылок:", len(external_urls)) print("[+] Итого URL:", len(external_urls) + len(internal_urls)) print("[+] Всего просканировано URL:", max_urls)

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

Как в Python извлечь все ссылки на веб-странице

Вот часть вывода:

После завершения сканирования будет выведено общее количество извлеченных и просканированных ссылок:

[+] Итого внутренних ссылок: 211 [+] Итого внешних ссылок: 144 [+] Итого URL: 355 [+] Всего проверено URL: 30

Классно, правда? Я надеюсь, что это руководство было для вас полезным и вдохновило вас на создание таких инструментов с использованием Python.

Вот полный код утилиты для автономной работы:

import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup import colorama # запускаем модуль colorama colorama.init() GREEN = colorama.Fore.GREEN GRAY = colorama.Fore.LIGHTBLACK_EX RESET = colorama.Fore.RESET YELLOW = colorama.Fore.YELLOW # инициализировать набор ссылок (уникальные ссылки) internal_urls = set() external_urls = set() total_urls_visited = 0 def is_valid(url): """ Проверяет, является ли url действительным URL """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme) def get_all_website_links(url): """ Возвращает все URL-адреса, найденные на `url`, в котором он принадлежит тому же веб-сайту. """ # все URL-адреса `url` urls = set() # доменное имя URL без протокола domain_name = urlparse(url).netloc soup = BeautifulSoup(requests.get(url).content, "html.parser") for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # href пустой тег continue # присоединяемся к URL, если он относительный (не абсолютная ссылка) href = urljoin(url, href) parsed_href = urlparse(href) # удалить GET-параметры URL, фрагменты URL и т. д. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path if not is_valid(href): # недействительный URL continue if href in internal_urls: # уже в наборе continue if domain_name not in href: # внешняя ссылка if href not in external_urls: print(f"[!] Внешняя ссылка: ") external_urls.add(href) continue print(f"[*] Внутренняя ссылка: ") urls.add(href) internal_urls.add(href) return urls def crawl(url, max_urls=30): """ Сканирует веб-страницу и извлекает все ссылки. Вы найдете все ссылки в глобальных переменных набора external_urls и internal_urls. параметры: max_urls (int): максимальное количество URL-адресов для сканирования, по умолчанию - 30. """ global total_urls_visited total_urls_visited += 1 print(f"[*] Проверена ссылка: ") links = get_all_website_links(url) for link in links: if total_urls_visited > max_urls: break crawl(link, max_urls=max_urls) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Инструмент получения ссылок на web-странице") parser.add_argument("url", help="URL, по которому надо получить все ссылки") parser.add_argument("-m", "--max-urls", help="Максимальное количество получаемых ссылок URL, по умолчанию 30.", default=30, type=int) args = parser.parse_args() url = args.url max_urls = args.max_urls crawl(url, max_urls=max_urls) print("[+] Итого внутренних ссылок:", len(internal_urls)) print("[+] Итого внешних ссылок:", len(external_urls)) print("[+] Итого URL:", len(external_urls) + len(internal_urls)) print("[+] Всего проверено URL:", max_urls) domain_name = urlparse(url).netloc # сохраняем внутренние ссылки в файл with open(f"_internal_links.txt", "w") as f: for internal_link in internal_urls: print(internal_link.strip(), file=f) # сохраняем внешние ссылки в файл with open(f"_external_links.txt", "w") as f: for external_link in external_urls: print(external_link.strip(), file=f)

Есть некоторые веб-сайты, которые загружают большую часть своего контента с помощью JavaScript, в результате нам нужно вместо этого использовать библиотеку request_html, которая позволяет нам выполнять Javascript с помощью Chromium. Я уже написал для этого сценарий, добавив всего несколько строк (поскольку request_html очень похож на requests), посмотрите.

from requests_html import HTMLSession from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup import colorama # init the colorama module colorama.init() GREEN = colorama.Fore.GREEN GRAY = colorama.Fore.LIGHTBLACK_EX RESET = colorama.Fore.RESET YELLOW = colorama.Fore.YELLOW # initialize the set of links (unique links) internal_urls = set() external_urls = set() total_urls_visited = 0 def is_valid(url): """ Checks whether `url` is a valid URL. """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme) def get_all_website_links(url): """ Returns all URLs that is found on `url` in which it belongs to the same website """ # all URLs of `url` urls = set() # domain name of the URL without the protocol domain_name = urlparse(url).netloc # initialize an HTTP session session = HTMLSession() # make HTTP request & retrieve response response = session.get(url) # execute Javascript try: response.html.render() except: pass soup = BeautifulSoup(response.html.html, "html.parser") for a_tag in soup.findAll("a"): href = a_tag.attrs.get("href") if href == "" or href is None: # href empty tag continue # join the URL if it's relative (not absolute link) href = urljoin(url, href) parsed_href = urlparse(href) # remove URL GET parameters, URL fragments, etc. href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path if not is_valid(href): # not a valid URL continue if href in internal_urls: # already in the set continue if domain_name not in href: # external link if href not in external_urls: print(f"[!] External link: ") external_urls.add(href) continue print(f"[*] Internal link: ") urls.add(href) internal_urls.add(href) return urls def crawl(url, max_urls=30): """ Crawls a web page and extracts all links. You'll find all links in `external_urls` and `internal_urls` global set variables. params: max_urls (int): number of max urls to crawl, default is 30. """ global total_urls_visited total_urls_visited += 1 print(f"[*] Crawling: ") links = get_all_website_links(url) for link in links: if total_urls_visited > max_urls: break crawl(link, max_urls=max_urls) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Link Extractor Tool with Python") parser.add_argument("url", help="The URL to extract links from.") parser.add_argument("-m", "--max-urls", help="Number of max URLs to crawl, default is 30.", default=30, type=int) args = parser.parse_args() url = args.url max_urls = args.max_urls crawl(url, max_urls=max_urls) print("[+] Total Internal links:", len(internal_urls)) print("[+] Total External links:", len(external_urls)) print("[+] Total URLs:", len(external_urls) + len(internal_urls)) print("[+] Total crawled URLs:", max_urls) domain_name = urlparse(url).netloc # save the internal links to a file with open(f"_internal_links.txt", "w") as f: for internal_link in internal_urls: print(internal_link.strip(), file=f) # save the external links to a file with open(f"_external_links.txt", "w") as f: for external_link in external_urls: print(external_link.strip(), file=f)

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

Print Friendly, PDF & Email

Как в Python извлечь все ссылки на веб‑странице , опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха

Как использовать библиотеку BeautifulSoup4 в Python

Веб парсинг – это процесс автоматического извлечения данных со страниц сайтов, при котором используются специальные программы. Он основан на анализе HTML-кода страницы и извлечении нужной информации для дальнейшего использования. Веб парсинг позволяет получать текст, изображения, ссылки и другую информацию, размещенную на веб-странице. Также этот процесс называют веб-скрейпинг, от английского слова “scraping” – “соскоб”.

Для веб-парсинга используются специализированные инструменты и программы, которые могут анализировать HTML-код страницы, извлекать нужные данные и сохранять их в структурированном формате, например, в базе данных или Excel-таблице.

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

Парсинг может быть невозможен при наличии правовых ограничений, автоматических систем защиты от парсинга (например, CAPTCHA) или изменений в структуре HTML-кода страницы.

Что такое библиотека BeautifulSoup

BeautifulSoup – это библиотека для парсинга HTML и XML документов в Python . Она предоставляет простой и удобный способ извлекать данные из веб-страниц, а также облегчает работу с этими данными. У библиотеки BeautifulSoup удобный интерфейс для взаимодействия с HTML-кодом, который позволяет легко находить нужные элементы и извлекать из них информацию. Эта библиотека является одной из наиболее популярных и широко используется для работы с парсерами и при анализе данных.

Преимущества BeautifulSoup:

  • Простота использования. Простой и понятный интерфейс для парсинга и навигации по документам.
  • Гибкость. Библиотека поддерживает различные методы поиска, фильтрации и манипуляции с данными, что позволяет легко осуществлять различные операции с HTML и XML документами.
  • Поддержка сложных структур помогает обрабатывать и извлекать данные из таких объектов, как например, вложенные теги и структуры документов.

Для работы с большими массивами данных предлагаем использовать услугу Аренда выделенного сервера. Надежно защищенное оборудование показывает высокую производительность и низкий процент отказа.

Какие задачи можно решить с помощью BeautifulSoup

  1. Извлечение данных. BeautifulSoup позволяет извлекать тексты, атрибуты, ссылки и другие данные из HTML/XML документов. Например, вы можете извлечь заголовки новостей с веб-страницы или данные из таблицы.
  2. Фильтрация данных на основе тегов, классов, идентификаторов, атрибутов и других характеристик элементов. Например, вы можете найти все ссылки или изображения на странице с определенным классом или атрибутом.
  3. BeautifulSoup предоставляет методы для навигации по иерархической структуре HTML и XML документов. Например, вы можете найти все дочерние элементы определенного объекта или найти родительский элемент для данного объекта.
  4. Библиотека позволяет добавлять, изменять и удалять элементы в документе. Например, вы можете создать новый элемент и добавить его в определенное место на странице или изменить содержимое существующего элемента.
  5. Очистка данных от HTML/XML тегов и сущностей. Например, вы можете удалить все теги и получить только текстовое содержимое страницы.
  6. BeautifulSoup может быть использована для сбора данных с веб-страниц. Например, вы можете автоматически собирать информацию о товарах онлайн-магазина или получить информацию о погоде с сайта погоды.
  7. BeautifulSoup может быть использована для тестирования и проверки структуры HTML/XML документов. Например, вы можете проверить наличие определенных тегов или атрибутов на странице.

Пример использования библиотеки Beautifulsoup в Python

Перед началом работы с библиотекой выполните ее установку с помощью команды:

from bs4 import BeautifulSoup

Также загрузите библиотеку requests, с помощью которой можно делать запрос на нужный сайт:

Чтобы загрузить нужную вам HTML-страницу, выполните:

Для создания объекта BeautifulSoup:

soup = BeautifulSoup(html, ‘html.parser’)

Примеры запросов с использованием библиотеки BeautifulSoup:

  • Найти все теги на странице и вывести их содержимое:

for link in links:

  • Найти элемент с определенным идентификатором и вывести его содержимое:
  • Найти элементы по атрибутам и их значениям:

elements = soup.find_all(attrs={‘data-name’: ‘my-data’})

for element in elements:

  • Создать новый элемент:

new_element.string = ‘New paragraph’

  • Добавить новый элемент в документ
  • Изменить содержимое элемента:

element.string = ‘New heading’

  • Удалить элемент:
  • Получить HTML код документа:

Заключение

Библиотека BeautifulSoup4 предоставляет удобный способ разбора и навигации по структуре веб-страниц, облегчая извлечение нужной информации. Она обеспечивает простой и понятный доступ к элементам HTML, таким как теги, классы, идентификаторы и тексты, поддерживает мощные методы поиска и фильтрации данных, позволяя быстро находить нужные элементы и извлекать информацию из них.

Благодаря своей простоте и гибкости, BeautifulSoup является популярным инструментом для веб-скрапинга и анализа данных. Она позволяет разработчикам легко извлекать информацию с веб-страниц и использовать ее для различных целей, таких как парсинг новостей, получение данных с целевых сайтов или анализ HTML-кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *