python 2.7 파충류 학습 노트 (1) - Urllib 라 이브 러 리 사용

웹 페이지 열기:
import urllib2
 
response = urllib2.urlopen("http://www.baidu.com")
print response.read()

첫 번 째 줄: urllib 2 라 이브 러 리 에 있 는 urlopen 방법 을 호출 하여 하나의 url 로 전 달 했 습 니 다. 이 방법 은 보통 세 개의 인 자 를 받 습 니 다. 다음 과 같 습 니 다.
urlopen(url, data, timeout)

첫 번 째 는 설명 할 필요 가 없습니다. data 는 url 에 접근 할 때 전송 할 데이터 입 니 다. timeout 은 시간 초과 설정 이 고 두 개 는 선택 입 니 다. data 는 기본적으로 None 입 니 다.
두 번 째 줄: 되 돌아 오 는 response 대상 에 게 read 방법 이 있 습 니 다. 가 져 온 웹 페이지 의 내용 을 되 돌려 줄 수 있 습 니 다.
구조 요청:
import urllib2
 
request = urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()

위의 효과 와 같 지만, 이렇게 쓰 는 것 은 논리 규범 에 더욱 부합된다.
post 와 get 데이터 전송:
post 방식:
import urllib
import urllib2
 
values = {"username":"[email protected]","password":"XXXX"}
data = urllib.urlencode(values) 
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()

여기 서 urllib 라 이브 러 리 를 도입 하여 CSDN 에 로그 인 하 는 것 을 모 의 했 습 니 다. 물론 올 라 갈 수 없습니다. 일부 매개 변 수 는 아직 설정 되 지 않 았 기 때문에 이것 은 원리 일 뿐 입 니 다.
get 방식:
import urllib
import urllib2
 
values={}
values['username'] = "[email protected]"
values['password']="XXXX"
data = urllib.urlencode(values) 
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()

헤더 설정:
import urllib  
import urllib2  

url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
values = {'username' : 'cqc',  'password' : 'XXXX' }  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)  
request = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(request)  
page = response.read() 
이렇게 Request 를 구축 할 때 headers 요청 을 들 어 오 면 서버 는 브 라 우 저가 보 낸 요청 을 식별 하고 응답 합 니 다.
또한, 우 리 는 '반 도 난 체인' 에 대처 하 는 방식 도 있 습 니 다. 도 난 방지 체인 에 대처 하면 서버 는 headers 중의 referer 가 자신 인지 아 닌 지 를 식별 할 수 있 습 니 다. 그렇지 않 으 면 어떤 서버 가 응답 하지 않 기 때문에 우 리 는 headers 에 referer 를 추가 할 수 있 습 니 다. 다음 과 같 습 니 다.
headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  ,
                        'Referer':'http://www.zhihu.com/articles' }  

또한 headers 의 일부 속성 은 다음 과 같이 주의해 야 합 니 다.
User - agent: 일부 서버 나 Proxy 는 이 값 을 통 해 브 라 우 저가 보 낸 요청 인지 여 부 를 판단 합 니 다. Content - Type: REST 인 터 페 이 스 를 사용 할 때 서버 에서 이 값 을 검사 하여 HTTP Body 의 내용 을 어떻게 해석 해 야 하 는 지 확인 합 니 다.application / xml: XML RPC, 예 를 들 어 RESTful / SOAP 호출 시 application / json 사용: JSON RPC 호출 시 application / x - www - form - urlencoded 사용: 브 라 우 저가 웹 폼 을 제출 할 때 서버 에서 제공 하 는 RESTful 또는 SOAP 서 비 스 를 사용 할 때 Content - type 설정 오류 로 인해 서버 가 서 비 스 를 거부 할 수 있 습 니 다.
다른 필요 한 것 은 브 라 우 저의 headers 내용 을 검토 하고 구축 할 때 같은 데 이 터 를 기록 하면 됩 니 다.
Proxy (프 록 시) 설정: urllib 2 는 기본적으로 환경 변 수 를 http 사용 합 니 다.proxy 에서 HTTP Proxy 를 설정 합 니 다.만약 한 사이트 가 특정한 시간 에 특정한 IP 의 방문 횟수 를 감지 하고 방문 횟수 가 너무 많 으 면 방문 을 금지 할 것 입 니 다.그래서 프 록 시 서버 를 설정 해서 작업 을 도와 주 고 일정 시간 마다 프 록 시 를 바 꿀 수 있 습 니 다.다음 코드 는 에이전트 의 설정 용법 을 설명 합 니 다.
import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
    opener = urllib2.build_opener(proxy_handler)
else:
    opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)

Timeout 설정: 얼마나 오래 기다 리 는 지 설정 할 수 있 습 니 다. 일부 사이트 의 실제 응답 이 너무 느 려 서 발생 하 는 영향 을 해결 하기 위해 서 입 니 다.예 를 들 어 다음 코드 는 두 번 째 매개 변수 data 가 비어 있 으 면 timeout 이 얼마 인지 지정 하고 형 삼 을 써 야 합 니 다. data 가 들 어 왔 다 면 설명 할 필요 가 없습니다.
import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)
import urllib2
response = urllib2.urlopen('http://www.baidu.com',data, 10)

URLError 이상 처리:
URLError 이상 캡 처:
import urllib2

requset = urllib2.Request('http://www.xxxxx.com')
try:
    urllib2.urlopen(requset)
except urllib2.URLError, e:
    print e.reason
존재 하지 않 는 사이트 주 소 를 방문 하여 결 과 를 되 돌려 줍 니 다.
[Errno 11004] getaddrinfo failed

HTTPError:
HTTP Error 는 URLError 의 하위 클래스 입 니 다. urlopen 방법 으로 요청 을 할 때 서버 에 응답 대상 response 에 대응 합 니 다. 그 중에서 숫자 '상태 코드' 를 포함 합 니 다.예 를 들 어 response 가 '방향 바 꾸 기' 라면 다른 주소 로 문 서 를 가 져 와 야 합 니 다. urllib 2 는 이 를 처리 합 니 다.
다른 처리 할 수 없 는 urlopen 은 HTTP 오류 가 발생 합 니 다. 해당 상태 에 대응 합 니까? HTTP 상태 코드 는 HTTP 프로 토 콜 이 되 돌아 오 는 응답 상 태 를 표시 합 니 다.다음은 상태 코드 를 다음 과 같이 요약 합 니 다.
100: 계속 클 라 이언 트 는 계속 요청 을 보 내야 합 니 다.클 라 이언 트 는 요청 의 나머지 부분 을 계속 보 내 거나 요청 이 완료 되면 이 응답 을 무시 해 야 합 니 다.
101: 변환 프로 토 콜 이 응답 마지막 빈 줄 을 보 내 면 서버 는 Upgrade 메시지 헤더 에서 정의 하 는 프로 토 콜 로 전 환 됩 니 다.새로운 협 의 를 전환 하 는 것 이 더 좋 을 때 만 비슷 한 조 치 를 취해 야 한다.
102: 계속 처리  WebDAV (RFC 2518) 에서 확 장 된 상태 코드 는 대표 처리 가 계속 실 행 될 것 이다.
200: 요청 성공     처리 방식: 응답 을 받 은 내용 을 처리 합 니 다.
201: 요청 이 완료 되 었 습 니 다. 결 과 는 새 자원 을 만 들 었 습 니 다.새로 생 성 된 자원 의 URI 는 응답 하 는 실체 에서 얻 을 수 있 습 니 다.   처리 방법: 파충류 에 서 는 만 나 지 않 는 다
202: 요청 은 수락 되 었 으 나 처리 가 완료 되 지 않 았 습 니 다.   처리 방법: 대기 차단
204: 서버 측 에서 요청 을 실 현 했 지만 새로운 정 보 를 되 돌려 주지 않 았 습 니 다.고객 이 사용자 에이전트 라면 문서 보 기 를 업데이트 할 필요 가 없습니다.   처리 방법: 버 림
300: 이 상태 코드 는 HTTP / 1.0 프로그램 에서 직접 사용 되 지 않 고 3XX 형식 으로 응답 하 는 기본 설명 입 니 다.요청 한 자원 이 여러 개 있 습 니 다.    처리 방식: 프로그램 에서 처리 할 수 있 으 면 추가 처 리 를 하고 프로그램 에서 처리 할 수 없 으 면 301 을 버 립 니 다. 요청 한 자원 은 영구적 인 URL 을 할당 합 니 다. 그러면 나중에 이 URL 을 통 해 이 자원 을 방문 할 수 있 습 니 다.    처리 방법: 분 배 된 URL 로 재 설정
302: 요청 한 자원 을 다른 URL 에 임시로 저장 합 니 다.    처리 방법: 임시 URL 로 재 설정
304: 요청 한 자원 이 업데이트 되 지 않 았 습 니 다.    처리 방법: 버 림
400: 불법 요청    처리 방법: 버 림
401: 인증 되 지 않 음    처리 방법: 버 림
403: 금지    처리 방법: 버 림
404: 찾 을 수 없습니다    처리 방법: 버 림
500: 서버 내부 오류 서버 가 예상 치 못 한 상황 을 만 나 요청 에 대한 처 리 를 할 수 없 게 되 었 습 니 다.일반적으로 이 문 제 는 서버 측의 소스 코드 에 오류 가 발생 할 때 발생 한다.
501: 서버 인식 불가 서버 는 현재 요청 에 필요 한 기능 을 지원 하지 않 습 니 다.서버 가 요청 한 방법 을 식별 할 수 없고 자원 에 대한 요청 을 지원 할 수 없습니다.
502: 오류 게 이 트 웨 이 게 이 트 웨 이 나 프 록 시 로 서 요청 을 시도 할 때 상위 서버 에서 잘못된 응답 을 받 습 니 다.
503: 서비스 오류  임시 서버 유지보수 나 과부하 로 서버 에서 요청 을 처리 할 수 없습니다.이 상황 은 임시 적 이 며 일정 시간 후에 회 복 될 것 이다.
HTTPError 인 스 턴 스 가 발생 하면 code 속성 이 있 습 니 다. 이것 이 바로 서버 에서 보 낸 오류 번호 입 니 다.urllib 2 는 방향 을 바 꿀 수 있 습 니 다. 즉, 3 으로 시작 하 는 번 호 는 처리 할 수 있 고 100 - 299 범위 의 번 호 는 성공 적 으로 표시 되 기 때문에 400 - 599 의 오류 번호 만 볼 수 있 습 니 다.
다음은 예 를 들 어 캡 처 한 이상 은 HTTPError 입 니 다. code 속성 을 가지 고 있 습 니 다. 바로 오류 코드 입 니 다. 또한 reason 속성 을 인쇄 했 습 니 다. 이것 은 부모 클래스 URLError 의 속성 입 니 다.
import urllib2

