網絡爬蟲

WebMagic

    WebMagic是一款爬蟲框架,​其底層用到以前學習到的HttpClient 和 Jsoup ,可讓咱們更方便的開發爬蟲。css

    ​WebMagic 項目代碼分爲核心和擴展兩部分html

    ​    ​- 核心部分是一個精簡的、模塊化的爬蟲實現;git

    ​    ​- 擴展部分則包括一些便利的、實用性強的功能。github

    ​WebMagic 的設計目標是儘可能的模塊化,並體現爬蟲的功能特色。這部分提供了很是簡單、靈活的API,在基本不改變開發模式的狀況下,編寫爬蟲。web

    ​擴展部分提供一些便捷的功能,例如註解模式編寫爬蟲等。同事內置一些經常使用的組件,便於爬蟲開發。正則表達式

 

WebMagic架構

​    ​WebMagic 的結構分爲 Downloader、PageProcessor、Scheduler、Pipeline四大組件,並有 Spider 將它們彼此組織起來。這四大組件分別對應爬蟲生命週期中的下載、處理、管理和持久化等功能。WebMagic 的設計參考了 Scapy(Python中的),可是實現方式更Java化一些。apache

    ​結構執行流程以下:cookie

   

用於數據流轉的對象

1.Request多線程

  Request(請求)跟咱們web中學習的同樣,Request是對 URL 地址的一層封裝,一個Request對應一個URL地址。架構

  它是 PageProcessor 與 Downloader 交互的載體,也是 PageProcessor 控制 Downloader 惟一方式。

2.Page

  Page 表明了從 Downloader 下載到的一個頁面——多是HTML,也多是JSON或者其餘文本格式的內容。

  Page 是 WebMagic 抽取過程的核心對象,它提供一些方法可供抽取、結果保存等。

3.ResultItems

  ResultItems 至關於一個Map,它保存 PageProcessor 處理的結果,供 Pipeline 使用。

  它的API與Map很相似,其中它有一個字段 skip,爲true時,則不該該被 Pipeline處理。   

 

入門案例

