>  기사  >  백엔드 개발  >  [Python] 웹 크롤러(2): urllib2를 사용하여 지정된 URL을 통해 웹 콘텐츠를 크롤링합니다.

[Python] 웹 크롤러(2): urllib2를 사용하여 지정된 URL을 통해 웹 콘텐츠를 크롤링합니다.

黄舟
黄舟원래의
2017-01-21 13:47:431629검색

버전 번호: Python2.7.5, Python3에는 주요 변경 사항이 있습니다. 다른 튜토리얼을 찾아보세요.

소위 웹 페이지 크롤링은 URL 주소에 지정된 네트워크 리소스를 네트워크 스트림에서 읽어 로컬에 저장하는 것입니다.
프로그램을 사용하여 IE 브라우저의 기능을 시뮬레이션하는 것과 유사하게 URL을 HTTP 요청의 내용으로 서버에 보낸 다음 서버의 응답 리소스를 읽습니다.


Python에서는 urllib2 구성 요소를 사용하여 웹 페이지를 크롤링합니다.
urllib2는 URL(Uniform Resource Locator)을 얻는 Python의 구성 요소입니다.

urlopen 함수 형태로 매우 간단한 인터페이스를 제공합니다.

가장 간단한 urllib2 애플리케이션 코드에는 4줄만 있으면 됩니다.

urllib2의 역할을 경험하기 위해 urllib2_test01.py라는 새 파일을 만들어 보겠습니다.

import urllib2  
response = urllib2.urlopen('http://www.baidu.com/')  
html = response.read()  
print html

F5를 눌러 작업 결과를 확인하세요.

[Python] 웹 크롤러(2): urllib2를 사용하여 지정된 URL을 통해 웹 콘텐츠를 크롤링합니다.


Baidu 홈페이지를 열고 마우스 오른쪽 버튼을 클릭한 후 소스 코드 보기(Firefox 또는 Google Chrome)를 선택하면 콘텐츠가 다음과 같은 것을 확인할 수 있습니다. 정확히 똑같습니다.

즉, 위 4줄의 코드는 우리가 바이두를 방문할 때 브라우저가 수신한 모든 코드를 출력하는 것입니다.

urllib2의 가장 간단한 예입니다.


URL은 "http:" 외에도 "ftp:", "file:" 등으로 대체될 수 있습니다.

HTTP는 요청 및 응답 메커니즘을 기반으로 합니다.

클라이언트가 요청하고 서버가 응답을 제공합니다.


urllib2는 요청 객체를 사용하여 HTTP 요청을 매핑합니다.

가장 간단한 사용 형태에서는 요청하려는 주소로 요청 개체를 생성합니다.

urlopen을 호출하고 요청 개체를 전달하면 관련 요청 응답 개체가 반환됩니다.

이 응답 객체는 파일 객체와 같아서 Response에서 .read()를 호출할 수 있습니다.

urllib2는 동일한 인터페이스를 사용하여 모든 URL 헤더를 처리합니다. 예를 들어 아래와 같이 ftp 요청을 생성할 수 있습니다.

import urllib2    
req = urllib2.Request('http://www.baidu.com')    
response = urllib2.urlopen(req)    
the_page = response.read()    
print the_page

HTTP 요청을 할 때 두 가지 추가 작업을 수행할 수 있습니다.

1. 데이터 양식 데이터 보내기

이 내용은 웹 작업을 해본 사람이라면 누구나 익숙할 것이라고 믿습니다.

일부 데이터를 URL로 보내려고 합니다(일반적으로 URL은 CGI [Common Gateway Interface] 스크립트 또는 기타 웹 응용 프로그램에 연결되어 있습니다).

HTTP에서는 잘 알려진 POST 요청을 사용하여 전송되는 경우가 많습니다.

이 작업은 일반적으로 HTML 양식을 제출할 때 브라우저에서 수행됩니다.

모든 POST가 양식에서 생성되는 것은 아닙니다. POST를 사용하여 임의의 데이터를 자신의 프로그램에 제출할 수 있습니다.

일반 HTML 형식의 경우 데이터를 표준 형식으로 인코딩해야 합니다. 그런 다음 이를 데이터 매개변수로 Request 객체에 전달합니다.

인코딩은 urllib2 대신 urllib 함수를 사용하여 작동합니다.

urllib2_test03.py라는 새 파일을 만들어서 살펴보겠습니다.

req = urllib2.Request('ftp://example.com/')


데이터 매개변수가 전송되지 않으면 urllib2는 다음을 사용합니다. GET 요청 방식.

GET 요청과 POST 요청의 차이점은 POST 요청에는 일반적으로 "부작용"이 있다는 것입니다.

이 요청은 어떤 방식으로든 시스템 상태를 변경합니다(예: 쓰레기 더미를 시스템에 제출). 문).

Get 요청 URL 자체에 인코딩하여 데이터를 전송할 수도 있습니다.

import urllib    
import urllib2    
  
url = 'http://www.someserver.com/register.cgi'    
    
values = {'name' : 'WHY',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
data = urllib.urlencode(values) # 编码工作  
req = urllib2.Request(url, data)  # 发送请求同时传data表单  
response = urllib2.urlopen(req)  #接受反馈的信息  
the_page = response.read()  #读取反馈的内容

이렇게 해서 Data 데이터의 Get 전송이 실현됩니다.


2. 헤더를 http 요청으로 설정

일부 사이트는 프로그램에서 액세스하는 것을 좋아하지 않습니다. 사람의 액세스) 또는 다양한 버전의 콘텐츠를 다양한 브라우저로 보낼 수 있습니다.

기본 urllib2는 자신을 "Python-urllib/x.y"로 식별합니다(x와 y는 Python-urllib/2.7과 같은 Python 주 버전 번호와 부 버전 번호입니다).

이 ID는 다음과 같습니다. 사이트를 혼란스럽게 만들거나 단순히 작동하지 않게 만드세요.

브라우저는 User-Agent 헤더를 통해 자신의 신원을 확인합니다. 요청 객체를 생성할 때 헤더 데이터가 포함된 사전을 제공할 수 있습니다.


다음 예에서는 위와 동일한 콘텐츠를 전송하지만 Internet Explorer로 시뮬레이션합니다.

(모두에게 상기시켜 주셔서 감사합니다. 이 데모는 더 이상 사용할 수 없지만 원칙은 여전히 ​​동일합니다.)

import urllib2    
import urllib  
  
data = {}  
  
data['name'] = 'WHY'    
data['location'] = 'SDU'    
data['language'] = 'Python'  
  
url_values = urllib.urlencode(data)    
print url_values  
  
name=Somebody+Here&language=Python&location=Northampton    
url = 'http://www.example.com/example.cgi'    
full_url = url + '?' + url_values  
  
data = urllib2.open(full_url)

위는 [Python] 웹 크롤러입니다. (2): urllib2를 사용하여 지정된 URL을 통해 웹 콘텐츠를 크롤링합니다. 더 많은 관련 콘텐츠는 PHP 중국어 웹사이트(www.php.cn)를 참고하세요. !

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.