req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.code
    print e.reason
운행 결과:
403
Forbidden

오류 코드 는 403 입 니 다. 오류 원인 은 Forbidden 입 니 다. 서버 접근 이 금지 되 어 있 음 을 설명 합 니 다.
HTTPError 의 부모 클래스 는 URLError 입 니 다. 프로 그래 밍 경험 에 따 르 면 부모 클래스 의 이상 은 하위 클래스 이상 뒤에 기록 해 야 합 니 다. 하위 클래스 가 캡 처 되 지 않 으 면 부모 클래스 의 이상 을 캡 처 할 수 있 기 때문에 상기 코드 는 이렇게 고 칠 수 있 습 니 다.
import urllib2

req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.code
except urllib2.URLError, e:
    print e.reason
else:
    print "OK"

HTTPError 가 포착 되면 출력 code 는 URLError 이상 을 처리 하지 않 습 니 다.HTTP 오류 가 발생 하지 않 으 면 URLError 이상, 출력 오류 원인 을 캡 처 합 니 다.
또한 hasattr 속성 을 추가 하여 속성 을 미리 판단 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
import urllib2

req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.URLError, e:
    if hasattr(e,"code"):
        print e.code
    if hasattr(e,"reason"):
        print e.reason
else:
    print "OK"

우선 이상 한 속성 을 판단 하여 속성 출력 오류 가 발생 하지 않도록 한다.
쿠키 사용:
opener:
URL 을 가 져 오 면 opener (urllib 2. Opener Director 의 인 스 턴 스) 를 사용 합 니 다.앞에서 우 리 는 모두 기본 opener, 즉 urlopen 을 사용 합 니 다.이것 은 특수 한 opener 로 opener 의 특수 한 사례 로 이해 할 수 있 습 니 다. 들 어 오 는 매개 변 수 는 url, data, timeout 에 불과 합 니 다.
만약 에 우리 가 쿠키 를 사용 해 야 한다 면 이 opener 만 사용 하면 목적 을 달성 할 수 없 기 때문에 우 리 는 더욱 일반적인 opener 를 만들어 쿠키 에 대한 설정 을 실현 해 야 합 니 다.
cookielib:
cookielib 모듈 의 주요 역할 은 쿠키 를 저장 할 수 있 는 대상 을 제공 하여 urllib 2 모듈 과 결합 하여 인터넷 자원 에 접근 할 수 있 도록 하 는 것 입 니 다.Cookielib 모듈 은 매우 강력 합 니 다. 저 희 는 이 모듈 의 CookieJar 클래스 의 대상 을 이용 하여 쿠키 를 캡 처 하고 후속 연결 요청 시 다시 보 낼 수 있 습 니 다. 예 를 들 어 아 날로 그 로그 인 기능 을 실현 할 수 있 습 니 다.이 모듈 의 주요 대상 은 CookieJar, FileCookieJar, Mozilla CookieJar, LWPCookieJar 이다.
그들의 관계: CookieJar - - 파생 - > FileCookieJar —-파생 - – > Mozilla CookieJar 와 LWPCookieJar
1. 변수 에 쿠키 저장 가 져 오기:
import urllib2
import cookielib
#    CookieJar       cookie
cookie = cookielib.CookieJar()
#  urllib2  HTTPCookieProcessor     cookie   
handler=urllib2.HTTPCookieProcessor(cookie)
#  handler   opener
opener = urllib2.build_opener(handler)
#   open   urllib2 urlopen  ,     request
response = opener.open('http://www.baidu.com')
for item in cookie:
    print 'Name = '+item.name
    print 'Value = '+item.value

