Web

In [9]:
# Библиотека requests позволяет делать HTTP-запросы из питона
import requests

# Библиотека BeautifulSoup4 позволяет парсить HTML и легко извлекать из него информацию
import bs4

# Функция urljoin умеет составлять новый URL из двух частей. Нужна, чтобы понимать, куда
# ведут ссылки на странице.
from urllib.parse import urljoin

Парсинг XKCD

In [10]:
# Делаем 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)
Title: Python
URL: https://xkcd.com/353/
Next URL: https://xkcd.com/354/

Как скачать картинку

Картинки в HTML задаются тегом <img>. Ссылка на саму картинку находится в аттрибуте src. Пример:

<img alt="xkcd.com logo" height="83" src="/s/0b7742.png" width="185"/>
In [11]:
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))
Картинка https://xkcd.com/s/0b7742.png записана в файл 0b7742.png