1.導入依賴

  建立Maven工程,並加入如下依賴 : 

    <dependencies>
        <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core -->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.7.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension -->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.7.3</version>
        </dependency>
    </dependencies>

 

  ps: 0.7.3版本對SSL的並不徹底,若是是直接從 Maven 中央倉庫下載的依賴,在爬取只支持 SSL v1.2 的網站會有SSL的異常拋出。

  解決方案:

    1.等0.7.4版本的發佈(放棄吧,有的人已經等三年了)

    2.直接從 github 上下載最新的代碼,安裝到本地倉庫(https://github.com/code4craft/webmagic

      • 下載解壓(照顧一下 git用的不溜的小夥伴,就不使用 git了)
      • 跳過測試方法 

      • 安裝到本地倉庫

 

2.加入配置文件

  WebMagic 已使用slf4j-log4j12做爲 slf4j 的實現,無需導包。

加配置文件 

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.1編寫代碼    

public class JobProcessor implements PageProcessor {
    public static void main(String[] args) {
        Spider.create(new JobProcessor())   // new一個本身所寫的JobProcessor對象
                .addUrl("http://112.124.1.187/index.html")
                .run();
    }
    // 負責解析頁面
    @Override
    public void process(Page page) {
        // 解析返回的數據page,而且把解析的結果放到 ResultItems 中
        page.putField("首頁通知",page.getHtml().css("div.content h2").all());
    }
    // 這個,將就寫着,入門案例嘛,後面講到
    private Site site = Site.me();
    @Override
    public Site getSite() {
        return site;
    }
}

 

  ps: 這裏解析頁面數據:" page.putField("首頁通知",page.getHtml().css("div.content h2").all()); 」 使用到的是 css抽取元素,另外還有 XPath、正則表達式 的方法來抽取元素,他們還能夠拼接使用,這個能夠本身去了解。

  在抽取的過程當中,總有可能抽取到多條元素,可以使用不一樣的API獲取一個或多個元素:

    page.putField("首頁通知",page.getHtml().css("div.content h2").get()  // 一個元素(默認第一個)

    page.putField("首頁通知",page.getHtml().css("div.content h2").toString()  // 一個元素(默認第一個)

    page.putField("首頁通知",page.getHtml().css("div.content h2").all()  // 全部元素

 

3.2 獲取連接

// 放在上面的 process 方法中執行。       
     // 獲取連接 // 這一行代碼,獲取,當前頁面中抽取出來的帶有其餘 URL 地址的元素 page.addTargetRequests(page.getHtml().css(".excerpt_ban p").links().all()); // 這之間,作了一個跳轉。下面的代碼針對目標url地址的頁面 // 這一行代碼,獲取,目標 url 的HTML頁面中,你要抽取的元素 page.putField("連接抓取,博客標題",page.getHtml().css(".blog_title h4").all());

  

  圖解:

 

 

 

3.3 使用 Pipeline 保存數據

  WebMagic 用於保存結果的組件叫 Pipeline,默認向控制檯輸出結果,由內置的Pipeline(ConsolePipeline)完成。

  將結果保存到文件中,將 Pipeline 的實現換成 FilePipeline.

    public static void main(String[] args) {
        Spider.create(new JobProcessor())   // new一個本身所寫的JobProcessor對象
                .addUrl("http://112.124.1.187/index.html")  // 設置爬取數據的頁面地址
                .addPipeline(new FilePipeline("E:\\Crawler File")) // 結果保存到文件中
                .thread(5)  // 多線程:設置有5個線程處理(太草率了....)
                .run();
    }

 

爬蟲的配置、啓動和終止

  Spider 是爬蟲啓動的入口。在啓動爬蟲以前,咱們須要使用一個 PageProcessor 建立一個 Spider 對象,而後使用run()啓動。

  同時,Spider 的其餘組件(Downloder、Scheduler、Pipeline) 均可以配置。

    • create(PageProcessor)   建立Spider
    • addUrl(String .. urls)   添加初始的URL
    • thread(int n)   開啓n個線程
    • run()    啓動,會阻塞當前線程執行
    • start()/runAsync()   異步啓動,當前線程繼續執行
    • stop    中止爬蟲
    • addPipeline(Pipeline p)   添加一個 Pipeline ,一個Spider能夠有多個Pipeline
    • setScheduler(Scheduler s)   設置 Scheduler,一個Spider能夠有多個 Scheduler
    • setDownloader(Downloader d)   設置 Downloader,一個Spider只能有一個 Downloader
    • get(String str)    同步調用,並直接取得結果
    • getAll(String ...str)    同步調用,並直接取得一堆結果

  

  - 站點自己的一些配置信息,例如編碼、HTTP頭、超時時間、重試策略、代理等,均可以經過 Site 對象進行配置。

    // 這個,將就寫着,入門案例嘛,後面講到
    private Site site = Site.me()
            .setCharset("utf-8")    // 設置編碼
            .setTimeOut(10 * 1000)     // 設置超時時間,單位:毫秒
            .setSleepTime(10)     // 抓取間隔時間
            .setCycleRetryTimes(10 * 1000)   // 重試的時間
            .setRetryTimes(3)    // 重試次數
            ;

 

    • setCharset(String charSet)   設置編碼
    • setUserAgent(String str)   設置 UserAgent
    • setTimeOut(int ms)   設置超時時間,單位:毫秒
    • setRetryTimes(int num)   設置重試次數
    • setCycleRetryTimes(int num)   設置循環重試次數
    • addCookie(String key,String val)   添加一條 cookie
    • setDomain(String str)    設置域名,需設置域名後,addCookie纔可生效
    • addHeader(String s1,String s2)    添加一條 請求頭部
    • setHttpProxy(HttpHost host)    設置 Http 代理
相關文章
相關標籤/搜索