Как написать парсер сайта на Python
В этой статье мы рассмотрим, как создать базовый парсер сайта на Python, используя библиотеки BeautifulSoup и requests. Он сможет спарсить информацию со страниц сайта и сохранять ее для последующего анализа.
Что такое веб-парсинг?
Парсинг — это процесс извлечения данных из веб-страниц. Эти данные могут включать любую информацию, доступную на веб-странице: текст, ссылки, изображения, метаданные и т.д. Веб-парсеры используются для различных задач, включая мониторинг цен, анализ социальных медиа, веб-майнинг, веб-аналитику и т.д.
Необходимые инструменты
Для начала, нам необходимо установить две библиотеки Python: requests и beautifulsoup4 . Это можно сделать при помощи pip :
pip install requests beautifulsoup4
Requests — это библиотека Python, что позволяет нам выполнять HTTP-запросы, а BeautifulSoup — мощная библиотека для парсинга HTML и XML документов.
Начало работы
Для демонстрации мы напишем простой веб-парсер, который соберет заголовки статей с главной страницы блога на условном домене example.com. Первым шагом будет получение HTML-кода страницы. Мы воспользуемся для этого библиотекой requests :
import requests url = 'https://example.com/blog/' response = requests.get(url)
Если все прошло гладко, response.text теперь содержит HTML-код главной страницы блога.
Парсинг HTML
Теперь, когда у нас есть HTML-код страницы, мы можем воспользоваться BeautifulSoup для его парсинга:
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser')
BeautifulSoup преобразует HTML-строку в объект, с которым легко работать, предоставляя различные методы для навигации и поиска в HTML-структуре.
Поиск данных
С помощью BeautifulSoup мы можем использовать CSS-селекторы для поиска элементов на странице. Например, давайте найдем все заголовки статей на странице. Просмотрев код страницы, мы видим, что заголовки находятся в тегах , которые имеют класс blog-title .
titles = soup.select('h2.blog-title')
select возвращает список всех найденных элементов. Если нам нужен только первый найденный элемент, мы можем использовать метод select_one .
Извлечение данных
Теперь, когда мы нашли наши заголовки, мы можем вытянуть из них текст:
for title in titles: print(title.get_text())
Используя метод get_text() , мы можем получить весь текст, который находится внутри элемента, включая все его дочерние элементы.
Сохранение данных
Последний шаг — это сохранение собранных данных. Мы можем сохранить их в файл, базу данных или любое другое место в зависимости от наших потребностей. Для простоты давайте сохраним их в текстовый файл:
with open('titles.txt', 'w') as f: for title in titles: f.write(title.get_text() + '\n')
Теперь у нас есть простой парсер, который собирает заголовки с сайта и сохраняет их в текстовый файл.
Итоги
В этой статье мы рассмотрели основы написания веб-парсера на Python с использованием библиотек requests и BeautifulSoup . Это базовый пример, но принципы, которые мы здесь использовали, могут быть применены для написания намного более сложных веб-парсеров. Благодаря Python и его прекрасным библиотекам, парсинг становится простым и доступным инструментом для сбора данных из Интернета.
Если вы хотите расширить свои знания и навыки в написании парсеров на Python, вот несколько рекомендаций:
- Изучить больше о CSS селекторах и их использовании в BeautifulSoup для поиска нужных элементов.
- Ознакомиться с различными методами для навигации по DOM-структуре, такими как .parent, .children, .next_sibling и другие.
- Рассмотреть использование других библиотек Python для веб-парсинга, таких как lxml, html5lib или PyQuery.
- Исследовать возможности использования веб-парсеров для автоматического заполнения форм, работы с авторизацией на сайтах и обхода защиты от парсинга (например, CAPTCHA).
Кроме того, при написании веб-парсеров важно учитывать этические аспекты и соблюдать правила использования веб-сайтов. Проверяйте, разрешен ли парсинг и уважайте ограничения на частоту запросов.
С опытом и соблюдением лучших практик, написание парсеров на Python станет неотъемлемой частью вашего набора навыков, которая поможет вам собирать и анализировать данные из Интернета для различных целей.
Освоить профессию python разработчика вы можете на нашем курсе Python с трудоустройством.
Извлечение всех ссылок web-сайта с помощью Python
Одна из задач, которая стояла в рамках проекта, нацеленного на исследование мер поисковой оптимизации (SEO, search engine optimization) информационных ресурсов дочерних структур организации, предполагала поиск всех ссылок и выявление среди них так называемых «мертвых (битых) ссылок», отсылающих на несуществующий сайт, страницу, файл, что в свою очередь понижает рейтинг информационного ресурса.
В этом посте я хочу поделиться одним из способов извлечения всех ссылок сайта (внутренних и внешних), который поможет при решении подобных задач.
Посмотрим, как можно создать инструмент извлечения ссылок в Python, используя пакет requests и библиотеку BeautifulSoup. Итак,
pip install requests bs4
Импортируем необходимые модули:
import requests from urllib.parse import urlparse, urljoin from bs4 import BeautifulSoup
Затем определим две переменные: одну для всех внутренних ссылок (это URL, которые ссылаются на другие страницы того же сайта), другую для внешних ссылок вэб-сайта (это ссылки на другие сайты).
# Инициализировать набор ссылок (уникальные ссылки) int_url = set() ext_url = set()
Далее создадим функцию для проверки URL – адресов. Это обеспечит правильную схему в ссылке — протокол, например, http или https и имя домена в URL.
# Проверяем URL def valid_url(url): parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme)
На следующем шаге создадим функцию, возвращающую все действительные URL-адреса одной конкретной веб-страницы:
# Возвращаем все URL-адреса def website_links(url): urls = set() # извлекаем доменное имя из URL domain_name = urlparse(url).netloc # скачиваем HTML-контент вэб-страницы soup = BeautifulSoup(requests.get(url).content, "html.parser")
Теперь получим все 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
Если URL-адрес недействителен/URL уже находится в int_url , следует перейти к следующей ссылке.
Если URL является внешней ссылкой, вывести его и добавить в глобальный набор ext_url и перейдти к следующей ссылке.
И наконец, после всех проверок получаем URL, являющийся внутренней ссылкой; выводим ее и добавляем в наборы urls и int_url
if not valid_url(href): # недействительный URL continue if href in int_url: # уже в наборе continue if domain_name not in href: # внешняя ссылка if href not in ext_url: print(f"[!] External link: ") ext_url.add(href) continue print(f"[*] Internal link: ") urls.add(href) int_url.add(href) return urls
Напоминаю, что эта функция захватывает ссылки одной вэб-страницы.
Теперь создадим функцию, которая сканирует весь веб-сайт. Данная функция получает все ссылки на первой странице сайта, затем рекурсивно вызывается для перехода по всем извлеченным ссылкам. Параметр max_urls позволяет избежать зависания программы на больших сайтах при достижении определенного количества проверенных URL-адресов.
# Количество посещенных URL-адресов visited_urls = 0 # Просматриваем веб-страницу и извлекаем все ссылки. def crawl(url, max_urls=50): # max_urls (int): количество макс. URL для сканирования global visited_urls visited_urls += 1 links = website_links(url) for link in links: if visited_urls > max_urls: break crawl(link, max_urls=max_urls)
Итак, проверим на сайте, к которому имеется разрешение, как все это работает:
if __name__ == "__main__": crawl("https://newtechaudit.ru") print("[+] Total External links:", len(ext_url)) print("[+] Total Internal links:", len(int_url)) print("[+] Total:", len(ext_url) + len(int_url))
Вот фрагмент результата работы программы:

