Парсим сайт на Python

Иногда возникает задача получения данных с разных страниц разных сайтов да ещё динамически в автоматическом режиме. В языке Python есть специализированные библиотеки для решения таких задач, например, Selenium. В случае статических страниц мы парсим сайт на Python с помощью стандартных запросов. Для взаимодействия программ на языке Python с интернетом нужно установить библиотеку requests с помощью инструкции ниже, например, исполненной в командной строке :

pip install requests

При отправке данных используйте функцию POST, для получения — GET. Для использования только что установленной библиотеки импортируем её в первой строке программы. Чтобы получить данные страницы нужно отправить запрос GET по её адресу URL :

import requests

res = requests.get('https://docs.python.org/3.5/')

В полученном ответе (response) res содержится различная интересующая нас информация. Для начала узнаем, чем завершилась наша операция GET и какой тип данных в ответе :

print(res.status_code)
print(res.headers['Content-Type'])

В нашем случае будет распечатано :

200
text/html

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

res_img = requests.get('https://docs.python.org/3.5/_static/py.png')
if res_img.status_code == 200:
    with open('myPython.png', 'wb') as f:
        f.write(res_img.content)

Теперь давайте сделаем что-то посложнее, например, получим список всех внешних ссылок, используемых на этой странице. Ссылки находятся внутри тегов А после атрибута href. Воспользуемся регулярными выражениями чтобы их все найти (для этого импортируем библиотеку RE). Код может быть, например, таким :

import requests
import re

res = requests.get('https://docs.python.org/3.5/')
        
if res.status_code == 200 and 'text/html' in res.headers['Content-Type']:
    lr = re.findall(r'(?:\<a)(?:[\s\w=\"\']+)?(?:href)(?:[=\s\'\"]+)?(\w+://[\./-_\w]+)(?:[\'\"])', res.text)
    print(*lr, sep="\n")

Получим следующий список, выведя каждый его элемент на отдельной строке :

https://www.python.org/
https://www.python.org/dev/peps/
https://wiki.python.org/moin/BeginnersGuide
https://wiki.python.org/moin/PythonBooks
https://www.python.org/doc/av/
https://devguide.python.org/
https://www.python.org/
https://www.python.org/psf/donations/
http://sphinx.pocoo.org/

Написание регулярных выражений отдельная непростая тема. Для того, чтобы распарсить код страницы, нужно знать основы HTML. Смотрим полученный код страницы и средствами языка Python добываем интересующую информацию. Существует библиотека bs4 для работы с html кодом. Например, функция BeautifulSoup преобразует текст (строку) в структуру тегов, с которой можно работать более удобно. Как задачи, так и страницы сайтов часто меняются. В результате многократно работающий скрипт может сломаться. Чтобы всё поправить мы снова парсим сайт на Python !

Обновлено: 31.10.2022 — 16:01

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *