Иногда возникает задача получения данных с разных страниц разных сайтов да ещё динамически в автоматическом режиме. В языке 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 !