웹 크롤러 2의 WebMagic

1. WebMagic 소개

  1. 기본 지식 :
    WebMagic은 하단에 HttpClient 및 Jsoup을 사용하는 크롤러 프레임 워크로, 크롤러를보다 편리하게 개발할 수 있습니다.
    WebMagic 프로젝트 코드는 코어와 확장의 두 부분으로 나뉩니다. 핵심 부분 (webmagic-core)은 간소화 된 모듈 식 크롤러 구현이며 확장 부분에는 편리하고 실용적인 기능이 포함되어 있습니다.
    WebMagic의 디자인 목표는 가능한 한 모듈화되고 크롤러의 기능적 특성을 반영하는 것입니다. 이 부분은 매우 간단하고 유연한 API를 제공하며 기본적으로 개발 모델을 변경하지 않고 크롤러를 작성합니다.
    확장 부분 (webmagic-extension)은 주석 모드에서 크롤러를 작성하는 것과 같은 몇 가지 편리한 기능을 제공합니다. 동시에 일반적으로 사용되는 일부 구성 요소가 내장되어 크롤러 개발을 용이하게합니다.
  2. 아키텍처 소개
    WebMagic의 구조는 Downloader, PageProcessor, Scheduler 및 Pipeline의 네 가지 주요 구성 요소로 나뉘며 Spider로 구성됩니다. 이 네 가지 구성 요소는 크롤러 수명주기의 다운로드, 처리, 관리 및 지속성 기능에 해당합니다. WebMagic의 디자인은 Scapy를 참조하지만 구현은 Java 기반입니다.
    Spider는 서로 상호 작용하고 프로세스에서 실행할 수 있도록 이러한 구성 요소를 구성합니다. Spider는 큰 컨테이너이며 WebMagic 논리의 핵심이기도합니다.
  3. WebMagic의 전체 구조는 다음과 같습니다.
    여기에 사진 설명 삽입
    3.1. WebMagic의 네 가지 구성 요소
    1. Downloader
      Downloader는 후속 처리를 위해 인터넷에서 페이지를 다운로드합니다. WebMagic은 기본적으로 Apache HttpClient를 다운로드 도구로 사용합니다.
    2. PageProcessor
      PageProcessor는 페이지 구문 분석, 유용한 정보 추출 및 새 링크 검색을 담당합니다. WebMagic은 Jsoup을 HTML 구문 분석 도구로 사용하고이를 기반으로 XPath 구문 분석 도구 인 Xsoup을 개발합니다.
      이 네 가지 구성 요소 중 PageProcessor는 각 사이트의 각 페이지마다 다르며 사용자가 사용자 정의해야하는 부분입니다.
    3. 스케줄러
      스케줄러는 크롤링 할 URL과 일부 중복 제거 작업을 관리합니다. WebMagic은 URL을 관리하기 위해 기본적으로 JDK 메모리 대기열을 제공하고 컬렉션을 사용하여 중복을 제거합니다. 또한 분산 관리를위한 Redis 사용을 지원합니다.
    4. Pipeline
      Pipeline은 계산, 파일, 데이터베이스 등에 대한 지속성을 포함한 추출 결과 처리를 담당합니다. 기본적으로 WebMagic은 "콘솔로 출력"및 "파일에 저장"의 두 가지 결과 처리 솔루션을 제공합니다.
      파이프 라인은 결과가 저장되는 방식을 정의합니다. 지정된 데이터베이스에 저장하려면 해당 파이프 라인을 작성해야합니다. 일반적으로 요구 사항 유형에 대해 하나의 파이프 라인 만 작성하면됩니다.

3.2. 데이터 흐름에 사용되는 개체

  1. Request
    Request는 URL 주소의 캡슐화 계층이며 Request는 URL 주소에 해당합니다.
    이것은 PageProcessor와 Downloader 간의 상호 작용을 전달하는 매개체이며 PageProcessor가 Downloader를 제어하는 ​​유일한 방법이기도합니다.
    URL 자체 외에도 키-값 구조에 추가 필드가 포함되어 있습니다. 일부 특수 속성을 추가로 저장하고 다른 위치에서 읽어 다른 기능을 완료 할 수 있습니다. 예를 들어 페이지의 일부 정보가 첨부됩니다.
  2. 페이지
    페이지는 다운로더에서 다운로드 한 페이지를 나타내며 HTML, JSON 또는 기타 텍스트 형식 콘텐츠 일 수 있습니다.
    페이지는 WebMagic 추출 프로세스의 핵심 개체이며 추출, 결과 보존 등을위한 몇 가지 방법을 제공합니다.
  3. ResultItems
    ResultItems는 Pipeline에서 사용하기 위해 PageProcessor에서 처리 한 결과를 저장하는 Map과 동일합니다. API는 Map과 매우 유사하며 필드 건너 뛰기가 있다는 점에 주목할 가치가 있습니다. true로 설정하면 Pipeline에서 처리하지 않아야합니다.