저 희 는 상기 방법 으로 쿠키 를 변수 에 저장 한 다음 에 쿠키 의 값 을 인쇄 했 습 니 다. 실행 결 과 는 다음 과 같 습 니 다.
Name = BAIDUID
Value = B07B663B645729F11F659C02AAE65B4C:FG=1
Name = BAIDUPSID
Value = B07B663B645729F11F659C02AAE65B4C
Name = H_PS_PSSID
Value = 12527_11076_1438_10633
Name = BDSVRTM
Value = 0
Name = BD_HOME
Value = 0

2. 변수 에 쿠키 저장: FileCookieJar 라 는 대상 을 사용 해 야 합 니 다. 여기 서 저 희 는 하위 클래스 Mozilla CookieJar 를 사용 하여 쿠키 저장 을 실현 합 니 다.
import cookielib
import urllib2

#    cookie   ,      cookie.txt
filename = 'cookie.txt'
#    MozillaCookieJar       cookie,      
cookie = cookielib.MozillaCookieJar(filename)
#  urllib2  HTTPCookieProcessor     cookie   
handler = urllib2.HTTPCookieProcessor(cookie)
#  handler   opener
opener = urllib2.build_opener(handler)
#      ,   urllib2 urlopen
response = opener.open("http://www.baidu.com")
#  cookie   
cookie.save(ignore_discard=True, ignore_expires=True)

ignore_discard 는 cookies 가 버 려 져 도 저장 한 다 는 뜻 입 니 다. ignoreexpires 는 이 파일 에 cookies 가 존재 한다 면 원본 파일 을 덮어 쓰 고 이 두 개 를 모두 True 로 설정 합 니 다.
3. 파일 에서 쿠키 를 가 져 오고 접근:
import cookielib
import urllib2

#  MozillaCookieJar    
cookie = cookielib.MozillaCookieJar()
#      cookie     
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#     request
req = urllib2.Request("http://www.baidu.com")
#  urllib2 build_opener      opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()

4. 쿠키 를 이용 하여 모 의 사이트 로그 인:
import urllib
import urllib2
import cookielib

filename = 'cookie.txt'
#    MozillaCookieJar       cookie,      
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({
			'stuid':'2012xxxxx',
			'pwd':'xxxxxx'
		})
#       URL
loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login'
#    ,  cookie     
result = opener.open(loginUrl,postdata)
#  cookie cookie.txt 
cookie.save(ignore_discard=True, ignore_expires=True)
#  cookie         ,          
gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'
#          
result = opener.open(gradeUrl)
print result.read()

상기 프로그램의 원 리 는 다음 과 같다.
쿠키 가 있 는 opener 를 만 들 고 로그 인 URL 에 접근 할 때 로그 인 한 쿠키 를 저장 한 다음 이 쿠키 를 이용 하여 다른 사이트 에 접근 합 니 다.

좋은 웹페이지 즐겨찾기