Python 크롤러: 일반적으로 사용되는 크롤러 기술 요약
크롤러도 개발 과정에서 많은 재사용 프로세스를 거치므로 나중에 몇 가지 사항을 절약하기 위해 여기에 요약해 보겠습니다.
1. 웹페이지 기본 크롤링
get 메소드
import urllib2 url "http://www.baidu.com" respons = urllib2.urlopen(url) print response.read()
게시물 방법
import urllib import urllib2 url = "http://abcde.com" form = {'name':'abc','password':'1234'} form_data = urllib.urlencode(form) request = urllib2.Request(url,form_data) response = urllib2.urlopen(request) print response.read()
2. 프록시 IP 사용
크롤러 개발 과정에서 IP가 차단되는 경우가 많습니다. 이 경우 프록시 IP를 사용해야 합니다.
urllib2 패키지에는 ProxyHandler 클래스가 있으며 이를 통해 다음 코드 조각과 같이 웹 페이지에 액세스하기 위한 프록시를 설정할 수 있습니다. 🎜>
import urllib2 proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'}) opener = urllib2.build_opener(proxy) urllib2.install_opener(opener) response = urllib2.urlopen('http://www.baidu.com') print response.read()
3. 쿠키 처리
쿠키는 일부 웹사이트에서 사용자의 로컬 터미널에 저장하는 데이터(보통 암호화됨)입니다. 사용자의 신원을 식별하고 세션을 추적하기 위해 Python은 쿠키를 처리하기 위한 cookielib 모듈을 제공합니다. cookielib 모듈의 주요 기능은 쿠키를 저장할 수 있는 객체를 제공하여 urllib2 모듈과 함께 액세스할 수 있도록 하는 것입니다. 인터넷 리소스 코드 조각:import urllib2, cookielib cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar()) opener = urllib2.build_opener(cookie_support) urllib2.install_opener(opener) content = urllib2.urlopen('http://XXXX').read()키는 CookieJar()로, HTTP 쿠키 값을 관리하고 생성된 쿠키를 저장하는 데 사용됩니다. HTTP 요청으로 쿠키 객체를 추가하고 나가는 HTTP 요청에 쿠키 개체를 추가합니다. 전체 쿠키는 메모리에 저장되며 CookieJar 인스턴스의 가비지 수집 후에는 쿠키가 손실됩니다. 모든 프로세스가 별도로 작동할 필요가 없습니다. 쿠키 수동 추가
코드 복사 코드는 다음과 같습니다.
cookie = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7 ; kmsign= 55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="request.add_header("Cookie", cookie)
4. 브라우저로 위장
크롤러 방지 방문이므로 크롤러에 대한 모든 요청이 거부됩니다. 따라서 urllib2를 사용하여 웹 사이트에 직접 액세스할 때 HTTP 오류 403: Forbidden이 자주 발생합니다일부 헤더에 특별한 주의를 기울이십시오. 서버는 이러한 헤더를 확인합니다1).User-Agent 일부 서버 또는 프록시는 이 값을 확인하여 브라우저에서 시작된 Request인지 확인합니다. 2).Content-Type REST 인터페이스를 사용할 때 서버는 이 값을 확인하여 HTTP 본문의 콘텐츠를 구문 분석해야 하는 방법을 결정합니다. .
import urllib2 headers = { 'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6' } request = urllib2.Request( url = 'http://my.oschina.net/jhao104/blog?catalog=3463517', headers = headers ) print urllib2.urlopen(request).read()5. 🎜>
페이지 구문 분석을 위한 가장 강력한 도구는 물론 정규 표현식입니다. 이는 웹사이트마다 다르므로 더 나은 두 가지 URL은 다음과 같습니다.
정규 표현식 온라인 테스트: http://tool.oschina.net/regex/
두 번째는 주로 사용되는 두 가지 라이브러리인 lxml과 BeautifulSoup을 사용하기 위해 두 가지를 소개하겠습니다. 더 나은 웹사이트. 🎜>이 두 라이브러리에 대한 평가는 둘 다 HTML/XML 처리 라이브러리라는 것입니다. Beautifulsoup은 순수하게 Python으로 구현되어 비효율적이지만 기능은 실용적입니다. 예를 들어 HTML 노드의 소스 코드는 다음을 통해 얻을 수 있습니다. 검색 결과 lxmlC 언어 인코딩은 매우 효율적이며 Xpath를 지원합니다
6. 인증 코드 처리일부 간단한 인증 코드의 경우 간단 식별이 수행될 수 있습니다. 간단한 인증번호 인식만 해봤습니다. 그러나 12306과 같은 일부 반인간 인증코드는 코딩 플랫폼을 통해 수동으로 코딩할 수 있으며, 이를 위해서는 수수료가 필요하다.
7. Gzip 압축트랜스코딩 방법에 관계없이 웹페이지가 깨져 있는 경우를 본 적이 있나요? 하하, 그 말은 많은 웹 서비스가 압축된 데이터를 전송하는 기능을 가지고 있다는 것을 모르신다는 뜻입니다. 이를 통해 네트워크 회선에서 전송되는 대량의 데이터를 60% 이상 줄일 수 있습니다. XML 데이터는 매우 높은 수준으로 압축될 수 있으므로 XML 웹 서비스의 경우 특히 그렇습니다.
그러나 일반적으로 서버는 사용자가 압축된 데이터를 처리할 수 있다고 서버에 알리지 않는 한 압축된 데이터를 보내지 않습니다.
따라서 다음과 같이 코드를 수정해야 합니다.
import urllib2, httplib request = urllib2.Request('http://xxxx.com') request.add_header('Accept-encoding', 'gzip') 1 opener = urllib2.build_opener() f = opener.open(request)
이것이 핵심입니다. 요청 객체를 생성하고 Accept-encoding을 추가합니다. gzip으로 압축된 데이터
를 승인한 다음 데이터의 압축을 풀 수 있음을 서버에 알리는 헤더:
import StringIO import gzip compresseddata = f.read() compressedstream = StringIO.StringIO(compresseddata) gzipper = gzip.GzipFile(fileobj=compressedstream) print gzipper.read()8. 다중- 스레드 동시 크롤링
단일 스레드가 너무 느리면 다중 스레드가 필요합니다. 다음은 간단한 스레드 풀 템플릿입니다. 이 프로그램은 단순히 1-10을 인쇄하지만 이는임을 알 수 있습니다. 경쟁 상대.
Python의 멀티스레딩은 쓸모가 없지만 네트워크를 자주 사용하는 크롤러의 경우 효율성을 어느 정도 향상시킬 수 있습니다.
from threading import Thread
from Queue import Queue
from time import sleep
# q是任务队列
#NUM是并发线程总数
#JOBS是有多少任务
q = Queue()
NUM = 2
JOBS = 10
#具体的处理函数,负责处理单个任务
def do_somthing_using(arguments):
print arguments
#这个是工作进程,负责不断从队列取数据并处理
def working():
while True:
arguments = q.get()
do_somthing_using(arguments)
sleep(1)
q.task_done()
#fork NUM个线程等待
alert(“Hello CSDN”);
for i in range(NUM):
t = Thread(target=working)
t.setDaemon(True)
t.start()
#把JOBS排入队列
for i in range(JOBS):
q.put(i)
#等待所有JOBS完成
q.join()
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되길 바라며, 또한 모두가 PHP 중국어를 응원해 주시길 바랍니다. 웹사이트.
Python 크롤러 기술과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!