Python periksa apakah url 404

Ada terjemahan Perancis dari revisi awal HOWTO ini, tersedia di urllib2 - Le Manuel manquant

Perkenalan

Artikel Terkait

Anda juga dapat menemukan artikel berikut tentang mengambil sumber daya web dengan Python

  • Otentikasi Dasar

    Tutorial tentang Otentikasi Dasar, dengan contoh-contoh di Python

urllib. request adalah modul Python untuk mengambil URL (Uniform Resource Locators). Ini menawarkan antarmuka yang sangat sederhana, dalam bentuk fungsi urlopen. Ini mampu mengambil URL menggunakan berbagai protokol yang berbeda. Ini juga menawarkan antarmuka yang sedikit lebih kompleks untuk menangani situasi umum - seperti otentikasi dasar, cookie, proxy, dan sebagainya. Ini disediakan oleh objek yang disebut penangan dan pembuka

urllib. permintaan mendukung pengambilan URL untuk banyak "skema URL" (diidentifikasi dengan string sebelum

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
6 di URL - misalnya
import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
7 adalah skema URL dari
import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
8) menggunakan protokol jaringan terkait (e. g. FTP, HTTP). Tutorial ini berfokus pada kasus yang paling umum, HTTP

Untuk situasi sederhana, urlopen sangat mudah digunakan. Tetapi segera setelah Anda menemukan kesalahan atau kasus non-sepele saat membuka URL HTTP, Anda memerlukan pemahaman tentang HyperText Transfer Protocol. Referensi paling komprehensif dan otoritatif untuk HTTP adalah RFC 2616. Ini adalah dokumen teknis dan tidak dimaksudkan untuk mudah dibaca. HOWTO ini bertujuan untuk mengilustrasikan penggunaan urllib, dengan detail yang cukup tentang HTTP untuk membantu Anda. Ini tidak dimaksudkan untuk menggantikan dokumen, tetapi pelengkap untuk itu

Mengambil URL

Cara paling sederhana untuk menggunakan urllib. permintaan adalah sebagai berikut

import urllib.request
with urllib.request.urlopen('http://python.org/') as response:
   html = response.read()

Jika Anda ingin mengambil sumber daya melalui URL dan menyimpannya di lokasi sementara, Anda dapat melakukannya melalui fungsi dan

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass

Banyak penggunaan urllib akan sesederhana itu (perhatikan bahwa alih-alih 'http. ’ URL kami dapat menggunakan URL yang dimulai dengan ‘ftp. ’, ‘berkas. ', dll. ). Namun, tujuan dari tutorial ini adalah untuk menjelaskan kasus yang lebih rumit, berkonsentrasi pada HTTP

HTTP didasarkan pada permintaan dan tanggapan - klien membuat permintaan dan server mengirim tanggapan. urllib. request mencerminkan ini dengan objek

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_2 yang mewakili permintaan HTTP yang Anda buat. Dalam bentuknya yang paling sederhana, Anda membuat objek Permintaan yang menentukan URL yang ingin Anda ambil. Memanggil
import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_3 dengan objek Permintaan ini mengembalikan objek respons untuk URL yang diminta. Tanggapan ini adalah objek seperti file, yang berarti Anda misalnya dapat memanggil
import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
4 pada tanggapan

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()

Perhatikan bahwa urllib. request memanfaatkan antarmuka Permintaan yang sama untuk menangani semua skema URL. Misalnya, Anda dapat membuat permintaan FTP seperti itu

req = urllib.request.Request('ftp://example.com/')
_

Dalam kasus HTTP, ada dua hal tambahan yang memungkinkan Anda melakukan objek Permintaan. Pertama, Anda dapat melewatkan data untuk dikirim ke server. Kedua, Anda dapat mengirimkan informasi tambahan ("metadata") tentang data atau tentang permintaan itu sendiri, ke server - informasi ini dikirim sebagai "header" HTTP. Mari kita lihat masing-masing secara bergiliran

Data

Terkadang Anda ingin mengirim data ke URL (seringkali URL merujuk ke skrip CGI (Common Gateway Interface) atau aplikasi web lainnya). Dengan HTTP, hal ini sering dilakukan dengan menggunakan apa yang dikenal sebagai permintaan POST. Ini sering kali dilakukan browser Anda saat mengirimkan formulir HTML yang Anda isi di web. Tidak semua POST harus berasal dari formulir. Anda dapat menggunakan POST untuk mengirimkan data arbitrer ke aplikasi Anda sendiri. Dalam kasus umum formulir HTML, data perlu dikodekan dengan cara standar, lalu diteruskan ke objek Permintaan sebagai argumen

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
5. Pengkodean dilakukan dengan menggunakan fungsi dari perpustakaan

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }

data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()

Perhatikan bahwa penyandian lain terkadang diperlukan (mis. g. untuk mengunggah file dari formulir HTML - lihat untuk detail lebih lanjut)

Jika Anda tidak memberikan argumen

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_5, urllib menggunakan permintaan GET. Salah satu perbedaan permintaan GET dan POST adalah bahwa permintaan POST sering kali memiliki "efek samping". mereka mengubah status sistem dengan cara tertentu (misalnya dengan melakukan pemesanan melalui situs web untuk mengirimkan ratusan spam kaleng ke pintu Anda). Meskipun standar HTTP memperjelas bahwa POST dimaksudkan untuk selalu menyebabkan efek samping, dan permintaan GET tidak pernah menyebabkan efek samping, tidak ada yang mencegah permintaan GET memiliki efek samping, atau permintaan POST tidak memiliki efek samping. Data juga dapat dikirimkan dalam permintaan HTTP GET dengan menyandikannya di URL itu sendiri

Ini dilakukan sebagai berikut

>>> import urllib.request
>>> import urllib.parse
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.  
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)

Perhatikan bahwa URL lengkap dibuat dengan menambahkan

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
8 ke URL, diikuti dengan nilai yang disandikan

Header

Kami akan membahas di sini satu tajuk HTTP tertentu, untuk mengilustrasikan cara menambahkan tajuk ke permintaan HTTP Anda

Beberapa situs web tidak suka dijelajahi oleh program, atau mengirimkan versi yang berbeda ke browser yang berbeda. Secara default urllib mengidentifikasi dirinya sebagai

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
9 (di mana
req = urllib.request.Request('ftp://example.com/')
0 dan
req = urllib.request.Request('ftp://example.com/')
1 adalah nomor versi mayor dan minor dari rilis Python, e. g.
req = urllib.request.Request('ftp://example.com/')
_2), yang mungkin membingungkan situs, atau sekadar tidak berfungsi. Cara browser mengidentifikasi dirinya adalah melalui
req = urllib.request.Request('ftp://example.com/')
3 header. Saat Anda membuat objek Permintaan, Anda dapat memasukkan kamus header. Contoh berikut membuat permintaan yang sama seperti di atas, tetapi mengidentifikasi dirinya sebagai versi Internet Explorer

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()

Tanggapan juga memiliki dua metode yang berguna. Lihat bagian yang muncul setelah kita melihat apa yang terjadi jika terjadi kesalahan

Menangani Pengecualian

urlopen memunculkan

req = urllib.request.Request('ftp://example.com/')
4 ketika tidak dapat menangani respons (meskipun seperti biasa dengan API Python, pengecualian bawaan seperti , dll. juga dapat dinaikkan)

req = urllib.request.Request('ftp://example.com/')
_7 adalah subkelas dari
req = urllib.request.Request('ftp://example.com/')
4 yang diangkat dalam kasus khusus URL HTTP

Kelas pengecualian diekspor dari modul

Kesalahan URL

Seringkali, URLError dimunculkan karena tidak ada koneksi jaringan (tidak ada rute ke server yang ditentukan), atau server yang ditentukan tidak ada. Dalam hal ini, exception yang dimunculkan akan memiliki atribut 'reason', yaitu tuple yang berisi kode error dan pesan error teks

e. g

>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')

Kesalahan HTTP

Setiap respons HTTP dari server berisi "kode status" numerik. Terkadang kode status menunjukkan bahwa server tidak dapat memenuhi permintaan. Penangan default akan menangani beberapa respons ini untuk Anda (misalnya, jika responsnya adalah "pengalihan" yang meminta klien mengambil dokumen dari URL yang berbeda, urllib akan menanganinya untuk Anda). Bagi yang tidak bisa ditangani, urlopen akan menaikkan

req = urllib.request.Request('ftp://example.com/')
7. Kesalahan umum termasuk '404' (halaman tidak ditemukan), '403' (permintaan dilarang), dan '401' (diperlukan autentikasi)

Lihat bagian 10 dari RFC 2616 untuk referensi tentang semua kode kesalahan HTTP

Instance

req = urllib.request.Request('ftp://example.com/')
7 yang dimunculkan akan memiliki atribut 'kode' bilangan bulat, yang sesuai dengan kesalahan yang dikirim oleh server

Kode Kesalahan

Karena penangan default menangani pengalihan (kode dalam rentang 300), dan kode dalam rentang 100–299 menunjukkan keberhasilan, biasanya Anda hanya akan melihat kode kesalahan dalam rentang 400–599