Обратите внимание, что многократный запрос к одному и тому же сайту за короткий промежуток времени может привести к тому, что ваш IP-адрес будет заблокирован. Ссылка на оригинал поста.
Как спарсить со всех страниц сайта используя python
Я не особо опытна в python, поэтому если решите помочь, прошу, подробнее =) Проблема такая, хочу спарсить этот сайт https://www.mir-priaji.ru/ (у них каталог в открытом доступе есть, так что это не воровство) По видеоурокам разобралась, написала парсер для одной страницы, а как автоматизировать процесс для всех страниц в пределах данного url? то есть там каталог не поддаётся алгоритмированию, все ссылки уникальны, неужели всё ручками вбивать нужно? привожу код:
import requests from bs4 import BeautifulSoup import csv import time URL = 'https://www.mir-priaji.ru/catalog/aksessuary_dlya_vyshivaniya/pyaltsy_ramki/prochie_2/207569/' HEADERS = HOST = 'https://www.mir-priaji.ru' FILE = 'catalog.csv' def get_html(url, params=None): r = requests.get(url, headers=HEADERS, params=params) return r def get_pages_count(html): soup = BeautifulSoup(html, 'html.parser') pagination = soup.find_all('span', class_='page-item mhide') if pagination: return int(pagination[-1].get_text()) else: return 1 """ def get_img(html): p = requests.get(img) out = open("/upload/resize_cache/iblock/a2f/400_400_140cd750bba9870f18aada2478b24840a/a2fd17144bc3457aa0626e7b1a6dba79.jpeg", "wb") out.write(p.content) out.close() """ def get_content(html): soup = BeautifulSoup(html, 'html.parser') items = soup.find_all('div', class_='wraps hover_shine') catalog = [] for item in items: cost = item.find('span', class_='grey size13') if cost: cost = cost.get_text() else: cost = 'Цену уточняйте' catalog.append(< 'title': item.find('div', class_='preview_text dotdot').get_text(strip=True), 'kategory': item.find('a', class_='number').get_text(strip=True), 'kategory2': item.find('div', class_='bx-breadcrumb-item drop').get_text(strip=True), 'cost': cost, 'kol-vo': item.find('span', class_='value').get_text(strip=True), >) return catalog def save_file(items, path): with open(path, 'w', newline='') as file: writer = csv.writer(file, delimiter=';') writer.writerow(['Название', 'Категория', 'Подкатегория','Цена', 'Изображение', 'Наличие',]) for item in items: writer.writerow([item['title'], item['kategory'], item['kategory2'], item['cost'], item['kol-vo']]) def parse(): """ URL = input('Введите URL: ') URL = URL.strip() """ html = get_html(URL) if html.status_code == 200: catalog = [] pages_count = get_pages_count(html.text) for page in range (1, pages_count + 1): print(f'Парсинг страницы . ') html = get_html(URL, params=) catalog.extend(get_content(html.text)) time.sleep(1) save_file(catalog, FILE) print(f'Получено товаров') else: print('Error') parse()
Как спарсить все страницы сайта
Всем привет Я не опытный в пайтоне,написал парсер для одной страницы, в сайте около 1000 страниц Так вот каким образом парсить за один запуск программы все страницы сайта
Вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
import json import requests from bs4 import BeautifulSoup def wr_json(lst: list): with open('aset.json', 'w', encoding='utf-8') as f: json.dump(lst, f, indent=4, ensure_ascii=False) def get_data(response): temp = response.find_all('div', class_='offer__advert-short-info') data = { 'Этаж': temp[0].text, 'ТипДома': temp[1].text, 'Площадь': temp[3].text, 'Год': temp[4].text, 'ЖК': temp[5].text, } return data r = requests.get('https://krisha.kz/prodazha/kvartiry/') response = BeautifulSoup(r.text, 'html.parser') links = [] for ad in response.find_all('div', class_='a-card__inc'): links.append( 'https://krisha.kz' + ad.find(class_='a-card__title')['href'] ) cards = [] for link in links: r = requests.get(link) response = BeautifulSoup(r.text, 'html.parser') cards.append(get_data(response)) print(cards) wr_json(cards)
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как спарсить телефоны со страницы?
Здравствуйте https://perevozka24.ru/moskva-50/arenda-spetstehniki-evakuatory/19 Как правильно со.
Как спарсить инфу с сайта
Добрый день подскажи как с спарсить инфу с сайта https://baza-gai.com.ua/nomer/AE3040MX (не.

Как спарсить значения с таблицы сайта?
Всех приветствую, любители python! Начал писать парсер на Python и столкнулся с проблемой. ИЗ.
Как спарсить DOM-дерево + все js скрипты из страницы firefox
Впринцепе я даже не уверен что это вопрос по теме раздела, но: Задача такая, есть страница в.
Спарсить все используемые ресурсы страницы
И так задача: спарсить все используемые ресурсы страницы(!), а именно: img, css, js. Собственно.
