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

Строительство веб-скребка Python в колбе

Веб-сайты в настоящее время содержат богатство ценной информации, которая ежедневно употребляется пользователем … Теги с Python, Web Dev, программированием, наукой данных.

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

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

Итак, что именно в Интернете? Как подразумевает имя, это просто автоматизированное извлечение неструктурированной HTML-информации HTML в указанном формате, структурируя ее и сохраняя ее в базе данных или сохранение его в качестве файла CSV для будущего потребления.

Библиотеки Python находятся в верхней части списка веб-технологий Scraping сегодня. Красивый суп Самая популярная библиотека Scraping Python Web.

В этом руководстве мы посмотрим на веб-соскоб, используя красивый суп и Запросы Отказ Мы построим приложение для веб-скребка с Колбу Самый легкий веб-каркас Python.

Как это работает

  • Загрузить приложение
  • Предоставьте целевой URL и тег, чтобы получить пример IMG, P, название
  • Получите ответ – запрошенный элемент (ы) контент.
  • Для изображений, будет функция загрузки, которая сохранит изображения в ваш каталог загрузок

NB Доступно просмотр Live здесь

1. Настройка проекта.

Для этого проекта я сосредоточен на функциональности Backenc, а также шаблон и петли Jinja. Я не буду подробно описан в CSS или остальную часть HTML-кода. Найти полные проектные коды здесь Отказ

Чтобы получить этот проект на вашем локальном компьютере, следуйте шагам здесь Отказ

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

2. Подробности проекта.

Наши основные файлы обсуждения будут следующими:

  • app.py
  • Шаблоны/index.html.

app.py

Как указано во введении, мы будем использовать колбу, красивый суп и библиотеки запросов. В первую очередь мы импортируем некоторые функциональные возможности из колба и красивый суп в файл App.py.

Нам нужно проверить и анализировать URL-адреса, которые мы получаем, поэтому мы импортируем модуль обработки URL для Python- урлыб , а также некоторые другие встроенные библиотеки.

from flask import (
    Flask,
    render_template,
    request,
    redirect,
    flash,
    url_for,
    current_app
)
import urllib.request 
from urllib.parse import urlparse,urljoin
from bs4 import BeautifulSoup
import requests,validators,json ,uuid,pathlib,os

Экземпляр колбы должен быть создан, как показано ниже.

app = Flask(__name__)

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

@app.route("/",methods=("GET", "POST"), strict_slashes=False)
def index():
    # Actual parsing codes goes here
    return render_template("index.html")

Чтобы начать наш лом, мы должны убедиться, что пользователь отправил сообщение запроса.

if request.method == "POST":

Внутри нашей функции мы обрабатываем фактическое распределение, используя красивый суп

try:
    global requested_url,specific_element,tag

    requested_url = request.form.get('urltext')
    tag = request.form.get('specificElement')

    source = requests.get(requested_url).text
    soup = BeautifulSoup(source, "html.parser")
    specific_element = soup.find_all(tag)

    counter = len(specific_element)

    image_paths = image_handler(
        tag,
        specific_element,
        requested_url
        )

    return render_template("index.html",
        url = requested_url,
        counter=counter,
        image_paths=image_paths,
        results = specific_element
        )

except Exception as e:
    flash(e, "danger")

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

global requested_url,specific_element,tag

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

 requested_url = request.form.get('urltext')
 tag = request.form.get('specificElement')

Следующие строки кода; Первая строка отправляет HTTP-запрос на указанный пользователем URL-адрес – requested_url Отказ Сервер отвечает на запрос, доставляя необработанное содержимое HTML в веб-странице, которое мы затем преобразуем в текст- .текст () и назначить переменной Источник Отказ

source = requests.get(requested_url).text

Нам нужно анализировать страницу после того, как мы извлекли содержимое HTML в текстовом формате, и мы будем использовать HTML.Parser как наша библиотека синхронизации. Мы просто создаем вложенную/деревовую структуру HTML-данных, делая это.

soup = BeautifulSoup(source, "html.parser")

Поскольку нам не нужен весь документ, мы перемещаемся через дерево, чтобы обнаружить элемент, который нам требуется. Тег, который пользователь войдет в поле формы.

specific_element = soup.find_all(tag)

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

counter = len(specific_element)

Как мы видим, переменная image_paths связано с функцией под названием – image_handler () , который принимает поставляемый пользователем URL-адрес, тег и конкретный элемент, который мы извлекли с PARSED PAGE. Мы пропустим эту функцию и вернусь к нему позже, чтобы увидеть, что это делает.