3.3 소개 사례

  1. 종속성 추가
    Maven 프로젝트를 만들고 다음 종속성을 추가합니다.

    <!--WebMagic核心包-->
    <dependency>
       <groupId>us.codecraft</groupId>
       <artifactId>webmagic-core</artifactId>
       <version>0.7.3</version>
    </dependency>
    <!--WebMagic扩展-->
    <dependency>
       <groupId>us.codecraft</groupId>
       <artifactId>webmagic-extension</artifactId>
       <version>0.7.3</version>
    </dependency>
    

    注意:0.7.3版本对SSL的并不完全,如果是直接从Maven中央仓库下载依赖,在爬取只支持SSL v1.2的网站会有SSL的异常抛出。
    해결책:

    1. 저자의 0.7.4 버전이 출시 될 때까지 기다립니다.
    2. 최신 코드를 github에서 직접 다운로드하여 로컬웨어 하우스에 설치합니다.
      다음 정보를 참조하여 직접 수정할 수도 있습니다.
      https://github.com/code4craft/webmagic/issues/701

  2. slf4j의 구현으로 slf4j-log4j12를 사용 하도록 구성 파일 WebMagic을 추가하십시오 .
    log4j.properties 구성 파일 추가

    log4j.rootLogger=INFO,A1 
    
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{
          
          yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
    
    
  3. 사례 실현
    여기에 사진 설명 삽입

    public class JobProcessor implements PageProcessor {
          
          
    
        //解析页面
        public void process(Page page) {
          
          
          page.putField("logo_subtit", page.getHtml().css("div.logo>h2").all());
        }
    
        private Site site = Site.me();
        public Site getSite() {
          
          
            return site;
        }
        
        public static void main(String[] args) {
          
          
            Spider.create(new JobProcessor())
                    //初始访问url地址
                    .addUrl("https://www.jd.com/") 
                    .run();
        }
    }
    

    인쇄 결과 :
    여기에 사진 설명 삽입

2. WebMagic 기능

2.1. PageProcessor 구현

  1. 요소 추출 선택 가능 : WebMagic에서는 주로 XPath, CSS 선택기 및 정규식의 세 가지 추출 기술이 사용됩니다. 또한 JSON 형식 콘텐츠의 경우 JsonPath를 사용하여 구문 분석 할 수 있습니다.

  2. 요소 API
    추출 선택 가능한 관련 추출 요소 체인 API는 WebMagic의 핵심 기능입니다. 선택 가능 인터페이스를 사용하면 추출 세부 사항에 신경 쓰지 않고 페이지 요소의 체인 추출을 직접 완료 할 수 있습니다.
    page.getHtml ()이 반환하는 것은 Selectable 인터페이스를 구현하는 Html 객체입니다. 이 인터페이스에 포함 된 메서드는 추출 부분과 결과 부분의 두 가지 범주로 나뉩니다.

방법 기술
xpath (문자열 xpath) XPath를 사용하여 선택 html.xpath ( "// div [@ class = 'title']")
$ (문자열 선택기) CSS 선택기를 사용하여 html. $ ( "div.title")
$ (문자열 선택기, 문자열 속성) CSS 선택기를 사용하여 html. $ ( "div.title", "text")
css (문자열 선택기) 함수는 $ ()와 동일합니다. Css 선택기를 사용하여 html.css ( "div.title")
연결() 모든 링크 선택 html.links ()
정규식 (문자열 정규식) 정규식 추출 사용 html.regex ( "(. *?)")

추출 API의이 부분은 연결 호출을 지원하는 선택 가능한 인터페이스를 반환합니다. 예를 들어 https://www.jd.com/ 페이지를 방문하십시오.

  1. Get results API
    체인 호출이 종료되면 일반적으로 문자열 유형 결과를 가져옵니다. 이때 결과를 얻으려면 API를 사용해야합니다.
    추출 규칙은 XPath, CSS 선택자 또는 정규식이든 항상 여러 요소를 추출 할 수 있습니다. WebMagic은이를 통합하며 하나 이상의 요소를 다른 API를 통해 얻을 수 있습니다.
방법 기술
가져 오기() 문자열 유형의 결과 반환 문자열 링크 = html.links (). get ()
toString () get ()과 동일하며 문자열 유형 결과를 반환합니다. 문자열 링크 = html.links (). toString ()
모두() 모든 추출 결과 반환 링크 나열 = html.links (). all ()

여러 데이터가있는 경우 get () 및 toString () 모두 첫 번째 URL 주소를 가져 오는 데 사용됩니다.
여기서 selectable.toString ()은 toString () 인터페이스를 사용하는데, 이는 일부 프레임 워크를 출력하고 결합 할 때 더 편리합니다. 정상적인 상황에서는 하나의 요소 만 선택하면됩니다! selectable.all ()은 모든 요소를 ​​가져옵니다.

  1. 링크
    가져 오는 논리를 사용하면 크롤러가 거의 완성되었지만 여전히 문제가 있습니다. 사이트에 많은 페이지가 있고 처음에 모두 나열 할 수없는 경우 후속 링크를 어떻게 찾습니까? 크롤러에서 없어서는 안될 부분.
    다음 예제는
    https://www.jd.com/news.\w+?.* 정규식을 준수하는 https://www.jd.com/moreSubject.aspx에서 모든 URL 주소 를 가져 와서
    링크하는 것입니다. 크롤링 할 큐에 추가하십시오.

2.2 파이프 라인을 사용하여 결과 저장

  • WebMagic에서 결과를 저장하는 데 사용하는 구성 요소를 파이프 라인이라고합니다. 이제 "콘솔 출력 결과"를 통해이 작업은 내장 된 파이프 라인을 통해 수행됩니다. ConsolePipeline이라고합니다.
    이제 결과를 파일에 저장하고 싶습니다. 어떻게해야합니까? Pipeline 구현을 "FilePipeline"으로 바꾸십시오.
    public static void main(String[] args) {
          
          
        Spider.create(new JobProcessor())
                //初始访问url地址
                .addUrl("https://www.jd.com/")
                .addPipeline(new FilePipeline("D:/webmagic/"))
                .thread(5)//设置线程数
                .run();
    }
    

2.3. 크롤러 구성, 시작 및 종료

  1. Spider
    Spider는 크롤러가 시작할 수있는 진입 점입니다. 크롤러를 시작하기 전에 PageProcessor를 사용하여 Spider 개체를 만든 다음 run ()을 사용하여 시작해야합니다.
    동시에 다른 Spider 구성 요소 (Downloader, Scheduler, Pipeline)는 set 메서드를 통해 설정할 수 있습니다.
방법 기술
create (페이지 프로세서) 거미 만들기 Spider.create (새로운 GithubRepoProcessor ())
addUrl (문자열…) 초기 URL 추가 spider .addUrl (“http://webmagic.io/docs/”)
스레드 (n) n 개의 스레드 열기 spider.thread (5)
운영() 시작, 현재 스레드 실행을 차단합니다. spider.run ()
start () / runAsync () 비동기 적으로 시작하면 현재 스레드가 계속 실행됩니다. spider.start ()
중지() spider.stop () 중지
addPipeline (파이프 라인) 파이프 라인 추가, Spider는 여러 파이프 라인을 가질 수 있습니다. spider .addPipeline (new ConsolePipeline ())
setScheduler (스케줄러) 스케줄러를 설정하면 하나의 스파이더가 하나의 스케줄러 만 가질 수 있습니다. spider.setScheduler (new RedisScheduler ())
setDownloader (다운로더) Set Downloader, 하나의 Spider는 하나의 Downloader 만 가질 수 spider .setDownloader (new SeleniumDownloader ())
get (문자열) 동기식으로 호출하고 결과를 직접 가져옵니다. ResultItems 결과 = spider.get (“http://webmagic.io/docs/”)
getAll (문자열…) 동기식으로 호출하고 많은 결과를 직접 가져옵니다. 목록 결과 = spider .getAll (“http://webmagic.io/docs/”,“http://webmagic.io/xxx”)
  1. 크롤러 구성
    Site.me ()는 인코딩, 크롤링 간격, 제한 시간, 재시도 횟수 등을 포함하여 크롤러를 구성 할 수 있습니다. 여기서 먼저 간단히 설정합니다. 재시도 횟수는 3이고 크롤링 간격은 1 초입니다.

    private Site site = Site.me()
            .setCharset("UTF-8")//编码
            .setSleepTime(1)//抓取间隔时间
            .setTimeOut(1000*10)//超时时间
            .setRetrySleepTime(3000)//重试时间
            .setRetryTimes(3);//重试次数
    

    인코딩, HTTP 헤더, 타임 아웃 기간, 재시도 전략 등, 프록시 등과 같은 사이트 자체의 일부 구성 정보는 Site 개체를 설정하여 구성 할 수 있습니다.

방법 기술
setCharset (문자열) 인코딩 설정 site.setCharset ( "utf-8")
setUserAgent (문자열) UserAgent 설정 site.setUserAgent ( "Spider")
setTimeOut (int) 제한 시간을 설정하고,
단위는 밀리 초입니다. site.setTimeOut (3000)
setRetryTimes (int) 재시도 횟수 설정 site.setRetryTimes (3)
setCycleRetryTimes (int) 주기적 재시도 횟수 설정 site.setCycleRetryTimes (3)
addCookie (문자열, 문자열) 쿠키 추가 site.addCookie ( "dotcomt_user", "code4craft")
setDomain (문자열) 도메인 이름을 설정합니다. addCookie가 적용되기 전에 도메인 이름을 설정해야합니다. site.setDomain ( "github.com")
addHeader (문자열, 문자열) addHeader site.addHeader ( "Referer", "https://github.com")를 추가합니다.
setHttpProxy (HttpHost) Http 프록시 설정 site.setHttpProxy (new HttpHost (“127.0.0.1”, 8080))

3. 크롤러 분류

网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的

  1. 通用网络爬虫
    通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。
    这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。
    简单的说就是互联网上抓取所有数据。

  2. 聚焦网络爬虫
    聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。
    和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求 。
    简单的说就是互联网上只抓取某一种数据。

  3. 증분 웹 크롤러
    증분 웹 크롤러 (Incremental Web Crawler)는 증분 업데이트 만 수행하고 새로 생성 된 크롤링 파충류 또는 다운로드 된 페이지에서 발생한 페이지 변경을 의미하며, 어느 정도 크롤링을 보장 할 수 있습니다. 페이지는 가능한 한 새롭습니다.
    주기적으로 페이지를 크롤링하고 새로 고치는 웹 크롤러와 비교할 때 증분 크롤러는 필요할 때 새로 생성되거나 업데이트 된 페이지 만 크롤링하고 변경되지 않은 페이지는 다시 다운로드하지 않습니다. 이렇게하면 데이터 다운로드 양을 적시에 효과적으로 줄일 수 있습니다. 크롤링 된 웹 페이지를 업데이트하면 시간과 공간 소비가 줄어들지 만 크롤링 알고리즘의 복잡성과 구현 난이도가 증가합니다.
    간단히 말해서 새로 업데이트 된 데이터 만 인터넷에서 캡처됩니다.

  4. 딥 웹 크롤러
    웹 페이지는 존재 방식에 따라 표면 웹 페이지 (Surface Web)와 딥 웹 페이지 (Deep Web, Invisible Web Pages 또는 Hidden Web이라고도 함)로 나눌 수 있습니다.
    Surface 웹 페이지는 기존 검색 엔진에서 인덱싱 할 수있는 웹 페이지를 나타내며 주로 하이퍼 링크로 연결할 수있는 정적 웹 페이지로 구성됩니다.
    딥 웹은 대부분의 콘텐츠를 정적 링크를 통해 얻을 수없고 검색 양식 뒤에 숨겨져 있으며 사용자가 일부 키워드를 제출해야만 얻을 수있는 웹 페이지입니다.

4. WebMagic을 사용하여 51job에 대한 채용 정보 크롤링

추천

출처blog.csdn.net/weixin_44505194/article/details/106706959