Python 네트워크 프로그래밍에서 urllib2 모듈 사용법 요약

WBOY
풀어 주다: 2016-08-04 08:55:49
원래의
1130명이 탐색했습니다.

1.가장 기본적인 애플리케이션

import urllib2

url = r'http://www.baidu.com'
html = urllib2.urlopen(url).read()

print html

로그인 후 복사

클라이언트와 서버는 요청과 응답을 통해 통신합니다. 클라이언트는 먼저 서버에 요청을 보낸 다음 서버에서 반환된 응답을 받습니다.

urllib2는 사용자가 요청을 보내기 전에 요청 객체를 구성한 다음 urllib2.urlopen 메서드를 통해 요청을 보낼 수 있도록 하는 요청 클래스를 제공합니다.

import urllib2

url = r'http://www.baidu.com'
req = urllib2.Request(url)
html = urllib2.urlopen(req).read()
print html

로그인 후 복사

위 예에서는

을 먼저 사용하세요.
req = urllib2.Request(url)
로그인 후 복사

요청 객체를 인스턴스화한 다음

을 사용하세요.
urllib2.urlopen(req)
로그인 후 복사

이 페이지를 엽니다.

요청 개체를 인스턴스화할 때 URL을 설정해야 하며 여러 기본 매개변수가 있다는 것을 확인했습니다.

2016712152259943.png (864×76)

데이터와 헤더도 베이스에서 흔히 사용됩니다. 탐색을 위해 로그인이 필요한 일부 웹사이트에서는 이 두 매개변수가 필요한 경우가 많습니다

import urllib 
import urllib2 
 
url = 'http://www.baidu.com/' 
values = {'name' : 'Michael Foord', 'location' : 'Northampton','language' : 'Python' } 
data = urllib.urlencode(values) 
req = urllib2.Request(url,data) 
response = urllib2.urlopen(req) 
the_page = response.read()

print the_page

로그인 후 복사

이 예는 Baidu에 일부 데이터를 보내는 것입니다. Baidu를 방문할 때 정보를 게시할 필요가 없기 때문에 정상적인 오류 페이지가 반환되지만 게시하면 오류가 발생합니다.

Baidu는 해당 웹페이지를 찾을 수 없으면 오류를 보고합니다.

물론 POST 데이터이므로 GET 메소드에서도 사용할 수 있습니다. 위 코드를 약간 수정하세요

Baidu는 http://www.baidu.com/s?wd=XXX를 통해 쿼리하므로 사전 {'wd':'xxx'}를 urlencode해야 합니다

#coding:utf-8
import urllib 
import urllib2 
 
url = 'http://www.baidu.com/s' 
values = {'wd':'杨彦星'} 
data = urllib.urlencode(values)
print data 
url2 = url+'?'+data
response = urllib2.urlopen(url2) 
the_page = response.read()

print the_page

로그인 후 복사

다음은 Renren에 로그인한 후 홈페이지 콘텐츠를 표시하여 쿠키 사용을 자세히 설명하는 예입니다. 다음은 문서에 제시된 예를 원하는 기능을 달성하도록 변형해 보겠습니다. 🎜>

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
 
#coding:utf-8
import urllib2,urllib
import cookielib

url = r'http://www.renren.com/ajaxLogin'

#创建一个cj的cookie的容器
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#将要POST出去的数据进行编码
data = urllib.urlencode({"email":email,"password":pass})
r = opener.open(url,data)
print cj

로그인 후 복사

cj가 보이면 로그인 페이지에 접속했다는 의미입니다. http://www.renren.com/home에서 확인하실 수 있습니다.

위 코드에는 설명할 점이 2가지 있는데, 이해하는데 시간이 오래 걸렸습니다

r = opener.open(url,data) 
로그인 후 복사

이 문장에서 utllib2와 urlopen을 사용하는 대신 opener 객체를 사용해야 하는 이유는 무엇입니까? 예제에서는 이렇게 작성했을 뿐만 아니라 변환을 통해 urllib2.urlopen도 사용할 수 있습니다. 사실 opener는 urllib2이기 때문입니다. .bulid_opener에 의해 생성되었지만 빌드된 후에는 이를 설치하여 사용하지 않았으며 원하는 경우 해당 속성과 메소드도 없었습니다. urllib2에는 오프너의 속성과 메소드도 있으므로 먼저 urllib2를 사용하여 오프너를 "설치"할 수 있습니다.

