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

Интернет с питоном

Иногда вы хотите получить доступ к данным в Интернете, которые не легко доступны через API. Для этого мы … с меткой WebDev, Python, Tutorial.

Иногда вы хотите получить доступ к данным в Интернете, которые не легко доступны через API. Для этого сеть – жизнеспособная альтернатива. Скраинг в Интернете, по сути, является способом программного посещения веб -сайта, как если бы вы были браузером, и приобретайте данные таким образом. Этот учебный пост проведет вас через процесс соскоба с использованием Python3, и две библиотеки BeautifulSoup и Запросы Анкет Например, мы создадим приложение командной строки для поиска и печати для фильмов и телешоу на IMDB.

Чтобы следить за учебником, вам нужно будет иметь следующее:

  • Python установлены
  • Некоторые базовые знания о Python и некоторых базовых знаниях HTML/CSS

В качестве альтернативы вы можете проверить Мой пост в блоге для использования Dev Containers и следуйте этому руководству, но выберите Python 3 Спецификация контейнера при создании контейнера Dev. Если вы не можете получить работу контейнера Dev, вы можете обратиться к Репозиторий для этого сообщения в блоге Анкет

Давайте начнем с создания папки для нашего проекта и установкой необходимых зависимостей:

mkdir web-scrape
cd web-scrape
pip3 install beautifulsoup4 requests
  • BeautifulSoup4 Позволяет нам легко получить доступ к элементам DOM программно
  • Запросы дает нам хороший и простой в использовании интерфейс для выполнения HTTP -запросов

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

Посетите www.imdb.com В вашем браузере и ищите фильм по вашему выбору. Я искал Парк Юрского периода , вас должны встретить что -то вроде следующего изображения:

Как только вы на этой странице проверьте один из строк в “Названия” Таблица, щелкая и нажимая “Осмотрите элемент” , это варьируется от браузера к браузере, но в Firefox выглядит так:

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

То, что здесь отображается, это Дом структура. Выделенная строка здесь – это то, что я выбрал при взятии “Осмотрите элемент” действие ранее. Это показывает нам, как все узлы HTML относятся друг к другу и где в DOM данные, которые мы после, находятся. Поскольку мы хотим иметь возможность перечислить эти результаты в нашем приложении, мы должны иметь возможность представить эти результаты поиска.

Мы видим, что данные, которые нас интересуют, расположены внутри элемент с классом result_text , название заголовка обернуто в элемент с href Удерживая относительную ссылку на заголовок. Это все данные, которые нам нужны на этой странице.

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

Когда на этой странице давайте повторим шаг и “Осмотрите элемент” На рейтинговом дисплее:

Здесь мы видим, что для этой страницы заинтересованные нам данные расположены внутри Span Элемент, завернутый сильный Элемент, который, в свою очередь, завернут div элемент с классом RatingValue .

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

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

# scrape.py
import requests
from bs4 import BeautifulSoup

def search(search_term):
    # Make the search request to IMDB
    response = requests.get(f"https://www.imdb.com/find?q={search_term}")
    html = response.text
    soup = BeautifulSoup(html, "html.parser")
    # Find the table with the class findList
    table = soup.find("table", {"class": "findList"})
    # Use CSS selector syntax to get all td elements from the table with the class result_text
    rows = table.select("tr td.result_text")
    # Construct a list with the search results, store the title and the href in dicts
    return [{"title": row.get_text().strip(), "href": row.a['href']} for row in rows]

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

def run():
    search_term = input("Search IMDB: ")
    results = search(search_term)
    num_results = len(results)
    print(f"Found {num_results} results:")
    # Use built-in function enumerate to access the index variable i
    for i, result in enumerate(results):
        print(f"({i+1}) {result['title']}")

# Don't forget this line! We have to call the run function or nothing will happen when we run our program.
run()

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

python3 scrape.py

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

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

Нам нужно еще немного логики, чтобы запросить следующую страницу и распечатать значение из Span Элемент, который мы определили ранее. Вы, возможно, заметили, что в Поиск Функция, которую мы определили, мы возвращаем href s Но мы еще не использовали их. Давайте включим их сейчас.

В scrape.py , добавить еще одну функцию:

И давайте использовать его в нашем запустить Функция:

def run():
    # Main interaction
    search_term = input("Search IMDB: ")
    results = search(search_term)
    num_results = len(results)

    print(f"Found {num_results} results:")
    for i, result in enumerate(results):
        print(f"({i+1}) {result['title']}")

    # Convert to int and subtract one to undo the addition to the index in the above loop
    selection = int(input(f"Select by entering a number (1-{num_results}): ")) - 1
    selected_result = results[selection]
    # Pass in the href to the title we want to get the rating for
    rating = get_rating(selected_result["href"])

    print(f"{selected_result['title']} has a rating of {rating}!")

# Again, make sure you call this in scrape.py
run()

Запуск наше приложение теперь приводит к следующему поведению:

Если вы можете использовать API, чтобы получить данные, которые вам нужно, вы всегда должны делать это, это быстрее и менее подвержено ошибкам. Сокращение Интернета может иногда становиться грязным в зависимости от структуры DOM. Как вы уже выяснили, если что -то должно измениться на макете IMDB, это потенциально нарушит наше приложение.

Я надеюсь, что вы узнали что -то новое, и что вы нашли информацию, предоставленную здесь полезной, может быть, вы хотели использовать данные с какого -то сайта в своем собственном проекте? Иди и попробуй это 😊.

Не стесняйтесь задавать любые вопросы.

Наслаждаться! Здесь является связанным хранилищем для этого поста.

Оригинал: “https://dev.to/simonnystrom/web-scraping-with-python-24bg”