adalah kamus kode respons yang berguna yang menunjukkan semua kode respons yang digunakan oleh RFC 2616. Kamus direproduksi di sini untuk kenyamanan

# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
responses = {
    100: ('Continue', 'Request received, please continue'),
    101: ('Switching Protocols',
          'Switching to new protocol; obey Upgrade header'),

    200: ('OK', 'Request fulfilled, document follows'),
    201: ('Created', 'Document created, URL follows'),
    202: ('Accepted',
          'Request accepted, processing continues off-line'),
    203: ('Non-Authoritative Information', 'Request fulfilled from cache'),
    204: ('No Content', 'Request fulfilled, nothing follows'),
    205: ('Reset Content', 'Clear input form for further input.'),
    206: ('Partial Content', 'Partial content follows.'),

    300: ('Multiple Choices',
          'Object has several resources -- see URI list'),
    301: ('Moved Permanently', 'Object moved permanently -- see URI list'),
    302: ('Found', 'Object moved temporarily -- see URI list'),
    303: ('See Other', 'Object moved -- see Method and URL list'),
    304: ('Not Modified',
          'Document has not changed since given time'),
    305: ('Use Proxy',
          'You must use proxy specified in Location to access this '
          'resource.'),
    307: ('Temporary Redirect',
          'Object moved temporarily -- see URI list'),

    400: ('Bad Request',
          'Bad request syntax or unsupported method'),
    401: ('Unauthorized',
          'No permission -- see authorization schemes'),
    402: ('Payment Required',
          'No payment -- see charging schemes'),
    403: ('Forbidden',
          'Request forbidden -- authorization will not help'),
    404: ('Not Found', 'Nothing matches the given URI'),
    405: ('Method Not Allowed',
          'Specified method is invalid for this server.'),
    406: ('Not Acceptable', 'URI not available in preferred format.'),
    407: ('Proxy Authentication Required', 'You must authenticate with '
          'this proxy before proceeding.'),
    408: ('Request Timeout', 'Request timed out; try again later.'),
    409: ('Conflict', 'Request conflict.'),
    410: ('Gone',
          'URI no longer exists and has been permanently removed.'),
    411: ('Length Required', 'Client must specify Content-Length.'),
    412: ('Precondition Failed', 'Precondition in headers is false.'),
    413: ('Request Entity Too Large', 'Entity is too large.'),
    414: ('Request-URI Too Long', 'URI is too long.'),
    415: ('Unsupported Media Type', 'Entity body in unsupported format.'),
    416: ('Requested Range Not Satisfiable',
          'Cannot satisfy request range.'),
    417: ('Expectation Failed',
          'Expect condition could not be satisfied.'),

    500: ('Internal Server Error', 'Server got itself in trouble'),
    501: ('Not Implemented',
          'Server does not support this operation'),
    502: ('Bad Gateway', 'Invalid responses from another server/proxy.'),
    503: ('Service Unavailable',
          'The server cannot process the request due to a high load'),
    504: ('Gateway Timeout',
          'The gateway server did not receive a timely response'),
    505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
    }

Saat terjadi kesalahan, server merespons dengan mengembalikan kode kesalahan HTTP dan halaman kesalahan. Anda dapat menggunakan instance

req = urllib.request.Request('ftp://example.com/')
_7 sebagai respons pada halaman yang dikembalikan. Ini berarti selain atribut kode, ia juga memiliki metode read, geturl, dan info, yang dikembalikan oleh modul
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }

data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
4

>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...

Membungkusnya

Jadi jika Anda ingin bersiap untuk

req = urllib.request.Request('ftp://example.com/')
_7 atau
req = urllib.request.Request('ftp://example.com/')
4 ada dua pendekatan dasar. Saya lebih suka pendekatan kedua

Nomor 1

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
0

Catatan

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }

data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_7 harus didahulukan, jika tidak
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }

data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
8 juga akan menangkap
req = urllib.request.Request('ftp://example.com/')
7

Nomor 2

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
_1

info dan geturl

Respons yang dikembalikan oleh urlopen (atau

req = urllib.request.Request('ftp://example.com/')
7 instance) memiliki dua metode yang berguna
>>> import urllib.request
>>> import urllib.parse
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.  
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
1 dan
>>> import urllib.request
>>> import urllib.parse
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.  
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
2 dan didefinisikan dalam modul

geturl - ini mengembalikan URL sebenarnya dari halaman yang diambil. Ini berguna karena

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_3 (atau objek pembuka yang digunakan) mungkin mengikuti pengalihan. URL halaman yang diambil mungkin tidak sama dengan URL yang diminta

info - ini mengembalikan objek mirip kamus yang mendeskripsikan halaman yang diambil, khususnya header yang dikirim oleh server. Saat ini merupakan

>>> import urllib.request
>>> import urllib.parse
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.  
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
_5 contoh

Header tipikal mencakup 'Panjang konten', 'Jenis konten', dan seterusnya. Lihat Referensi Cepat ke Tajuk HTTP untuk daftar tajuk HTTP yang berguna dengan penjelasan singkat tentang arti dan penggunaannya

Pembuka dan Penangan

Saat Anda mengambil URL, Anda menggunakan pembuka (contoh dari nama yang mungkin membingungkan). Biasanya kami telah menggunakan pembuka default - melalui

import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
3 - tetapi Anda dapat membuat pembuka khusus. Pembuka menggunakan penangan. Semua "pengangkatan berat" dilakukan oleh pawang. Setiap penangan tahu cara membuka URL untuk skema URL tertentu (http, ftp, dll. ), atau cara menangani aspek pembukaan URL, misalnya pengalihan HTTP atau cookie HTTP

Anda ingin membuat pembuka jika Anda ingin mengambil URL dengan penangan khusus yang terpasang, misalnya untuk mendapatkan pembuka yang menangani cookie, atau untuk mendapatkan pembuka yang tidak menangani pengalihan

Untuk membuat pembuka, buat instance

>>> import urllib.request
>>> import urllib.parse
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.  
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
8, lalu panggil
>>> import urllib.request
>>> import urllib.parse
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.  
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
9 berulang kali

Sebagai alternatif, Anda dapat menggunakan

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_0, yang merupakan fungsi praktis untuk membuat objek pembuka dengan satu pemanggilan fungsi.
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
0 menambahkan beberapa penangan secara default, tetapi menyediakan cara cepat untuk menambahkan lebih banyak dan/atau menimpa penangan default

Jenis penangan lain yang mungkin ingin Anda tangani proxy, autentikasi, dan situasi umum lainnya tetapi sedikit terspesialisasi

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
2 dapat digunakan untuk menjadikan objek
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
3 sebagai pembuka default (global). Ini berarti panggilan ke
import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
3 akan menggunakan pembuka yang telah Anda pasang

Objek pembuka memiliki metode

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_5, yang dapat dipanggil langsung untuk mengambil url dengan cara yang sama seperti fungsi
import urllib.request

req = urllib.request.Request('http://www.voidspace.org.uk')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
3. tidak perlu menelepon
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
2, kecuali untuk kenyamanan

Otentikasi Dasar

Untuk mengilustrasikan pembuatan dan pemasangan penangan, kami akan menggunakan

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
8. Untuk pembahasan yang lebih mendetail tentang subjek ini – termasuk penjelasan tentang cara kerja Otentikasi Dasar – lihat Tutorial Otentikasi Dasar

Saat autentikasi diperlukan, server mengirimkan header (serta kode kesalahan 401) yang meminta autentikasi. Ini menentukan skema otentikasi dan 'ranah'. Headernya terlihat seperti.

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_9

e. g

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
_2

Klien kemudian harus mencoba lagi permintaan dengan nama dan kata sandi yang sesuai untuk ranah yang disertakan sebagai header dalam permintaan. Ini adalah 'otentikasi dasar'. Untuk menyederhanakan proses ini, kita dapat membuat instance

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
8 dan pembuka untuk menggunakan handler ini

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
_8 menggunakan objek yang disebut pengelola kata sandi untuk menangani pemetaan URL dan bidang ke kata sandi dan nama pengguna. Jika Anda tahu apa itu ranah (dari header autentikasi yang dikirim oleh server), maka Anda dapat menggunakan
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
2. Seringkali seseorang tidak peduli apa alam itu. Dalam hal ini, akan lebih mudah untuk menggunakan ________24______3. Ini memungkinkan Anda untuk menentukan nama pengguna dan kata sandi default untuk URL. Ini akan diberikan jika Anda tidak memberikan kombinasi alternatif untuk ranah tertentu. Kami menunjukkan ini dengan memberikan
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
_4 sebagai argumen ranah untuk metode
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
5

URL tingkat teratas adalah URL pertama yang memerlukan autentikasi. URL "lebih dalam" dari URL yang Anda lewati. add_password() juga akan cocok

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
_3

Catatan