image_paths = image_handler(
    tag,
    specific_element,
    requested_url
    )

Мы передаем результаты нашего анализа вместе с оператором возврата, чтобы сделать их доступными на шаблоне HTML.

return render_template("index.html",
    url = requested_url,
    counter=counter,
    image_paths=image_paths,
    results = specific_element
    )

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

Пути, такие как /uploads/image.png Например, будет трудно определить, где они происходят. Таким образом, мы создадим функцию, аналогичную той, которую мы позвонили ранее, чтобы подтвердить наши пути изображения.

def image_handler(tag,specific_element,requested_url):
    image_paths = []
    if tag == 'img':
        images = [img['src'] for img in specific_element]
        for i in specific_element:
            image_path = i.attrs['src']
            valid_imgpath = validators.url(image_path)
            if valid_imgpath == True:
                full_path = image_path
            else:
                full_path = urljoin(requested_url, image_path)
                image_paths.append(full_path)

    return image_paths

Функция проверяет, если предоставленные Тег Это тег изображения, затем извлекивает значение атрибута изображений SRC и проверяет его, чтобы увидеть, является ли это абсолютный путь. Если это не так, он присоединяется к относительному пути к базовому URL-адресу цели.

https://example.com + /uploads/image.png

Эти пути изображения затем сохраняются в списке и возвращаются при отозвании функции.

Шаблоны/index.html.

Что касается следующего? Мы должны предоставить результаты лома пользователю. Мы будем использовать шаблон jinja и зацикливаться в этом случае.

{{ counter }} Scrap Results for {{ url }}

{% if results %} {% for result in results %}

{{ result | join(' ') }}

{% endfor %} {% endif %} {% for path in image_paths %} {% endfor %}
{% if image_paths %} Download Images {% endif %}

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

Сначала проверим, доступен ли список результатов ниже подсчета и URL-адреса, и если оно есть, мы повторяем печать каждый. Это для текстов, которые были получены.

Однако, когда вы печатаете вывод, вы увидите |. присоединиться(' ') Это работает аналогично | striptags В этом он удаляет все HTML-теги от переменного результата.

Следовательно, вместо у нас будет;

Мы используем якорные теги, чтобы приложить изображения и передавать пути в качестве значений для href и SRC характеристики.

{% for path in image_paths %}



{% endfor %}

Кроме того, мы хотели бы отобразить опцию загрузки, только если изображения извлекаются. Таким образом, мы используем Jinja, если утверждения для достижения этого. Смотрите код ниже.

{% if image_paths %}

Download Images


{% endif %}

Последнее, но не менее важное, нам нужно также загружать изображения.

@app.route("/download",methods=("GET", "POST"), strict_slashes=False)
def downloader():
    try:
        for img in image_handler(tag,specific_element,requested_url):
            image_url = img

            filename = str(uuid.uuid4())
            file_ext = pathlib.Path(image_url).suffix

            picture_filename = filename + file_ext

            downloads_path = str(pathlib.Path.home() / "Downloads")

            picture_path  = os.path.join(downloads_path, picture_filename
            )


        flash("Images saved in your Downloads directory", "success")

    except Exception as e:
        flash(e, "danger")

    return redirect(url_for('index'))

UUID Библиотека используется функцией загрузки выше для создания уникальных имен для загруженных файлов.

filename = str(uuid.uuid4())

тогда Pathlib. Путь () Чтобы разделить расширение изображения с пути изображения.

file_ext = pathlib.Path(image_url).suffix

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

picture_path  = os.path.join(downloads_path, picture_filename)

Линия кода после обработки фактического загрузки изображения.

urllib.request.urlretrieve(image_url, picture_path)

Как параметры, urllib.request.urlretRiev () Принимает загрузку изображения и каталог, где он должен быть сохранен с его новым именем. В результате фотографии сохраняются в каталоге загрузки в каталоге Static.

Наконец, мы проводим прослушивание колбы для запуска приложения в виде модуля.

    if __name__ == "__main__":
        app.run(debug=True)

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

Как, делиться и оставьте комментарий в разделе ниже. Следуйте за мной в Twitter для дальнейших обновлений и советов по колбе и развитию реагирования.

Оригинал: “https://dev.to/dev_elie/building-a-python-web-scraper-in-flask-b87”