Веб-скрапинг с помощью Beautiful Soup

Веб-скрапинг с помощью Beautiful Soup Изучение

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

Сначала установите beautifulsoup следующим образом:

pip install beautifulsoup4

Beautifulsoup применяется к HTML-файлу, поэтому мы должны начать с получения HTML-содержимого веб-страницы. Обычно это делается с помощью модуля запросов. В этом конкретном примере мы получим HTML-содержимое веб-страницы и отобразим его. Для этого мы сначала устанавливаем URL-адрес; в данном случае я выбрал веб-сайт средств массовой информации здравого смысла (потому что на нем есть список фильмов с рейтингами, которые мы можем заинтересовать в поиске). Затем мы используем метод get () для получения объекта ответа и извлечения части HTML с помощью атрибута content или text.

import requests

url = «https://www.commonsensemedia.org/movie-reviews»

body = requests.get(url)

body_text = body.content  # or body.text

print(body.content)   # or print(body.text)

Теперь мы можем начать использовать beautifulsoup. Мы создаем объект beautifulsoup, который принимает два аргумента — html-файл и тип парсера. Доступно четыре парсера — html.parser, lxml, lxml-xml и html5lib.

from bs4 import BeautifulSoup

soup = BeautifulSoup(body_text, ‘lxml’)

Также необходимо установить парсер. В данном случае я выбрал парсер lxml и установлю его.

pip install lxml

Теперь мы можем делать что угодно, но мы исследуем различные возможности, прежде чем я начну парсить веб-страницы.

(i) Метод prettify () перепишет текст в удобочитаемом и «красивом» формате.

soup.prettify()

(ii) Метод title будет извлекать заголовок.

soup.title

(iii) Метод «p» извлечет все теги p из html-кода.

soup.p

(iv) Метод «a» извлечет все теги a из html-кода.

soup.a

(v) Метод find_all () найдет все веб-элементы, содержащие определенный аргумент. В данном случае я пропустил «a», поэтому find_all («a») найдет все теги «a».

soup.find_all(‘a’)

(vi) Метод find найдет все переданные аргументы. В этом случае мы передаем аргумент id = «пароль». Таким образом, он будет искать в html-коде идентификатор и, если он совпадает, извлекать предложение.

soup.find(id=«password»)

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

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

import requests

url = «https://www.commonsensemedia.org/movie-reviews»
body = requests.get(url)
body_text = body.content

from bs4 import BeautifulSoup
soup = BeautifulSoup(body_text, ‘lxml’)

В этом конкретном случае html-код каждого названия фильма (то, что мы очищаем) сам находится внутри контейнера. Сначала мы начнем с осмотра рассматриваемого элемента. В моем случае я решил проверить название первого фильма («до смерти»).

Когда вы осмотрите элемент, вы заметите, что то, что нам нужно

Когда вы осмотрите элемент, вы заметите, что то, что нам нужно — название фильма «до смерти» — содержится в теге «div» с классом «content-content-wrapper». Этот первый тег «div» будет повторяться во всем HTML-коде, поскольку каждый заголовок фильма содержится в таком теге «div». Итак, мы говорим, что для каждого div в div мы хотим выбрать вложенный тег «div» с другим классом «views-field views-field-field-reference-review-ent-prod result-title». После этого мы видим «сильный» тег с классом «field-content». Итак, мы делаем то же самое снова. И, наконец, сам заголовок вложен в тег «а», поэтому мы выбираем тег «а».

После этого мы видим «сильный» тег с классом «field-content»

divs = soup.find_all(«div», class_=«content-content-wrapper»)

Обратите внимание, что здесь после слова class стоит символ подчеркивания. Это подчеркивание отличает класс кода HTML от классов Python. Итак, мы написали код, который извлечет тег «div» с классом «content-content-wrapper».

Затем вы пишете:

# divs = soup.find_all(“div”, {‘class’ : ‘content-content-wrapper’})

for div in divs:
divs2 = div.find_all(«div», class_=«views-field views-field-field-reference-review-ent-prod result-title»)
for div in divs2:
strongs = div.find_all(«strong», class_=«field-content»)
for strong in strongs:
aa = strong.find_all(«a»)
for a in aa:
print(a.text)

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

Теперь предположим, что мы хотим сохранить эти данные в файл csv; это тоже возможно. Чтобы писать в csv, вы должны сначала импортировать модуль csv. Во-первых, давайте откроем файл, в котором мы хотим сохранить информацию. Здесь мы передадим три аргумента — имя файла, режим и хотим ли мы новую строку или нет. Здесь мы добавляем новую строку, равную нулю, чтобы предотвратить добавление в CSV-файл возвратов (или новых пустых строк) после каждой записи. Во-вторых, мы передаем файл методу writer (). В-третьих, пишем новую строку. В этом случае я называю свою новую строку «Фильмы», потому что это заголовок к тому, что будет следовать.

import csv

file = open(«movie.csv», «w», newline=»)
file_write = csv.writer(file)
file_write.writerow([‘Movies’])

В-четвертых, вместо того, чтобы просто выводить переменную «a», мы удалим из нее пустые места, а затем воспользуемся методом writerow () для записи ее в файл csv.

for div in divs:
divs2 = div.find_all(«div», class_=«views-field views-field-field-reference-review-ent-prod result-title»)
for div in divs2:
strongs = div.find_all(«strong», class_=«field-content»)
for strong in strongs:
aa = strong.find_all(«a»)
for a in aa:
file_write.writerow([a.text.strip()])

Весь код будет выглядеть примерно так:

import requests

url = «https://www.commonsensemedia.org/movie-reviews»
body = requests.get(url)
body_text = body.content

from bs4 import BeautifulSoup
soup = BeautifulSoup(body_text, ‘lxml’)

divs = soup.find_all(«div», class_=«content-content-wrapper»)

import csv

file = open(«movie.csv», «w», newline=»)
file_write = csv.writer(file)
file_write.writerow([‘Movies’])

for div in divs:
divs2 = div.find_all(«div», class_=«views-field views-field-field-reference-review-ent-prod result-title»)
for div in divs2:
strongs = div.find_all(«strong», class_=«field-content»)
for strong in strongs:
aa = strong.find_all(«a»)
for a in aa:
file_write.writerow([a.text.strip()])

Это всего лишь простой пример. На самом деле парсинг веб-страниц настолько мощный, что вы можете очищать и отслеживать практически любую веб-страницу.

Читайте также:  Как установить, настроить, запустить и остановить сервер Redis?
Оцените статью
bestprogrammer.ru
Добавить комментарий