Python Доступ до Інтернету за допомогою Urllib.Request і urlopen()
⚡ Розумний підсумок
urllib – це стандарт Python модуль для доступу до інтернет-даних, що дозволяє запускати програми URLта отримувати HTML, JSON або бінарний вміст. Функція urllib.request.urlopen() підключається до веб-адреси та зчитує відповідь сервера безпосередньо в Python.

У розділах нижче пояснюється, що таке urllib, як відкрити URL та прочитати його HTML-код, а також як обробляти помилки, завантажувати файли та вибирати між urllib та бібліотекою requests.
Що таке urllib?
urllib є a Python модуль, який можна використовувати для відкриття URLs. Він визначає функції та класи, які допомагають у URL дії.
З Python, ви також можете отримувати доступ до даних з Інтернету, таких як XML, HTML та JSON, та отримувати їх з нього, а потім безпосередньо працювати з цими даними. У розділах нижче ми побачимо, як отримувати дані з Інтернету. Наприклад, тут ми використовуємо Guru99 відео URL, отримайте до нього доступ за допомогою Pythonта роздрукуйте HTML-файл цього URL.
Пакет urllib об'єднує кілька модулів: urllib.request для відкриття URLs, urllib.error для винятків, які можуть викликати запити, urllib.parse для побудови та розбору URLs та urllib.robotparser для читання файлів robots.txt.
Як відкрити URL використання URLlib
Перш ніж ми запустимо код для підключення до інтернет-даних, нам потрібно імпортувати URL бібліотечний модуль або «urllib».
- Імпорт urllib
- Визначте свою основну функцію
- Оголошіть змінну webUrl
- Потім викличте функцію urlopen у бібліотеці urllib
- Команда URL ми відкриваємо це Guru99 навчальний посібник з YouTube
- Далі ми друкуємо код результату
- Результуючий код отримується шляхом виклику функції getcode для створеної нами змінної webUrl.
- Ми перетворюємо це на рядок, щоб його можна було об'єднати з нашим рядком «код результату».
- Це буде звичайний HTTP-код «200», що вказує на успішну обробку HTTP-запиту.
Як отримати HTML-файл з URL in Python
Ви також можете прочитати HTML-файл за допомогою функції read() у PythonПісля запуску коду HTML-файл з’явиться в консолі.
- Викличте функцію read() для змінної webUrl
- Метод read() дозволяє зчитувати вміст файлів даних
- Прочитайте весь зміст URL у змінну під назвою data
- Запустіть код, і він виведе дані у форматі HTML
Ось повний код:
Python 2 Приклад
# # read the data from the URL and print it # import urllib2 def main(): # open a connection to a URL using urllib2 webUrl = urllib2.urlopen("https://www.youtube.com/user/guru99com") #get the result code and print it print "result code: " + str(webUrl.getcode()) # read the data from the URL and print it data = webUrl.read() print data if __name__ == "__main__": main()
Python 3 Приклад
# # read the data from the URL and print it # import urllib.request # open a connection to a URL using urllib webUrl = urllib.request.urlopen('https://www.youtube.com/user/guru99com') #get the result code and print it print ("result code: " + str(webUrl.getcode())) # read the data from the URL and print it data = webUrl.read() print (data)
Як обробляти помилки urllib: URLПомилка та HTTPError
Запит не завжди виконується успішно. Коли щось йде не так, urllib викликає виняток замість повернення даних, тому важливо обробляти ці помилки. Модуль urllib.error визначає два основні класи винятків.
- Помилка HTTP викликається, коли сервер повертає код стану помилки, наприклад, 404 Не знайдено або 500 Внутрішня помилка сервера. Він містить код стану та тіло відповіді.
- URLпомилка виникає, коли сервер взагалі неможливо зв’язатися, наприклад, через неправильне доменне ім’я або відсутність підключення до Інтернету. Він містить атрибут reason, який пояснює причину збою.
Оскільки HTTPError є підкласом URLПомилка, завжди спочатку перехоплюйте HTTPError, щоб кожен тип помилки оброблявся окремо:
from urllib.request import urlopen from urllib.error import HTTPError, URLError try: response = urlopen("https://www.guru99.com/no-such-page.html") data = response.read() except HTTPError as error: print("HTTP error:", error.code) except URLError as error: print("URL error:", error.reason)
Обробка цих винятків запобігає збою програми та дозволяє вам зареєструвати проблему, повторити запит або повернутися до кешованих даних.
Як завантажити файл з URL Використання urllib
Читання a URL Збереження в пам'ять працює для невеликих сторінок, але для зображень, PDF-документів або наборів даних простіше зберегти відповідь безпосередньо на диск. Модуль urllib.request пропонує два простих способи зробити це.
Функція urlretrieve() завантажує URL безпосередньо до локального файлу одним рядком:
from urllib.request import urlretrieve urlretrieve("https://www.python.org/static/img/python-logo.png", "logo.png")
Для більшого контролю відкрийте URL і запишіть байти самостійно. Відкрийте локальний файл у двійковому режимі, оскільки urlopen() повертає байти, а не текст:
from urllib.request import urlopen with urlopen("https://example.com/data.zip") as response: with open("data.zip", "wb") as file: file.write(response.read())
Для дуже великих файлів читайте та записуйте дані в циклі, використовуючи response.read(8192), щоб весь файл ніколи не зберігався в пам'яті одночасно.
urllib проти бібліотеки requests у Python
urllib є частиною Python стандартна бібліотека, тому вона працює всюди без встановлення. Бібліотека запитів сторонніх розробників не вбудована, але багато розробників надають їй перевагу для щоденної роботи з HTTP, оскільки її синтаксис коротший і зручніший для читання.
Основні відмінності:
- Установка: urllib постачається з Python, тоді як запити мають бути встановлені за допомогою pip.
- Декодування: urllib повертає необроблені байти, які ви декодуєте самостійно, тоді як requests декодує текст та JSON автоматично.
- Зручність: Запити обробляють сесії, файли cookie та користувацькі заголовки з меншою кількістю коду.
- Залежності: urllib не додає нічого, тоді як requests покладається на urllib3 під ним.
Оберіть urllib, якщо вам потрібна нульова кількість залежностей або лише швидкий одноразовий запит. Вибирайте запити для більших проектів, які передбачають автентифікацію, сеанси або часті виклики API. Обидва надсилають однакові базові HTTP-запити, тому рішення зводиться до зручності, а не до меншого списку залежностей.


