# Библиотека requests позволяет делать HTTP-запросы из питона
import requests
# Библиотека BeautifulSoup4 позволяет парсить HTML и легко извлекать из него информацию
import bs4
# Функция urljoin умеет составлять новый URL из двух частей. Нужна, чтобы понимать, куда
# ведут ссылки на странице.
from urllib.parse import urljoin
# Делаем HTTP-запрос страницы комикса и записываем ответ в переменную response
response = requests.get('https://xkcd.com/353/')
# Из HTML-кода страницы, хранящейся в переменной response.text, делаем объект
# BeautifulSoup, который умеет искать информацию в HTML.
soup = bs4.BeautifulSoup(response.text, "html.parser")
# Извлекаем название из HTML. Оно находится в теге div с аттрибутом id равным ctitle.
# Узнать это можно, посмотрев на сайт в браузере с помощью инсрументов разработчика.
title = soup.find('div', {'id': 'ctitle'}).contents[0]
# Извлекаем ссылку на следующий комикс. Ссылка хранится в аттрибуте href тега a.
next_link = soup.find('a', {'rel': 'next'})
next_url = urljoin(response.url, next_link['href'])
print("Title:", title)
print("URL:", r.url)
print("Next URL:", next_url)
Картинки в HTML задаются тегом <img>
. Ссылка на саму картинку находится в аттрибуте src
. Пример:
<img alt="xkcd.com logo" height="83" src="/s/0b7742.png" width="185"/>
response = requests.get('https://xkcd.com/353/')
soup = bs4.BeautifulSoup(response.text, "html.parser")
# Получаем все картинки со страницы
images = soup.find_all('img')
# Будем качать только первую
img = images[0]
# Получаем URL картинки. Функция urljoin составляет правильный URL из двух кусочков.
img_url = urljoin(response.url, img.attrs['src'])
# Скачиваем картинку GET-запросом
img_response = requests.get(img_url)
# Имя для файла картинки берём из её URL'а
img_name = img_url.split('/')[-1]
# Файл открываем на запись в бинарном режиме, передавая вторым аргументом 'wb'. Бинарный режим
# нужен, потому что картинка является не текстом, а сырыми данными.
img_file = open(img_name, 'wb')
# Пишем картинку в файл функцией write, потому что файл открыт в бинарном режиме. Функция
# write не добавит ничего лишнего к картинке.
img_file.write(img_response.content)
img_file.close()
print('Картинка {} записана в файл {}'.format(img_url, img_name))