Иногда вы хотите получить доступ к данным в Интернете, которые не легко доступны через 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 get_rating(href): # href passed in here should be from what we found earlier, the href from the tag that the title was wrapped in response = requests.get(f"https://www.imdb.com{href}") html = response.text soup = BeautifulSoup(html, "html.parser") # Select by CSS selector for .ratingValue class and get the first result (index 0), we only expect there to be one rating = soup.select(".ratingValue")[0].span.get_text() return rating
И давайте использовать его в нашем запустить
Функция:
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”