>  기사  >  백엔드 개발  >  Python 분산 크롤러 원리에 대한 심층적인 이해

Python 분산 크롤러 원리에 대한 심층적인 이해

coldplay.xixi
coldplay.xixi앞으로
2020-11-26 17:59:023151검색

python 동영상 튜토리얼 칼럼에서는 분산 크롤러의 원리를 소개합니다.

Python 분산 크롤러 원리에 대한 심층적인 이해

무료 추천: python 비디오 튜토리얼

먼저, 정상적인 인간 행동이라면 웹 콘텐츠를 얻는 방법을 살펴보겠습니다.

(1) 브라우저를 열고 URL을 입력한 후 원본 웹페이지를 엽니다.

(2) 제목, 저자, 초록, 텍스트 및 기타 정보를 포함하여 원하는 콘텐츠를 선택합니다.

(3) 저장합니다. in the hard disk

기술 수준에 매핑된 위의 세 가지 프로세스는 실제로 네트워크 요청, 구조화된 데이터 캡처 및 데이터 저장입니다.

위의 간단한 잡기 기능을 구현하기 위해 Python을 사용하여 간단한 프로그램을 작성합니다.

#!/usr/bin/python 
#-*- coding: utf-8 -*- 
''''' 
Created on 2014-03-16 
 
@author: Kris 
''' 
import urllib2, re, cookielib 
 
def httpCrawler(url): 
  ''''' 
  @summary: 网页抓取 
  ''' 
  content = httpRequest(url) 
  title = parseHtml(content) 
  saveData(title) 
 
def httpRequest(url): 
  ''''' 
  @summary: 网络请求 
  '''  
  try: 
    ret = None 
    SockFile = None 
    request = urllib2.Request(url) 
    request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)') 
    request.add_header('Pragma', 'no-cache') 
    opener = urllib2.build_opener() 
    SockFile = opener.open(request) 
    ret = SockFile.read() 
  finally: 
    if SockFile: 
      SockFile.close() 
     
  return ret 
 
def parseHtml(html): 
  ''''' 
  @summary: 抓取结构化数据 
  ''' 
  content = None 
  pattern = &#39;<title>([^<]*?)</title>&#39; 
  temp = re.findall(pattern, html) 
  if temp: 
    content = temp[0] 
   
  return content 
   