#coding:utf-8
import urllib2,urllib
import cookielib

url = r'http://www.renren.com/ajaxLogin'

#创建一个cj的cookie的容器
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
#将要POST出去的数据进行编码
data = urllib.urlencode({"email":email,"password":pass})
#r = opener.open(url,data)如果没有上面的urllib2.install_opener方法,就必须这样写了
r = urllib2.urlopen(url,data)
html = urllib2.urlopen('http://www.renren.com/home').read()

print html

로그인 후 복사

마찬가지로 urllib2에도 프록시 관련 핸들이 있습니다. 기본 아이디어는 이와 유사합니다.

2. 예외 처리

urlopen()이 응답을 처리할 수 없으면 URLError 예외가 발생합니다. HTTPError 예외는 URLError의 하위 클래스이며 HTTP 유형 URL에 액세스할 때만 발생합니다.

1. URLError 예외

일반적으로 URLError의 원인은 네트워크 연결이 없거나(대상 서버에 대한 경로 없음), 액세스한 대상 서버가 존재하지 않는 것입니다. 이 경우 예외 객체에는 이유 속성((오류 코드, 오류 이유)의 튜플)이 있습니다.

#! /usr/bin/env python
#coding=utf-8
import urllib2

url="http://www.baidu.com/"
try:
 response=urllib2.urlopen(url)
except urllib2.URLError,e:
 print e.reason

로그인 후 복사

2. HTTP 오류
서버에서 반환된 모든 HTTP 응답에는 상태 코드가 있습니다. 그 중 일부 상태 코드는 서버가 해당 요청을 완료할 수 없음을 나타냅니다. 기본 핸들러는 이러한 상태 코드 중 일부를 처리할 수 있습니다(반환된 응답이 리디렉션인 경우 urllib2는 자동으로 리디렉션된 페이지에서 정보를 얻습니다). urllib2 모듈이 처리할 수 없는 일부 상태 코드가 있으므로 urlopen 함수는 404/401이 일반적인 HTTPError 예외를 발생시킵니다.
HTTPError 예외 인스턴스에는 서버에서 반환된 오류 상태 코드를 나타내는 정수 유형의 코드 속성이 있습니다.
urllib2 모듈의 기본 핸들러는 리디렉션을 처리할 수 있으며(상태 코드는 300 범위에 있음) 100-299 범위의 상태 코드는 성공을 나타냅니다. 따라서 HTTPError 예외가 발생할 수 있는 상태 코드 범위는 400-599입니다.
오류가 발생하면 서버는 HTTP 오류 코드와 오류 페이지를 반환합니다. HTTPError 인스턴스를 반환 페이지로 사용할 수 있습니다. 즉, HTTPError 인스턴스에는 code 속성뿐만 아니라 read, geturl 및 info와 같은 메서드도 있다는 의미입니다.

#! /usr/bin/env python
#coding=utf-8
import urllib2

url="http://cs.scu.edu.cn/~duanlei"
try:
 response=urllib2.urlopen(url)
except urllib2.HTTPError,e:
 print e.code
 print e.read()

로그인 후 복사

3. 요약
코드에서 URLError와 HTTPError를 처리하려는 경우 두 가지 방법이 있는데 코드는 다음과 같습니다.

#! /usr/bin/env python
#coding=utf-8
import urllib2
url="xxxxxx" #需要访问的URL
try:
 response=urllib2.urlopen(url)
except urllib2.HTTPError,e: #HTTPError必须排在URLError的前面
 print "The server couldn't fulfill the request"
 print "Error code:",e.code
 print "Return content:",e.read()
except urllib2.URLError,e:
 print "Failed to reach the server"
 print "The reason:",e.reason
else:
 #something you should do
 pass #其他异常的处理
#! /usr/bin/env python
#coding=utf-8
import urllib2
url="http://xxx" #需要访问的URL
try:
 response=urllib2.urlopen(url)
except urllib2.URLError,e:
 if hasattr(e,"reason"):
 print "Failed to reach the server"
 print "The reason:",e.reason
 elif hasattr(e,"code"):
 print "The server couldn't fulfill the request"
 print "Error code:",e.code
 print "Return content:",e.read()
else:
 pass #其他异常的处理
로그인 후 복사
비교하면 두 번째 예외 처리 방법이 더 좋습니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!