Автор оригинала: Pankaj Kumar.
Модуль Python Urllib позволяет нам программно получать доступ к данным URL.
Python Urllib
- Мы можем использовать Python Urllib для получения контента сайта в программе Python.
- Мы также можем использовать его, чтобы позвонить на веб-сервисы отдыха.
- Мы можем сделать Get и Post HTTP-запросы.
- Этот модуль позволяет нам сделать HTTP, а также запросы HTTPS.
- Мы можем отправлять заголовки запроса, а также получить информацию о заголовках ответа.
Python Urllib Получить пример
Начнем с простого примера, где мы будем читать содержимое домашней страницы Wikipedia.
import urllib.request response = urllib.request.urlopen('https://www.wikipedia.org') print(response.read())
Ответ Читать ()
Метод возвращает байтовый массив. Приведенный выше код будет распечатать данные HTML, возвращаемые домашней страницей Wikipedia. Это не будет в читаемом формате человека, но мы можем использовать некоторые HTML Parser извлечь полезную информацию от нее.
Python Urllib запрос с заголовком
Посмотрим, что произойдет, когда мы стараемся запустить вышеуказанную программу для JouroneDev.
import urllib.request response = urllib.request.urlopen('https://www.journaldev.com') print(response.read())
Мы получим ниже сообщение об ошибке.
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/pankaj/Documents/PycharmProjects/BasicPython/urllib/urllib_example.py Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/BasicPython/urllib/urllib_example.py", line 3, inresponse = urllib.request.urlopen('https://www.journaldev.com') File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 223, in urlopen return opener.open(url, data, timeout) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 532, in open response = meth(req, response) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 642, in http_response 'http', request, response, code, msg, hdrs) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 570, in error return self._call_chain(*args) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain result = func(*args) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 650, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbidden
Это потому, что мой сервер не позволяет программному доступу к данным веб-сайта, потому что он предназначен для браузеров, которые могут анализировать данные HTML. Обычно мы можем преодолеть эту ошибку, отправив Пользовательский агент
Заголовок по запросу. Давайте посмотрим на модифицированную программу для этого.
import urllib.request # Request with Header Data to send User-Agent header url = 'https://www.journaldev.com' headers = {} headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17' request = urllib.request.Request(url, headers=headers) resp = urllib.request.urlopen(request) print(resp.read())
Мы создаем заголовки запроса с помощью словаря, а затем отправляя его в запрос. Вышеуказанная программа напечатает данные HTML, полученные от домашней страницы JournalDev.
Пример отдыха на Python Urllib
Веб-сервисы REST доступны по протоколам HTTP, поэтому мы можем легко получить доступ к ним с помощью модуля Urllib. У меня есть простая веб-служба для отдыха на основе JSON, работающая на моем локальном компьютере, созданном с помощью JSON Server. Это отличный модуль узла для запуска веб-сервисов Dummy Json Read для целей тестирования.
import urllib.request response = urllib.request.urlopen('https://localhost:3000/employees') print(response.read())
Обратите внимание, что выход консоли печатает данные JSON.
Заголовки ответа на ответ Python Urllib
Мы можем получить заголовки ответа, позвонив Информация ()
Функция на объекте ответа. Это возвращает словарь, поэтому мы также можем извлечь конкретные данные заголовка от ответа.
import urllib.request response = urllib.request.urlopen('https://localhost:3000/employees') print(response.info()) print('Response Content Type is = ', response.info()["content-type"])
Выход:
X-Powered-By: Express Vary: Origin, Accept-Encoding Access-Control-Allow-Credentials: true Cache-Control: no-cache Pragma: no-cache Expires: -1 X-Content-Type-Options: nosniff Content-Type: application/json; charset=utf-8 Content-Length: 260 ETag: W/"104-LQla2Z3Cx7OedNGjbuVMiKaVNXk" Date: Wed, 09 May 2018 19:26:20 GMT Connection: close Response Content Type is = application/json; charset=utf-8
Python Urllib Post.
Давайте посмотрим на пример для вызова последующего метода.
import urllib.request import urllib.parse post_url = 'https://localhost:3000/employees' headers = {} headers['Content-Type'] = 'application/json' # POST request encoded data post_data = urllib.parse.urlencode({'name' : 'David', 'salary' : '9988'}).encode('ascii') #Automatically calls POST method because request has data post_response = urllib.request.urlopen(url=post_url, data=post_data) print(post_response.read())
Когда мы называем Urlopen
Функция, если запрос имеет данные
Затем он автоматически использует Пост
HTTP-метод. Ниже приведены изображение, показывает вывод вышеописанного вызова для моей демо службы.
Ссылка: API док