Dalam contoh di atas, kami hanya menyediakan

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
8 hingga
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' }
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
0. Secara default pembuka memiliki penangan untuk situasi normal -
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
8 (jika pengaturan proksi seperti
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
9 variabel lingkungan ditetapkan),
# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
responses = {
    100: ('Continue', 'Request received, please continue'),
    101: ('Switching Protocols',
          'Switching to new protocol; obey Upgrade header'),

    200: ('OK', 'Request fulfilled, document follows'),
    201: ('Created', 'Document created, URL follows'),
    202: ('Accepted',
          'Request accepted, processing continues off-line'),
    203: ('Non-Authoritative Information', 'Request fulfilled from cache'),
    204: ('No Content', 'Request fulfilled, nothing follows'),
    205: ('Reset Content', 'Clear input form for further input.'),
    206: ('Partial Content', 'Partial content follows.'),

    300: ('Multiple Choices',
          'Object has several resources -- see URI list'),
    301: ('Moved Permanently', 'Object moved permanently -- see URI list'),
    302: ('Found', 'Object moved temporarily -- see URI list'),
    303: ('See Other', 'Object moved -- see Method and URL list'),
    304: ('Not Modified',
          'Document has not changed since given time'),
    305: ('Use Proxy',
          'You must use proxy specified in Location to access this '
          'resource.'),
    307: ('Temporary Redirect',
          'Object moved temporarily -- see URI list'),

    400: ('Bad Request',
          'Bad request syntax or unsupported method'),
    401: ('Unauthorized',
          'No permission -- see authorization schemes'),
    402: ('Payment Required',
          'No payment -- see charging schemes'),
    403: ('Forbidden',
          'Request forbidden -- authorization will not help'),
    404: ('Not Found', 'Nothing matches the given URI'),
    405: ('Method Not Allowed',
          'Specified method is invalid for this server.'),
    406: ('Not Acceptable', 'URI not available in preferred format.'),
    407: ('Proxy Authentication Required', 'You must authenticate with '
          'this proxy before proceeding.'),
    408: ('Request Timeout', 'Request timed out; try again later.'),
    409: ('Conflict', 'Request conflict.'),
    410: ('Gone',
          'URI no longer exists and has been permanently removed.'),
    411: ('Length Required', 'Client must specify Content-Length.'),
    412: ('Precondition Failed', 'Precondition in headers is false.'),
    413: ('Request Entity Too Large', 'Entity is too large.'),
    414: ('Request-URI Too Long', 'URI is too long.'),
    415: ('Unsupported Media Type', 'Entity body in unsupported format.'),
    416: ('Requested Range Not Satisfiable',
          'Cannot satisfy request range.'),
    417: ('Expectation Failed',
          'Expect condition could not be satisfied.'),

    500: ('Internal Server Error', 'Server got itself in trouble'),
    501: ('Not Implemented',
          'Server does not support this operation'),
    502: ('Bad Gateway', 'Invalid responses from another server/proxy.'),
    503: ('Service Unavailable',
          'The server cannot process the request due to a high load'),
    504: ('Gateway Timeout',
          'The gateway server did not receive a timely response'),
    505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
    }
0,
# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
responses = {
    100: ('Continue', 'Request received, please continue'),
    101: ('Switching Protocols',
          'Switching to new protocol; obey Upgrade header'),

    200: ('OK', 'Request fulfilled, document follows'),
    201: ('Created', 'Document created, URL follows'),
    202: ('Accepted',
          'Request accepted, processing continues off-line'),
    203: ('Non-Authoritative Information', 'Request fulfilled from cache'),
    204: ('No Content', 'Request fulfilled, nothing follows'),
    205: ('Reset Content', 'Clear input form for further input.'),
    206: ('Partial Content', 'Partial content follows.'),

    300: ('Multiple Choices',
          'Object has several resources -- see URI list'),
    301: ('Moved Permanently', 'Object moved permanently -- see URI list'),
    302: ('Found', 'Object moved temporarily -- see URI list'),
    303: ('See Other', 'Object moved -- see Method and URL list'),
    304: ('Not Modified',
          'Document has not changed since given time'),
    305: ('Use Proxy',
          'You must use proxy specified in Location to access this '
          'resource.'),
    307: ('Temporary Redirect',
          'Object moved temporarily -- see URI list'),

    400: ('Bad Request',
          'Bad request syntax or unsupported method'),
    401: ('Unauthorized',
          'No permission -- see authorization schemes'),
    402: ('Payment Required',
          'No payment -- see charging schemes'),
    403: ('Forbidden',
          'Request forbidden -- authorization will not help'),
    404: ('Not Found', 'Nothing matches the given URI'),
    405: ('Method Not Allowed',
          'Specified method is invalid for this server.'),
    406: ('Not Acceptable', 'URI not available in preferred format.'),
    407: ('Proxy Authentication Required', 'You must authenticate with '
          'this proxy before proceeding.'),
    408: ('Request Timeout', 'Request timed out; try again later.'),
    409: ('Conflict', 'Request conflict.'),
    410: ('Gone',
          'URI no longer exists and has been permanently removed.'),
    411: ('Length Required', 'Client must specify Content-Length.'),
    412: ('Precondition Failed', 'Precondition in headers is false.'),
    413: ('Request Entity Too Large', 'Entity is too large.'),
    414: ('Request-URI Too Long', 'URI is too long.'),
    415: ('Unsupported Media Type', 'Entity body in unsupported format.'),
    416: ('Requested Range Not Satisfiable',
          'Cannot satisfy request range.'),
    417: ('Expectation Failed',
          'Expect condition could not be satisfied.'),

    500: ('Internal Server Error', 'Server got itself in trouble'),
    501: ('Not Implemented',
          'Server does not support this operation'),
    502: ('Bad Gateway', 'Invalid responses from another server/proxy.'),
    503: ('Service Unavailable',
          'The server cannot process the request due to a high load'),
    504: ('Gateway Timeout',
          'The gateway server did not receive a timely response'),
    505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
    }