def saveData(data): 
  &#39;&#39;&#39;&#39;&#39; 
  @summary: 数据存储 
  &#39;&#39;&#39; 
  f = open(&#39;test&#39;, &#39;wb&#39;) 
  f.write(data) 
  f.close() 
   
if __name__ == &#39;__main__&#39;: 
  url = &#39;http://www.baidu.com&#39; 
  httpCrawler(url)

매우 간단해 보입니다. 예, 크롤러를 시작하기 위한 기본 프로그램입니다. 물론 수집 프로세스를 구현하는 것은 위의 기본 단계에 지나지 않습니다. 그러나 강력한 수집 프로세스를 구현하려면 다음과 같은 문제에 직면하게 됩니다.

(1) 쿠키 정보로 액세스해야 합니다. 예를 들어 대부분의 소셜 소프트웨어는 기본적으로 사용자가 정보를 보려면 로그인해야 합니다. 값은 실제로 매우 간단합니다. Python에서 제공하는 cookielib 모듈을 사용하면 로그인을 성공적으로 시뮬레이션하고 크롤러가 로그인 상태에 있는 한 이러한 방식으로 소스 웹사이트에서 제공한 쿠키 정보로 모든 방문을 달성할 수 있습니다. 로그인한 사용자가 보는 모든 정보가 수집되었습니다. 다음은 쿠키를 사용하는 httpRequest() 메서드에 대한 수정 사항입니다.

ckjar = cookielib.MozillaCookieJar() 
cookies = urllib2.HTTPCookieProcessor(ckjar)     #定义cookies对象 
def httpRequest(url): 
  &#39;&#39;&#39;&#39;&#39; 
  @summary: 网络请求 
  &#39;&#39;&#39;  
  try: 
    ret = None 
    SockFile = None 
    request = urllib2.Request(url) 
    request.add_header(&#39;User-Agent&#39;, &#39;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)&#39;) 
    request.add_header(&#39;Pragma&#39;, &#39;no-cache&#39;) 
    opener = urllib2.build_opener(cookies)    #传递cookies对象 
    SockFile = opener.open(request) 
    ret = SockFile.read() 
  finally: 
    if SockFile: 
      SockFile.close() 
     
  return ret

(2) 인코딩 문제. 현재 웹사이트에는 utf-8 또는 gbk라는 두 가지 가장 일반적인 코드가 있습니다. 소스 웹사이트 코드를 수집했는데 데이터베이스에 저장된 코드가 일치하지 않는 경우(예: 163.com의 코드는 gbk를 사용합니다.) 저장소가 utf.-8로 인코딩된 데이터인 경우 Python에서 제공되는 encode() 및 decode() 메서드를 사용하여 변환할 수 있습니다. 예:

content = content.decode(&#39;gbk&#39;, &#39;ignore&#39;)   #将gbk编码转为unicode编码 
content = content.encode(&#39;utf-8&#39;, &#39;ignore&#39;)  #将unicode编码转为utf-8编码

유니코드 인코딩이 중간에 표시되므로 먼저 중간 인코딩 유니코드로 변환해야 합니다. gbk 또는 utf-8 변환으로 변환할 수 있습니다.

(3) 웹 페이지의 태그가 불완전합니다. 예를 들어 일부 소스 코드에는 시작 태그가 있지만 종료 태그가 없으면 구조화된 데이터를 캡처하는 기능에 영향을 미칩니다. BeautifulSoup 모듈은 먼저 소스 코드를 정리한 다음 콘텐츠를 분석하고 가져옵니다.

(4) 일부 웹사이트는 JS를 사용하여 웹 콘텐츠를 저장합니다. 소스코드를 직접 살펴보니, 귀찮은 JS 코드가 잔뜩 발견되었습니다. 브라우저를 구문 분석하여 js와 ajax를 구문 분석할 수 있는 mozilla, webkit 및 기타 툴킷을 사용할 수 있지만 속도는 약간 느려집니다.

(5) 사진은 플래시 형식으로 존재합니다. 사진의 내용이 텍스트나 숫자로 구성되어 있으면 처리하기가 더 쉽습니다. 자동 인식을 위해서는 OCR 기술만 사용하면 됩니다. 그러나 플래시 링크인 경우에는 전체 URL을 저장합니다.

(6) 웹페이지에는 여러 웹페이지 구조가 있습니다. 크롤링 규칙 세트가 하나만 있으면 작동하지 않습니다. 따라서 크롤링을 지원하려면 여러 시뮬레이션 세트를 구성해야 합니다.

(7) 소스 웹사이트를 모니터링합니다. 결국, 다른 사람의 것을 크롤링하는 것은 좋은 일이 아니므로 대부분의 웹사이트에는 크롤러에 대한 액세스를 금지하는 제한 사항이 있습니다.
좋은 수집 시스템은 대상 데이터가 어디에 있든 사용자에게 표시되는 한 다시 수집할 수 있어야 합니다. 보이는 그대로 얻는 것이 방해받지 않는 수집, 로그인이 필요한 데이터인지 여부에 관계없이 원활하게 수집할 수 있습니다. 소셜 네트워킹 사이트와 같은 대부분의 귀중한 정보는 일반적으로 로그인이 필요합니다. 로그인에 대처하려면 웹 사이트에는 데이터를 정상적으로 얻기 위해 사용자 로그인을 시뮬레이션하는 크롤러 시스템이 있어야 합니다. 그러나 소셜 웹사이트는 폐쇄 루프를 형성하기를 원하며 이러한 종류의 시스템은 뉴스 및 기타 콘텐츠만큼 사람들에게 공개되지 않습니다. 이러한 소셜 웹사이트의 대부분은 로봇 크롤러 시스템이 데이터를 크롤링하는 것을 방지하기 위해 몇 가지 제한 사항을 채택합니다. 일반적으로 계정이 감지되어 액세스가 금지되기 전까지 크롤링하는 데 오랜 시간이 걸리지 않습니다. 이는 우리가 이러한 웹사이트에서 데이터를 크롤링할 수 없다는 뜻인가요? 이는 확실히 사실이 아닙니다. 소셜 웹사이트가 웹페이지 액세스를 차단하지 않는 한, 우리는 일반 사람들이 액세스할 수 있는 데이터에도 액세스할 수 있습니다. 최종 분석에서는 전문적으로 "감시 방지"라고 불리는 정상적인 인간 행동의 시뮬레이션입니다.

원본 웹사이트에는 일반적으로 다음과 같은 제한이 있습니다.

1. 일정 기간 동안 단일 IP에 대한 방문 횟수는 재미를 위한 목적이 아닌 이상 일반 사용자가 해당 웹사이트에 접속하면 통과되지 않습니다. 특정 기간 내에 웹 사이트를 빠르게 방문하면 오래 가지 않습니다. 이 문제는 해결하기 쉽습니다. 다수의 불규칙한 프록시 IP를 사용하여 프록시 풀을 형성하고, 프록시 풀에서 프록시를 무작위로 선택하고, 액세스를 시뮬레이션할 수 있습니다. 프록시 IP에는 투명 프록시와 익명 프록시의 두 가지 유형이 있습니다.

2. 일정 기간 동안 단일 계정에 대한 방문 횟수. 사람이 24시간 데이터 인터페이스에 액세스하고 속도가 매우 빠르면 로봇일 수 있습니다. 정상적인 동작으로 많은 수의 계정을 사용할 수 있습니다. 정상적인 동작은 일반 사람들이 소셜 네트워킹 사이트에서 작동하는 방식이며, 각 방문 사이에 방문하는 URL 수를 최소화해야 합니다. 간격은 임의의 값일 수 있습니다. 즉, URL을 방문할 때마다 임의의 시간 동안 대기한 후 다음 URL을 방문합니다.

계정과 IP의 접근 정책을 통제할 수 있다면 기본적으로 문제가 없습니다. 물론 상대방의 웹사이트에도 조정될 운영 및 유지 전략이 있을 것입니다. 적과 우리 사이의 전투에서 크롤러는 상대방의 모니터링 방지가 우리에게 영향을 미칠 것임을 감지할 수 있어야 합니다. 적시에 처리하도록 관리자에게 알리십시오. 실제로 가장 이상적인 것은 머신러닝을 통해 감시 방지 대결을 지능적으로 구현하고 중단 없는 캡처를 달성할 수 있는 것입니다.

다음은 그림 1과 같이 제가 최근 디자인하고 있는 분산 크롤러 아키텍처 다이어그램입니다.

이것은 순전히 예비 아이디어를 구현하는 작업입니다. 주로 Python의 Socket 모듈을 사용하여 서버와 클라이언트 간의 통신을 구현하는 데 사용됩니다. 관심이 있으시면 저에게 개별적으로 연락하여 더 나은 솔루션에 대해 논의하고 완료할 수 있습니다.

위 내용은 Python 분산 크롤러 원리에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
이전 기사:파이썬 Xpath 구문다음 기사:파이썬 Xpath 구문