다음 콘텐츠를 시작하기 전에 먼저 urllib2의 두 가지 메소드인 info 및 geturl을 설명하겠습니다.
urlopen이 반환한 응답 개체 response(또는 HTTPError 인스턴스)에는 매우 유용한 두 가지 메소드 info() 및 geturl( )
1.geturl():
이것은 얻은 실제 URL을 반환합니다. urlopen(또는 오프너 개체가 사용하는 것)이 리디렉션이 있을 수 있기 때문에 매우 유용합니다. 획득한 URL은 요청 URL과 다를 수 있습니다.
Renren의 하이퍼링크를 예로 들어 보겠습니다.
원래 URL과 리디렉션된 링크를 비교하기 위해 urllib2_test10.py를 빌드합니다.
from urllib2 import Request, urlopen, URLError, HTTPError old_url = 'http://rrurl.cn/b1UZuP' req = Request(old_url) response = urlopen(req) print 'Old url :' + old_url print 'Real url :' + response.geturl()
실행 후 실제 링크가 가리키는 URL을 볼 수 있습니다:
2.info():
이것은 다음의 사전을 반환합니다. 객체 객체, 이 사전은 획득된 페이지 상황을 설명합니다. 일반적으로 서버에서 보낸 특정 헤더입니다. 현재 httplib.HTTPMessage의 인스턴스입니다.
기본 헤더에는 "콘텐츠 길이", "콘텐츠 유형" 및 기타 콘텐츠가 포함됩니다.
info 적용을 테스트하기 위해 urllib2_test11.py를 빌드합니다.
from urllib2 import Request, urlopen, URLError, HTTPError old_url = 'http://www.baidu.com' req = Request(old_url) response = urlopen(req) print 'Info():' print response.info()
작업 결과는 다음과 같습니다. 페이지 관련 정보 :
urllib2의 두 가지 중요한 개념인 Openers와 Handlers에 대해 이야기해 보겠습니다.
1.Openers:
URL을 얻을 때 오프너(urllib2.OpenerDirector의 인스턴스)를 사용합니다.
일반적으로 우리는 urlopen을 통해 기본 오프너를 사용합니다.
하지만 자신만의 오프너를 만들 수 있습니다.
2.핸들:
오프너는 프로세서 핸들러를 사용하며 모든 "무거운" 작업은 핸들러에 의해 처리됩니다.
각 핸들러는 특정 프로토콜을 통해 URL을 여는 방법이나 URL 열기의 다양한 측면을 처리하는 방법을 알고 있습니다.
HTTP 리디렉션 또는 HTTP 쿠키 등.
특정 핸들러로 URL을 얻으려면 오프너를 생성해야 합니다. 예를 들어 쿠키를 처리하는 오프너를 얻거나 쿠키를 처리하지 않는 오프너를 얻습니다. 리디렉션.
오프너를 생성하려면 OpenerDirector
를 인스턴스화한 다음 .add_handler(some_handler_instance)를 호출하세요.
마찬가지로, 오프너 객체를 생성하는 데 더 편리한 함수인 build_opener를 사용할 수 있습니다. 함수 호출은 하나만 필요합니다.
build_opener는 기본적으로 여러 프로세서를 추가하지만 기본 프로세서를 추가하거나 업데이트하는 빠른 방법을 제공합니다.
프록시, 유효성 검사 및 기타 일반적이지만 다소 특별한 경우를 처리할 수 있는 다른 핸들러입니다.
install_opener는 (전역) 기본 오프너를 만드는 데 사용됩니다. 즉, urlopen을 호출하면 설치된 오프너가 사용됩니다.
Opener 객체에는 open 메소드가 있습니다.
이 방법은 urlopen 함수와 같이 URL을 얻는 데 직접 사용할 수 있습니다. 편의상 일반적으로 install_opener를 호출할 필요는 없습니다.
위의 두 가지 내용을 모두 마친 후, 위에서 언급한 Opener와 Handler가 사용될 기본 인증 내용을 살펴보겠습니다.
기본 인증
핸들러 생성 및 설치를 보여주기 위해 HTTPBasicAuthHandler를 사용하겠습니다.
기본 인증이 필요한 경우 서버에서는 헤더(401 오류 코드)를 전송하여 인증을 요청합니다. 이는 체계와 '영역'을 지정하며 다음과 같습니다. Www-authenticate: SCHEME realm="REALM".
예
Www-authenticate: Basic realm="cPanel Users"
클라이언트는 새 요청을 사용해야 하며 요청 헤더에 올바른 이름과 비밀번호를 포함해야 합니다.
이것은 "기본 인증"입니다. 이 프로세스를 단순화하기 위해 HTTPBasicAuthHandler의 인스턴스를 생성하고 오프너가 이 핸들러를 사용하도록 할 수 있습니다.
HTTPBasicAuthHandler는 비밀번호 관리 개체를 사용하여 URL과 영역을 처리하고 사용자 이름과 비밀번호를 매핑합니다.
서버에서 보낸 헤더에 있는 영역이 무엇인지 알고 있다면 HTTPPasswordMgr을 사용할 수 있습니다.
보통 사람들은 영역이 무엇인지 관심이 없습니다. 이 경우 편리한 HTTPPasswordMgrWithDefaultRealm을 사용할 수 있습니다.
이렇게 하면 URL의 기본 사용자 이름과 비밀번호가 지정됩니다.
특정 렐름에 대해 다른 조합을 제공할 경우 제공됩니다.
add_password에 제공된 영역 매개변수에 None을 지정하여 이러한 상황을 나타냅니다.
가장 높은 수준의 URL이 가장 먼저 확인이 필요한 URL입니다. .add_password()에 전달하는 더 깊은 URL도 똑같이 적합합니다.
말도 안 되는 말을 너무 많이 했는데 위에서 말한 내용을 예시를 통해 보여드리겠습니다.
정보 애플리케이션을 테스트하기 위해 urllib2_test12.py를 빌드합니다.
# -*- coding: utf-8 -*- import urllib2 # 创建一个密码管理者 password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() # 添加用户名和密码 top_level_url = "http://example.com/foo/" # 如果知道 realm, 我们可以使用他代替 ``None``. # password_mgr.add_password(None, top_level_url, username, password) password_mgr.add_password(None, top_level_url,'why', '1223') # 创建了一个新的handler handler = urllib2.HTTPBasicAuthHandler(password_mgr) # 创建 "opener" (OpenerDirector 实例) opener = urllib2.build_opener(handler) a_url = 'http://www.baidu.com/' # 使用 opener 获取一个URL opener.open(a_url) # 安装 opener. # 现在所有调用 urllib2.urlopen 将用我们的 opener. urllib2.install_opener(opener)
참고: 위의 예에서는 HHTTPasicAuthHandler만 build_opener에 제공합니다.
기본 오프너에는 ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor와 같은 일반 핸들러가 있습니다.
코드의 top_level_url은 실제로 완전한 URL("http:", 호스트 이름 및 선택적 포트 번호 포함)일 수 있습니다.
예: http://example.com/.
은 "권한"(예: 호스트 이름 및 선택적으로 포트 번호)일 수도 있습니다.
예: "example.com" 또는 "example.com:8080".
후자는 포트 번호를 포함합니다.
위는 [Python] Web Crawler(4)의 내용입니다: Opener와 Handler의 소개 및 예제 적용에 대한 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고하시기 바랍니다. !