1,
# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
responses = {
    100: ('Continue', 'Request received, please continue'),
    101: ('Switching Protocols',
          'Switching to new protocol; obey Upgrade header'),

    200: ('OK', 'Request fulfilled, document follows'),
    201: ('Created', 'Document created, URL follows'),
    202: ('Accepted',
          'Request accepted, processing continues off-line'),
    203: ('Non-Authoritative Information', 'Request fulfilled from cache'),
    204: ('No Content', 'Request fulfilled, nothing follows'),
    205: ('Reset Content', 'Clear input form for further input.'),
    206: ('Partial Content', 'Partial content follows.'),

    300: ('Multiple Choices',
          'Object has several resources -- see URI list'),
    301: ('Moved Permanently', 'Object moved permanently -- see URI list'),
    302: ('Found', 'Object moved temporarily -- see URI list'),
    303: ('See Other', 'Object moved -- see Method and URL list'),
    304: ('Not Modified',
          'Document has not changed since given time'),
    305: ('Use Proxy',
          'You must use proxy specified in Location to access this '
          'resource.'),
    307: ('Temporary Redirect',
          'Object moved temporarily -- see URI list'),

    400: ('Bad Request',
          'Bad request syntax or unsupported method'),
    401: ('Unauthorized',
          'No permission -- see authorization schemes'),
    402: ('Payment Required',
          'No payment -- see charging schemes'),
    403: ('Forbidden',
          'Request forbidden -- authorization will not help'),
    404: ('Not Found', 'Nothing matches the given URI'),
    405: ('Method Not Allowed',
          'Specified method is invalid for this server.'),
    406: ('Not Acceptable', 'URI not available in preferred format.'),
    407: ('Proxy Authentication Required', 'You must authenticate with '
          'this proxy before proceeding.'),
    408: ('Request Timeout', 'Request timed out; try again later.'),
    409: ('Conflict', 'Request conflict.'),
    410: ('Gone',
          'URI no longer exists and has been permanently removed.'),
    411: ('Length Required', 'Client must specify Content-Length.'),
    412: ('Precondition Failed', 'Precondition in headers is false.'),
    413: ('Request Entity Too Large', 'Entity is too large.'),
    414: ('Request-URI Too Long', 'URI is too long.'),
    415: ('Unsupported Media Type', 'Entity body in unsupported format.'),
    416: ('Requested Range Not Satisfiable',
          'Cannot satisfy request range.'),
    417: ('Expectation Failed',
          'Expect condition could not be satisfied.'),

    500: ('Internal Server Error', 'Server got itself in trouble'),
    501: ('Not Implemented',
          'Server does not support this operation'),
    502: ('Bad Gateway', 'Invalid responses from another server/proxy.'),
    503: ('Service Unavailable',
          'The server cannot process the request due to a high load'),
    504: ('Gateway Timeout',
          'The gateway server did not receive a timely response'),
    505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
    }
2, ________2777_______3, ________277777777777777777777777

# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
responses = {
    100: ('Continue', 'Request received, please continue'),
    101: ('Switching Protocols',
          'Switching to new protocol; obey Upgrade header'),

    200: ('OK', 'Request fulfilled, document follows'),
    201: ('Created', 'Document created, URL follows'),
    202: ('Accepted',
          'Request accepted, processing continues off-line'),
    203: ('Non-Authoritative Information', 'Request fulfilled from cache'),
    204: ('No Content', 'Request fulfilled, nothing follows'),
    205: ('Reset Content', 'Clear input form for further input.'),
    206: ('Partial Content', 'Partial content follows.'),

    300: ('Multiple Choices',
          'Object has several resources -- see URI list'),
    301: ('Moved Permanently', 'Object moved permanently -- see URI list'),
    302: ('Found', 'Object moved temporarily -- see URI list'),
    303: ('See Other', 'Object moved -- see Method and URL list'),
    304: ('Not Modified',
          'Document has not changed since given time'),
    305: ('Use Proxy',
          'You must use proxy specified in Location to access this '
          'resource.'),
    307: ('Temporary Redirect',
          'Object moved temporarily -- see URI list'),

    400: ('Bad Request',
          'Bad request syntax or unsupported method'),
    401: ('Unauthorized',
          'No permission -- see authorization schemes'),
    402: ('Payment Required',
          'No payment -- see charging schemes'),
    403: ('Forbidden',
          'Request forbidden -- authorization will not help'),
    404: ('Not Found', 'Nothing matches the given URI'),
    405: ('Method Not Allowed',
          'Specified method is invalid for this server.'),
    406: ('Not Acceptable', 'URI not available in preferred format.'),
    407: ('Proxy Authentication Required', 'You must authenticate with '
          'this proxy before proceeding.'),
    408: ('Request Timeout', 'Request timed out; try again later.'),
    409: ('Conflict', 'Request conflict.'),
    410: ('Gone',
          'URI no longer exists and has been permanently removed.'),
    411: ('Length Required', 'Client must specify Content-Length.'),
    412: ('Precondition Failed', 'Precondition in headers is false.'),
    413: ('Request Entity Too Large', 'Entity is too large.'),
    414: ('Request-URI Too Long', 'URI is too long.'),
    415: ('Unsupported Media Type', 'Entity body in unsupported format.'),
    416: ('Requested Range Not Satisfiable',
          'Cannot satisfy request range.'),
    417: ('Expectation Failed',
          'Expect condition could not be satisfied.'),

    500: ('Internal Server Error', 'Server got itself in trouble'),
    501: ('Not Implemented',
          'Server does not support this operation'),
    502: ('Bad Gateway', 'Invalid responses from another server/proxy.'),
    503: ('Service Unavailable',
          'The server cannot process the request due to a high load'),
    504: ('Gateway Timeout',
          'The gateway server did not receive a timely response'),
    505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
    }
