В этой статье мы вам расскажем, как библиотека urllib применяется в Python для веб-скреппинга, выполнения API-запросов и т.д. Вы познакомитесь с модулями urllib и лучшими практиками использования этой библиотеки.
Содержание
- Введение в urllib
- Установка urllib
- Модули urllib
- Основные HTTP-запросы
- Работа с URL-адресами
- Продвинутые приемы использования urllib
- Веб-скрепинг с помощью urllib
- Библиотека urllib и работа с API
- Скачивание файлов
- Лучшие практики
- Заключение
Введение в urllib
Urllib – это библиотека Python, предоставляющая набор модулей для работы с URL (Uniform Resource Locators). Она позволяет взаимодействовать с веб-ресурсами, выполняя HTTP-запросы, разбирая URL и обрабатывая различные аспекты веб-коммуникаций.
Зачем нужна библиотека urllib? Это мощный инструмент для решения веб-задач на языке Python. Библиотека широко используется для веб-скреппинга, выполнения API-запросов, загрузки файлов из Интернета и т.д. С помощью urllib можно автоматизировать различные процессы, связанные с веб, что делает ее незаменимой библиотекой для веб-разработчиков и специалистов по исследованию данных.
Установка urllib
Urllib входит в состав стандартной библиотеки Python, поэтому ее не нужно устанавливать отдельно. Вы можете начать использовать ее, импортировав соответствующие модули в свой Python-скрипт.
Эта библиотека доступна как в Python 2, так и в Python 3, однако его использование может несколько отличаться в разных версиях. Рекомендуется использовать Python 3, так как Python 2 больше не поддерживается.
Модули urllib
Библиотека urllib состоит из нескольких модулей, каждый из которых выполняет определенную задачу. Рассмотрим основные из них.
urllib.request
Модуль urllib.request предоставляет функции для выполнения HTTP-запросов, включая GET- и POST-запросы, и обработки ответов.
import urllib.request
# Пример: отправка GET-запроса
response = urllib.request.urlopen('https://example.com')
html = response.read()
print(html)urllib.parse
Модуль urllib.parse предназначен для парсинга URL-адресов. Он разбивает их их на такие компоненты, как scheme, netloc, path, query и fragment.
import urllib.parse # Пример: парсинг URL url = 'https://www.example.com/path?param=value' parsed_url = urllib.parse.urlparse(url) print(parsed_url)
urllib.error
Модуль urllib.error обрабатывает исключения и ошибки, которые могут возникать при выполнении HTTP-запросов.
import urllib.error
try:
response = urllib.request.urlopen('https://nonexistent-url.com')
except urllib.error.HTTPError as e:
print(f'HTTP Error: {e.code}')
except urllib.error.URLError as e:
print(f'URL Error: {e.reason}')urllib.robotparser
Модуль urllib.robotparser используется для разбора файлов robots.txt, чтобы проверить, разрешен ли доступ веб-краулеру к определенным частям сайта.
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
allowed = rp.can_fetch('MyCrawler', 'https://example.com/page')
print(allowed)Основные HTTP-запросы
Отправка GET-запросов
Получение веб-содержимого при помощи GET-запросов – одна из основных операций в urllib.
import urllib.request
response = urllib.request.urlopen('https://example.com')
html = response.read()
print(html)Отправка POST-запросов
POST-запросы служат для отправки данных на сервер. Они часто используются в веб-формах.
import urllib.request
import urllib.parse
data = urllib.parse.urlencode({'param1': 'value1', 'param2': 'value2'}).encode('utf-8')
response = urllib.request.urlopen('https://example.com/post', data=data)
html = response.read()
print(html)Работа с HTTP-ответами
Вы можете получить доступ к различным свойствам HTTP-ответа, таким как код состояния, заголовки и содержимое.
import urllib.request
response = urllib.request.urlopen('https://example.com')
status_code = response.getcode()
headers = response.info()
html = response.read()
print(f'Status Code: {status_code}')
print(f'Headers: {headers}')
print(html)Обработка ошибок HTTP
Urllib обеспечивает обработку ошибок, связанных с HTTP, таких как 404 Not Found или ошибки подключения.
import urllib.error
try:
response = urllib.request.urlopen('https://nonexistent-url.com')
except urllib.error.HTTPError as e:
print(f'HTTP Error: {e.code}')
except urllib.error.URLError as e:
print(f'URL Error: {e.reason}')Работа с URL-адресами
Парсинг URL-адресов
При помощи модуля urllib.parse можно разобрать URL на составляющие.
import urllib.parse
url = 'https://www.example.com/path?param=value'
parsed_url = urllib.parse.urlparse(url)
print(f'Scheme: {parsed_url.scheme}')
print(f'Netloc: {parsed_url.netloc}')
print(f'Path: {parsed_url.path}')
print(f'Query: {parsed_url.query}')Конструирование URL-адресов
Вы можете конструировать URL, комбинируя их компоненты с помощью urllib.parse.urlunparse() или добавляя параметры запроса к существующему URL.
import urllib.parse
components = ('https', 'example.com', 'path', '', 'param=value', '')
constructed_url = urllib.parse.urlunparse(components)
print(constructed_url)Продвинутые приемы использования urllib
Работа с файлами cookie
Urllib может работать с cookies с помощью модуля http.cookiejar. Он позволяет управлять данными сессии между запросами.
import urllib.request
import http.cookiejar
# Create a cookie jar to store cookies
cookie_jar = http.cookiejar.CookieJar()
# Create an opener with the cookie jar
cookie_handler = urllib.request.HTTPCookieProcessor(cookie_jar)
opener = urllib.request.build_opener(cookie_handler)
# Make a GET request to a website that sets cookies
url = 'https://httpbin.org/cookies/set?cookie1=value1&cookie2=value2'
response = opener.open(url)
# Check if cookies have been received and stored
if cookie_jar:
print("Cookies Received:")
for cookie in cookie_jar:
print(f"{cookie.name}: {cookie.value}")Работа с заголовками
Вы можете манипулировать HTTP-заголовками для включения в запросы дополнительной информации, например, User-Agent или пользовательских заголовков.
import urllib.request
url = 'https://example.com'
headers = {'User-Agent': 'My User Agent'}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)Работа с перенаправлениями
Urllib может автоматически следовать за HTTP-перенаправлениями. При необходимости это поведение можно отключить.
import urllib.request
# Create a Request object with a URL that redirects
url = 'http://www.example.com' # This URL redirects to 'https://www.example.com'
req = urllib.request.Request(url, headers={'User-Agent': 'My User Agent'})
# Open the URL without following redirects
response = urllib.request.urlopen(req, allow_redirects=False)
# Check the response status code to see if it's a redirect
if response.status == 302 or response.status == 301:
print(f'Redirect detected: Status Code {response.status}')
else:
final_url = response.geturl() # Get the final URL
print(f'Final URL: {final_url}')Работа с тайм-аутами
Вы можете установить тайм-ауты для HTTP-запросов, чтобы предотвратить их бесконечное зависание.
import urllib.request
import urllib.error
url = 'https://example.com'
try:
response = urllib.request.urlopen(url, timeout=10) # Set a timeout of 10 seconds
html = response.read()
print(html)
except urllib.error.URLError as e:
if isinstance(e.reason, socket.timeout):
print("Request timed out.")
else:
print(f"URL Error: {e.reason}")Веб-скрепинг с помощью urllib
Получение HTML-содержимого
Urllib можно использовать для веб-скрапинга, посылая GET-запросы на сайты и получая HTML-контент.
import urllib.request url = 'https://example.com' response = urllib.request.urlopen(url) html = response.read()
Парсинг HTML с помощью BeautifulSoup
Для извлечения данных из HTML можно объединить urllib с библиотекой типа BeautifulSoup.
import urllib.request
from bs4 import BeautifulSoup
# Send a GET request to a web page and retrieve its HTML content
url = 'https://example.com'
response = urllib.request.urlopen(url)
html = response.read()
# Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
# Find and print a specific element from the HTML (e.g., the page title)
title_element = soup.find('title')
if title_element:
print('Page Title:', title_element.text)
else:
print('Title not found on the page.')Сбор данных с веб-страниц
Вы можете собирать данные с веб-страниц, определяя нужные HTML-элементы и извлекая их содержимое с помощью BeautifulSoup.
import urllib.request
from bs4 import BeautifulSoup
# URL of the web page to scrape
url = 'https://example-news-site.com'
# Send an HTTP GET request to the URL
response = urllib.request.urlopen(url)
# Read the HTML content of the page
html = response.read()
# Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
# Find and extract article titles
article_titles = []
# Assuming article titles are in h2 tags with a specific class
for h2_tag in soup.find_all('h2', class_='article-title'):
article_titles.append(h2_tag.text)
# Print the extracted article titles
for title in article_titles:
print(title)Примечание редакции: на тему скрапинга читайте также “Скрапинг с помощью Python и Selenium”.
Библиотека urllib и работа с API
Выполнение GET-запросов к API
С помощью urllib можно выполнять GET-запросы к API и получать данные.
import urllib.request api_url = 'https://api.example.com/data' response = urllib.request.urlopen(api_url) data = response.read() # Parse the JSON response if applicable.
Выполнение POST-запросов к API
Аналогичным образом можно отправлять POST-запросы к API, включив необходимые данные в тело запроса.
import urllib.request
import urllib.parse
data = urllib.parse.urlencode({'param1': 'value1', 'param2': 'value2'}).encode('utf-8')
api_url = 'https://api.example.com/data'
response = urllib.request.urlopen(api_url, data=data)
data = response.read()
# Parse the JSON response if applicable.Работа с ответами в формате JSON
Многие API-интерфейсы возвращают данные в формате JSON, поэтому для их анализа и работы с ними можно использовать модуль json языка Python.
import urllib.request
import json
api_url = 'https://api.example.com/data'
response = urllib.request.urlopen(api_url)
data = json.loads(response.read().decode('utf-8'))Скачивание файлов
Загрузка файлов из Интернета
Вы можете использовать urllib для загрузки файлов из Интернета, например, изображений, PDF-файлов или других документов.
import urllib.request file_url = 'https://example.com/file.pdf' urllib.request.urlretrieve(file_url, 'downloaded_file.pdf')
Обработка загрузки больших файлов
Для загрузки больших файлов можно использовать потоковый подход для экономии памяти.
import urllib.request
file_url = 'https://example.com/large_file.zip'
with urllib.request.urlopen(file_url) as response, open('downloaded_file.zip', 'wb') as out_file:
while True:
data = response.read(4096)
if not data:
break
out_file.write(data)Лучшие практики
Обработка ошибок
Всегда обрабатывайте исключения и ошибки при выполнении HTTP-запросов или работе с URL-адресами, чтобы обеспечить надежность кода.
import urllib.error
import urllib.request
try:
response = urllib.request.urlopen('https://nonexistent-url.com')
except urllib.error.HTTPError as e:
print(f'HTTP Error: {e.code}')
except urllib.error.URLError as e:
print(f'URL Error: {e.reason}')
else:
# Code to execute if there are no errors
html = response.read()
print(html)Заголовки User-Agent
Устанавливайте в запросах заголовок User-Agent для идентификации вашего скрипта или приложения при взаимодействии с веб-сайтами или API.
import urllib.request
# Define the User-Agent header
user_agent = 'My Custom User Agent'
# Create a request object with the User-Agent header
url = 'https://example.com'
headers = {'User-Agent': user_agent}
req = urllib.request.Request(url, headers=headers)
# Send the request
response = urllib.request.urlopen(req)
# Now you can work with the response as needed
html = response.read()
print(html)Соблюдайте правила Robots.txt
Прежде чем приступать к скраппингу, проверьте файл robots.txt сайта, чтобы узнать, разрешен ли скраппинг, и следуйте правилам, чтобы избежать юридических проблем.
import urllib.robotparser
# Create a RobotFileParser object and specify the URL of the website's robots.txt file.
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
# Read and parse the robots.txt file.
rp.read()
# Check if it's allowed to crawl a specific URL.
is_allowed = rp.can_fetch('MyCrawler', 'https://example.com/some-page')
if is_allowed:
print("Crawling is allowed for this URL.")
else:
print("Crawling is not allowed for this URL according to robots.txt.")Ограничение скорости
При выполнении запросов к API следует соблюдать все политики ограничения скорости, чтобы не перегружать сервер.
import urllib.request
import time
# Define the API URL and the rate limit (requests per minute)
api_url = 'https://api.example.com/data'
rate_limit = 60 # 60 requests per minute
# Function to make an API request with rate limiting
def make_api_request_with_rate_limit(url):
# Calculate the time interval between requests
time_interval = 60 / rate_limit # 60 seconds in a minute
time_since_last_request = time.time() - last_request_time
if time_since_last_request < time_interval:
time.sleep(time_interval - time_since_last_request)
response = urllib.request.urlopen(url)
return response.read()
# Initialize the time of the last request
last_request_time = time.time()
# Make API requests with rate limiting
for _ in range(10): # Make 10 requests
data = make_api_request_with_rate_limit(api_url)
print(data)
# Update the time of the last request
last_request_time = time.time()Заключение
Urllib – это универсальная библиотека на языке Python, позволяющая работать с URL-адресами, выполнять HTTP-запросы и эффективно взаимодействовать с веб-ресурсами. Если вы собираете данные с сайтов, взаимодействуете с API или загружаете файлы из Интернета, эта библиотека вам точно пригодится. Познакомившись с ее модулями, вы сможете использовать всю ее мощь для решения задач, связанных с веб.
Перевод статьи «urllib in Python».
Сообщение Библиотека urllib в Python появились сначала на pythonturbo.
Source: pythonturbo.ru