_8 sebenarnya adalah URL lengkap (termasuk 'http. ’ komponen skema dan nama host dan opsional nomor port) e. g.
# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
responses = {
    100: ('Continue', 'Request received, please continue'),
    101: ('Switching Protocols',
          'Switching to new protocol; obey Upgrade header'),

    200: ('OK', 'Request fulfilled, document follows'),
    201: ('Created', 'Document created, URL follows'),
    202: ('Accepted',
          'Request accepted, processing continues off-line'),
    203: ('Non-Authoritative Information', 'Request fulfilled from cache'),
    204: ('No Content', 'Request fulfilled, nothing follows'),
    205: ('Reset Content', 'Clear input form for further input.'),
    206: ('Partial Content', 'Partial content follows.'),

    300: ('Multiple Choices',
          'Object has several resources -- see URI list'),
    301: ('Moved Permanently', 'Object moved permanently -- see URI list'),
    302: ('Found', 'Object moved temporarily -- see URI list'),
    303: ('See Other', 'Object moved -- see Method and URL list'),
    304: ('Not Modified',
          'Document has not changed since given time'),
    305: ('Use Proxy',
          'You must use proxy specified in Location to access this '
          'resource.'),
    307: ('Temporary Redirect',
          'Object moved temporarily -- see URI list'),

    400: ('Bad Request',
          'Bad request syntax or unsupported method'),
    401: ('Unauthorized',
          'No permission -- see authorization schemes'),
    402: ('Payment Required',
          'No payment -- see charging schemes'),
    403: ('Forbidden',
          'Request forbidden -- authorization will not help'),
    404: ('Not Found', 'Nothing matches the given URI'),
    405: ('Method Not Allowed',
          'Specified method is invalid for this server.'),
    406: ('Not Acceptable', 'URI not available in preferred format.'),
    407: ('Proxy Authentication Required', 'You must authenticate with '
          'this proxy before proceeding.'),
    408: ('Request Timeout', 'Request timed out; try again later.'),
    409: ('Conflict', 'Request conflict.'),
    410: ('Gone',
          'URI no longer exists and has been permanently removed.'),
    411: ('Length Required', 'Client must specify Content-Length.'),
    412: ('Precondition Failed', 'Precondition in headers is false.'),
    413: ('Request Entity Too Large', 'Entity is too large.'),
    414: ('Request-URI Too Long', 'URI is too long.'),
    415: ('Unsupported Media Type', 'Entity body in unsupported format.'),
    416: ('Requested Range Not Satisfiable',
          'Cannot satisfy request range.'),
    417: ('Expectation Failed',
          'Expect condition could not be satisfied.'),

    500: ('Internal Server Error', 'Server got itself in trouble'),
    501: ('Not Implemented',
          'Server does not support this operation'),
    502: ('Bad Gateway', 'Invalid responses from another server/proxy.'),
    503: ('Service Unavailable',
          'The server cannot process the request due to a high load'),
    504: ('Gateway Timeout',
          'The gateway server did not receive a timely response'),
    505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
    }
_9 atau "otoritas" (i. e. nama host, opsional termasuk nomor port) e. g.
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
0 atau
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
1 (contoh terakhir menyertakan nomor port). Otoritas, jika ada, TIDAK boleh mengandung komponen “userinfo” - misalnya
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
2 tidak benar

Proksi

urllib akan secara otomatis mendeteksi pengaturan proxy Anda dan menggunakannya. Ini melalui

>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
_8, yang merupakan bagian dari rantai penangan normal saat pengaturan proxy terdeteksi. Biasanya itu hal yang baik, tetapi ada kalanya hal itu mungkin tidak membantu. Salah satu cara untuk melakukannya adalah dengan menyiapkan
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
.. except urllib.error.URLError as e:
..     print(e.reason)      
...
(4, 'getaddrinfo failed')
8 kita sendiri, tanpa proxy yang ditentukan. Ini dilakukan dengan menggunakan langkah-langkah serupa untuk menyiapkan penangan Otentikasi Dasar

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
_4

Catatan

Saat ini

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
_9 tidak mendukung pengambilan
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
6 lokasi melalui proxy. Namun, ini dapat diaktifkan dengan memperluas urllib. permintaan seperti yang ditunjukkan dalam resep

Catatan

>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
7 akan diabaikan jika variabel
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
..     urllib.request.urlopen(req)
.. except urllib.error.HTTPError as e:
..     print(e.code)
..     print(e.read())  
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
8 diatur;

Soket dan Lapisan

Dukungan Python untuk mengambil sumber daya dari web berlapis. urllib menggunakan perpustakaan, yang pada gilirannya menggunakan perpustakaan soket

Pada Python 2. 3 Anda dapat menentukan berapa lama soket harus menunggu respons sebelum waktunya habis. Ini dapat berguna dalam aplikasi yang harus mengambil halaman web. Secara default modul soket tidak memiliki batas waktu dan dapat hang. Saat ini, batas waktu soket tidak diekspos di http. klien atau urllib. tingkat permintaan. Namun, Anda dapat mengatur batas waktu default secara global untuk semua soket yang digunakan

import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
5


Catatan kaki

Dokumen ini telah ditinjau dan direvisi oleh John Lee

Google misalnya

Sniffing browser adalah praktik yang sangat buruk untuk desain situs web - membuat situs menggunakan standar web jauh lebih masuk akal. Sayangnya banyak situs masih mengirimkan versi berbeda ke browser yang berbeda

Agen pengguna untuk MSIE 6 adalah 'Mozilla/4. 0 (kompatibel; MSIE 6. 0; . 1; . NET CLR 1. 1. 4322)’

Untuk detail header permintaan HTTP lainnya, lihat Referensi Cepat ke Header HTTP

Dalam kasus saya, saya harus menggunakan proxy untuk mengakses internet di tempat kerja. Jika Anda mencoba mengambil URL localhost melalui proxy ini, ia akan memblokirnya. IE diatur untuk menggunakan proxy, yang diambil oleh urllib. Untuk menguji skrip dengan server localhost, saya harus mencegah urllib menggunakan proxy

Bagaimana cara memeriksa kesalahan 404 dengan Python?

Lihat r. status_code atribut . jika r. kode_status == 404. # A 404 dikeluarkan.

Bagaimana cara saya memeriksa apakah URL dapat diakses dengan Python?

Pendekatan. .
Impor modul
Lewati Url ke dalam permintaan. kepala()
Jika respon. status_code == 200 lalu server aktif
jika respon. status_code == 404 lalu server down

Bagaimana cara memeriksa status URL dengan Python?

Ada banyak cara untuk memeriksa status situs web dengan Python melalui HTTP. Mungkin yang paling umum adalah membuka koneksi ke server menggunakan fungsi urlopen(), lalu memanggil fungsi getcode() pada HTTPSConnection terbuka . Anda dapat mempelajari lebih lanjut tentang fungsi pustaka standar ini di sini. urllib.

Bagaimana saya tahu jika URL dapat dijangkau?

Keberadaan URL dapat diperiksa dengan memeriksa kode status di header tanggapan . Kode status 200 adalah respons Standar untuk permintaan HTTP yang berhasil dan kode status 404 berarti URL tidak ada.