1. 程式人生 > >爬蟲(二):Lucene

爬蟲(二):Lucene

  • 搜尋引擎:
    * 什麼是搜尋引擎
    * 搜尋引擎基本執行原理
    * 原始資料庫做搜尋有什麼弊端
    * 倒排索引(敲黑板)
  • lucene
    • lucene相關的概念
    • lucene和solr的關係
    • lucene入門程式(寫入索引的操作程式碼)
    • lucene相關寫入索引的api的解釋
    • ik分詞器
    • lucene的搜尋: 基礎的搜尋(2個), 多樣化的搜尋(5個)
  • lucene的高階(理解)
    • lucene的高亮
    • lucene的分頁
    • lucene的排序
    • lucene的激勵因子

1. 搜尋引擎

1.1 什麼是搜尋引擎

搜尋引擎是指根據一定的策略、運用特定的計算機程式從網際網路上搜集資訊,在對資訊進行組織和處理後,為使用者提供檢索服務,將使用者檢索相關的資訊展示給使用者的系統。搜尋引擎包括全文索引、目錄索引、元搜尋引擎、垂直搜尋引擎、集合式搜尋引擎、門戶搜尋引擎與免費連結列表等。

代表性搜尋引擎: 谷歌(Google) 百度(baidu)

1.2 搜尋引擎的執行原理

  • 爬蟲程式–>爬取網頁–將爬取到的網頁儲存到臨時庫中
  • 利用規則將資料網頁資料處理並儲存到索引庫中
  • 呼叫查詢索引的程式,從索引庫中查詢相關資訊

1.3 原始資料庫做搜尋的弊端

    1. 慢, 當資料庫中儲存了大量的資料以後, 查詢的效率非常的低
    1. 如果使用的原始的sql完成搜尋, 那麼只能匹配首尾的內容,和使用者的結果有可能是不同的
    1. 如果使用者真的輸錯了, 難道就啥也搜不到了嗎? 如果使用者輸入錯誤, 那麼可以導致其結果和使用者想的完全不同

1.4 倒排索引

​ 倒排索引 . 稱為反向索引, 可以將一句話, 一個詞, 一段話把他進行拆分(分詞). 將分好詞的資料建立索引, 將其儲存的索引庫中, 這樣當用戶來訪問的索引庫的時候, 將使用者輸入的內容也進行分詞, 將分好詞的內容到索引庫中查詢, 將查詢到的內容返回使用者

為什麼說倒排索引可以提高查詢的效率?

​ 假設有一個使用者: 輸入"谷歌跳槽離開", 先將使用者這個輸入的內容進行一個分詞, (谷歌, 跳槽, 離開),然後將這個三個詞語到索引庫中進行分開查詢, 然後將三個的詞語查詢的id值返回, 1,2,3,4,5,根據id查詢資料庫

2. lucene

lucene 是Apache提供的全文檢索的工具包, 其本質就是一個工具包, 只不過可以使用lucene幫助我們構建一個全文搜尋的引擎

官方網址: http://lucene.apache.org/

2.1 lucene和solr的關係

lucene: 是一個底層的API, 本質是一個工具包

solr: 是一個企業級的搜尋引擎, 其底層就是lucene

2.2 lucene的基本的入門

  • 第一步: 導包
 <!--lucene的核心包-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>4.10.2</version>
        </dependency>
        <!--lucene 查詢的依賴包 可以省略的-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queries</artifactId>
            <version>4.10.2</version>
        </dependency>
        <!--lucene的 測試的先關的, 可以省略的-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-test-framework</artifactId>
            <version>4.10.2</version>
        </dependency>
        <!--lucene的分詞器的包-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>4.10.2</version>
        </dependency>
        <!--lucene的查詢包-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>4.10.2</version>
        </dependency>
        <!--lucene的高亮的包-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-highlighter</artifactId>
            <version>4.10.2</version>
        </dependency>	
  • 編寫程式碼(寫入索引的程式碼)
public class IndexWriterLucene {
    //演示: 寫入索引的操作
    public static void main(String[] args) throws Exception {
        //1. 需要建立寫入索引器物件
        //1.1 指定索引庫的目錄
        //此處這個一定要是一個目錄, 千萬別寫檔案
        Directory directory = FSDirectory.open(new File("F:\\index"));
        //1.2 建立索引寫入器的配置物件
        //引數1: 指定lucene的版本
        //引數2: 指定的分詞器,目前採用標準分詞器
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST,new StandardAnalyzer());
        IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);

        //2. 新增文件的操作
        //2.1 建立文件物件
        Document doc = new Document();
        //2.1.1 新增文件的內容
        doc.add(new LongField("id",1L, Field.Store.YES));
        doc.add(new StringField("title","lucene的簡介", Field.Store.YES));
        doc.add(new TextField("content","lucene是Apache提供的一個全文檢索的工具包, 使用lucene可以構建一個搜尋引擎", Field.Store.YES));

        indexWriter.addDocument(doc);

        //3. 寫入索引(提交索引)
        indexWriter.commit();

        //4. 將索引寫入器關閉
        indexWriter.close();

    }
}
  • 寫入多條索引資料
 //演示: 寫入多條索引的操作
    public static void main(String[] args) throws Exception {
        //1. 建立寫入索引器物件
        //1.1 指定索引庫的目錄位置
        Directory directory = FSDirectory.open(new File("F:\\index"));
        //1.2 建立索引寫入器的配置物件
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST,new IKAnalyzer());
        //CREATE: 建立, 不管索引庫存在不存在, 都是每次執行重新 新的索引庫
        //APPEND: 追加, 如果索引庫存在, 那麼就會追加資料, 如果索引庫不存在, 直接報錯
        //CREATE_OR_APPEND: 建立或者追加, 如果索引庫不存在, 那麼就是建立, 如果索引庫存在, 就是追加
        indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);

        IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);

        //2. 新增文件內容
        List<Document> list = new ArrayList<Document>();

        for(int i = 0 ; i<5 ; i++){
            //2.1 建立文件物件
            Document doc = new Document();
            //2.1.1 新增文件的內容
            doc.add(new LongField("id",i, Field.Store.YES));
            doc.add(new StringField("title","花花", Field.Store.YES));
            doc.add(new TextField("content","自定義詞彙"+i, Field.Store.YES));

            list.add(doc);
        }

        indexWriter.addDocuments(list);

        //3. 提交文件
        indexWriter.commit();

        //4. 關閉寫入器物件
        indexWriter.close();



    }

2.3 索引檢視工具

  • 設定索引庫的位置

1535079337883

  • 檢視視窗的解釋

1535079596910

  • 文件檢視的內容

1535079784582

2.4 索引寫入相關的api

  • IndexWriter: 索引寫入器物件

    其主要的作用, 新增索引, 修改索引和刪除索引

    • 建立此物件的時候, 需要傳入Directory和indexWriterConfig物件
  • Directory: 目錄類, 用來指定索引庫的目錄

    • 常用的實現類:
      • FSDirectory: 用來指定檔案系統的目錄, 將索引資訊儲存到磁碟上
        • 優點: 索引可以進行長期儲存, 安全係數高
        • 缺點: 讀取略慢
      • RAMDriectory: 記憶體目錄, 將索引庫資訊存放到記憶體中
        • 優點: 讀取速度快
        • 缺點: 不安全, 無法長期儲存, 關機後就消失了
  • IndexWriterConfig: 索引寫入器的配置類

    • 建立此物件, 需要傳遞Lucene的版本和分詞器
    • 作用:
      • 作用1 : 指定Lucene的版本和需要使用的分詞器
      • 作用2: 設定Lucene的開啟索引庫的方式: setOpenMode();
		//引數值: APPEND CREATE   CREATE_OR_APPEND
        /**
         * APPEND: 表示追加, 如果索引庫存在, 就會向索引庫中追加資料, 如果索引庫不存在, 直接報錯
         * 
         * CREATE: 表示建立, 不管索引庫有沒有, 每一次都是重新建立一個新的索引庫
         * 
         * CREATE_OR_APPEND: 如果索引庫有, 就會追加, 如果沒有 就會建立索引庫
         		預設值也是 CREATE_OR_APPEND
         */
        config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
  • Document: 文件

​ 在Lucene中, 每一條資料以文件的形式進行儲存, 文件中也有其對應的屬性和值, Lucene中一個文件類似資料庫的一個表, 表中的欄位類似於文件中的欄位,只不過這個文件只能儲存一條資料

​ Document看做是一個檔案, 檔案的屬性就是文件的屬性, 檔案對應屬性的值就是文件的屬性的值 content

  • 一個文件中可以有多個欄位, 每一個欄位就是一個field物件,不同的文件可以有不同的屬性
  • 欄位也有其對應資料型別, 故Field類也提供了各種資料型別的實現類
Field類 資料型別 Analyzed是否分析 Indexed是否索引 Stored是否儲存 說明
StringField(FieldName, FieldValue,Store.YES)) 字串 N Y Y或N 這個Field用來構建一個字串Field,但是不會進行分析,會將整個串儲存在索引中,比如(訂單號,姓名等)是否儲存在文件中用Store.YES或Store.NO決定
LongField(FieldName, FieldValue,Store.YES) Long型 Y Y Y或N 這個Field用來構建一個Long數字型Field,進行分析和索引,比如(價格)是否儲存在文件中用Store.YES或Store.NO決定
StoredField(FieldName, FieldValue) 過載方法,支援多種型別 N N Y 這個Field用來構建不同型別Field不分析,不索引,但要Field儲存在文件中
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader) 字串或流 Y Y Y或N 如果是一個Reader, lucene猜測內容比較多,會採用Unstored的策略.

名稱解釋:

​ 分析: 是否將欄位的值進行分詞

​ 索引: 指的是能否被搜尋

​ 是否儲存: 指的的原始值是否需要儲存

​ 如果一個欄位中的值可以被分詞, 那麼必然是支援搜尋的

  • Analyzer: 分詞器:

    ​ 用於對文件中的資料進行分詞, 其分詞的效果取決於分詞器的選擇, Lucene中根據各個國家制定了各種語言的分詞器,對中文有一個ChineseAnalyzer 但是其分詞的效果, 是將中文進行一個一個字的分開

    針對中文分詞一般只能使用第三方的分詞詞:

2.5 整合IK

說明: ik分詞器官方版本並不支援Lucene4.x版本, 有人基本官方版本做了改進, 使其支援Lucene4.x

  • 基本使用
導包:
<!-- https://mvnrepository.com/artifact/com.janeluo/ikanalyzer -->
<dependency>
    <groupId>com.janeluo</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>2012_u6</version>
</dependency>

1535082495158

  • ik的高階使用
    • 引入ik的擴充套件詞典相關的內容

1535082882070

2.6 基本查詢

  • 基本入門案例(單欄位的解析器)
//單欄位的查詢解析器
    @Test
    public  void queryParseToLucene() throws Exception {
        //1. 需要建立查詢索引的物件
        IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("F:\\index")));
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        //2. 執行查詢, 返回結果集
        //2.1 封裝查詢條件
        // 注意: 此處指定的分詞器一定要和寫入索引庫的分詞器一致
        QueryParser queryParser = new QueryParser("content",new IKAnalyzer());
        //此處的引數, 其實就是使用者的輸入的內容
        Query query = queryParser.parse("程式設計師是最厲害的人");
        TopDocs topDocs = indexSearcher.search(query, Integer.MAX_VALUE);

        int totalHits = topDocs.totalHits;//一共查詢到了多少條資料
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;// 返回的得分文件的陣列
        System.out.println("一共返回了"+totalHits+"條資料");
        //2.2 遍歷得分文件的陣列
        for (ScoreDoc scoreDoc : scoreDocs) {
            float score = scoreDoc.score;//獲取文件分數
            int docID = scoreDoc.doc; //返回文件的id
            Document document = indexSearcher.doc(docID);
            String id = document.get("id");
            String title = document.get("title");
            String content = document.get("content");
            System.out.println("得分:"+score+" "+id+" "+title+" "+content);

        }

    }
  • 多欄位的查詢解析器
//多欄位的查詢解析器
    @Test
    public  void multiFieldQueryParserToLucene() throws Exception {
        //1. 建立查詢索引的物件
        IndexReader reader  =DirectoryReader.open(FSDirectory.open(new File("F:\\index")));
        IndexSearcher indexSearcher = new IndexSearcher(reader);

        //2. 執行查詢
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(new String[]{"title","content"},new IKAnalyzer());
        Query query = queryParser.parse("程式設計師是最厲害的");
        TopDocs topDocs = indexSearcher.search(query, Integer.MAX_VALUE);

        //2.1 獲取結果集中內容
        int totalHits = topDocs.totalHits;//共計查詢到多少條資料
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;//得分文件的陣列
        //2.2 遍歷陣列, 獲取文件的id值
        for (ScoreDoc scoreDoc : scoreDocs) {
            float score = scoreDoc.score;//文件的得分
            int docID = scoreDoc.doc;//文件的id值

            Document document = indexSearcher.doc(docID);
            String id = document.get("id");
            String title = document.get("title");
            String content = document.get("content");
            System.out.println("得分:"+score+" "+id+" "+title+" "+content);
        }

    }

2.7 索引查詢的相關api

2.8 多樣化查詢

2.8.1 詞條查詢 termQuery

 /**
     * 詞條: 是一個不可在分割的內容, 如果寫錯了, 或者跟索引庫中的詞條不匹配, 那麼都是查詢不出來的
     *      詞條可以是一個字, 是一個詞, 甚至可以是一句話或者一段話
     *  主要適用於那些不能夠進行分詞的欄位, 比如: id
     * @throws Exception
     */
    @Test
    public  void termQueryToLucene() throws Exception {
        //1. 建立查詢索引的物件
        IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File("f:\\index"))));
        //2. 執行查詢
        TermQuery query = new TermQuery(new Term("title","lucene的簡介"));

        TopDocs topDocs = indexSearcher.search(query, Integer.MAX_VALUE);

//2.1 獲取結果集中內容
        int totalHits = topDocs.totalHits;//共計查詢到多少條資料
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;//得分文件的陣列
        //2.2 遍歷陣列, 獲取文件的id值
        for (ScoreDoc scoreDoc : scoreDocs) {
            float score = scoreDoc.score;//文件的得分
            int docID = scoreDoc.doc;//文件的id值

            Document document = indexSearcher.doc(docID);
            String id = document.get("id");
            String title = document.get("title");
            String content = document.get("content");
            System.out.println("得分:"+score+" "+id+" "+title+" "+content);
        }

    }

2.8.2 萬用字元查詢: wildCardQuery

//萬用字元查詢
    //?: 表示的是一個佔位符
    //*: 表示的佔位0到多個
    @Test
    public void wildCardQueryToLucene() throws IOException {

        WildcardQuery query = new WildcardQuery(new Term("content","藍瘦香菇*"));

        baseQuery(query);
    }

2.8.3 模糊查詢 fuzzyQuery

 /**
     * 模糊查詢: 最大的編輯次數 2
     *      編輯: 替換, 刪除, 修改  只要在2次之內能夠還原成詞條中的內容就可以被查詢到
     *      編輯的次數: 0~2之間, 預設就是2
     *      
     * @throws IOException
     */
    @Test
    public void fuzzyQueryToLucene() throws IOException {
        FuzzyQuery query = new FuzzyQuery(new Term("content","lucen"),2);
        baseQuery(query);
    }

2.8.4 數字範圍查詢 NumericRangeQuery

    //數字範圍查詢

    /**
     * 引數1: 查詢的欄位
     *      注意: 此處欄位的資料型別必須要和NumericRangeQuery的泛型保持一致
     * 引數2: 最小值
     * 引數3: 最大值
     * 引數4: 是否包含最小值
     * 引數5: 是否包含最大值
     * @throws IOException
     */
    @Test
    public void numQueryToLucene() throws IOException {
        NumericRangeQuery<Long> numericRangeQuery = NumericRangeQuery.newLongRange("id",0L,3L,false,false);

        baseQuery(numericRangeQuery);
    }

2.8.5 組合查詢: BooleanQuery

    //組合查詢: BooleanQuery

    /**BooleanQuery: 本身自己沒有任何的條件的
     *
     * MUST: 必須, 此條件必須存在的  求交集
     * SHOULD: 可以存在也可以不存在, 如果有資料, 就顯示, 如果沒資料, 就不顯示  多個條件的並集
     * MUST_NOT: 表示的查詢的結果中必須不包含此條件的內容  求的差集
     * @throws IOException
     */
    @Test
    public void booleanQueryToLucene() throws IOException {
        BooleanQuery booleanQuery = new BooleanQuery();

        NumericRangeQuery<Long> numericRangeQuery = NumericRangeQuery.newLongRange("id",0L,3L,true,true);
        booleanQuery.add(numericRangeQuery, BooleanClause.Occur.MUST);//第一個條件, 建議使用必須的條件

        TermQuery query = new TermQuery(new Term("content","程式設計師"));
        booleanQuery.add(query, BooleanClause.Occur.MUST_NOT);
        baseQuery(booleanQuery);
    }

3. lucene的高階

3.1 lucene的高亮

高亮: 本質上就是給關鍵詞的兩邊添加了高亮的標籤,類似於css樣式,或者html

public class HighlighterToLucene {

    public static void main(String[] args) throws Exception {
        //1. 建立查詢物件
        IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File("f:\\index"))));

        //2. 執行查詢
        TermQuery termQuery = new TermQuery(new Term("content","程式設計師"));
        //高亮設定 --------------start-----------------
        SimpleHTMLFormatter formatter = new 
            
           

相關推薦

爬蟲Lucene

搜尋引擎: * 什麼是搜尋引擎 * 搜尋引擎基本執行原理 * 原始資料庫做搜尋有什麼弊端 * 倒排索引(敲黑板) lucene lucene相關的概念 lucene和solr的關係 lucene入門程式(寫入索引的操作程式碼)

爬蟲Urllib庫詳解

lib lwp ces lin 設置 內置 col http測試 url 什麽是Urllib: python內置的HTTP請求庫 urllib.request : 請求模塊 urllib.error : 異常處理模塊 urllib.parse: url解析模塊 urllib

Python爬蟲爬蟲獲取資料儲存到檔案

接上一篇文章:Python爬蟲(一):編寫簡單爬蟲之新手入門 前言: 上一篇文章,我爬取到了豆瓣官網的頁面程式碼,我在想怎樣讓爬取到的頁面顯示出來呀,爬到的資料是html頁面程式碼,不如將爬取到的程式碼儲存到一個檔案中,檔案命名為html格式,那直接開啟這個檔案就可以在瀏覽器上看到爬取資料的

[Python]網路爬蟲利用urllib2通過指定的URL抓取網頁內容

版本號:Python2.7.5,Python3改動較大,各位另尋教程。 所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。  類似於使用程式模擬IE瀏覽器的功能,把URL作為HTTP請求的內容傳送到伺服器端, 然後讀取伺服器端的響應資源。 在

Python爬蟲Scrapy框架的配置安裝

Windows安裝方式 預設支援Python2、Python3,通過pip安裝Csrapy框架: pip install Scrapy Ubuntu(9.10以上版本)安裝方式 預設支援Python2、Python3,通過pip安裝Csrapy框架: sud

python手記requests寫爬蟲bs4處理文字資料

人生無趣且不易,一起找點樂子吧。歡迎評論,和文章無關的也可以。       上篇介紹了requests的基本用法,最後我們獲得了網頁的原始碼,並將其存到了文字中: 但是,我們需要的並不是全部的程式碼,我們需要的是文章的那一部分。其實requ

【網路爬蟲】【java】微博爬蟲如何抓取HTML頁面及HttpClient使用

一、寫在前面         上篇文章以網易微博爬蟲為例,給出了一個很簡單的微博爬蟲的爬取過程,大概說明了網路爬蟲其實也就這麼回事,或許初次看到這個例子覺得有些複雜,不過沒有關係,上篇文章給的例子只是讓大家對爬蟲過程有所瞭解。接下來的系列裡,將一步一步地剖析每個過程。 現

[Python]網路爬蟲利用urllib通過指定的URL抓取網頁內容

1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=F

Python爬蟲Requests庫

所謂爬蟲就是模擬客戶端傳送網路請求,獲取網路響應,並按照一定的規則解析獲取的資料並儲存的程式。要說 Python 的爬蟲必然繞不過 Requests 庫。 1 簡介 對於 Requests 庫,官方文件是這麼說的: Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。 警告

Python 爬蟲實戰使用 requests-html

分享 -html 調用 交流 html 技術 python-re find 自己的 Python 爬蟲實戰(一):使用 requests 和 BeautifulSoup,我們使用了 requests 做網絡請求,拿到網頁數據再用 BeautifulSoup 解析,就在前不久

scrapy爬蟲框架建立一個scrapy爬蟲

在建立新的scrapy爬蟲之前,我們需要先了解一下建立一個scrapy爬蟲的基本步驟 一、確定要爬取的資料 以爬取豆瓣電影資料為例: 每部電影所要爬取的資訊有: 片名:《頭號玩家》 導演: 史蒂文·斯皮爾伯格 編劇: 扎克·佩恩 / 恩斯特·克萊

python網路爬蟲web spider系統化整理總結爬蟲python程式碼示例(兩種響應格式json和html)

        上一篇部落格(入門知識篇),對爬蟲有了一個基本的瞭解,但是具體怎麼實現一個爬蟲程式呢?         一般情況下,我們在瀏覽器獲取資訊,是

爬蟲入門系列優雅的HTTP庫requests

爬蟲入門系列目錄: urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相關的 Python 模組,看名字就覺得很反人類,更糟糕的是這些模組在 Python2 與 Python3 中有很大的差異,如果業務程式碼要同時相容 2 和 3,寫起來

Python爬蟲開發整站爬蟲與Web挖掘

0×00 介紹 在網際網路這個複雜的環境中,搜尋引擎本身的爬蟲,出於個人目的的爬蟲,商業爬蟲肆意橫行,肆意掠奪網上的或者公共或者私人的資源。顯然資料的收集並不是為所欲為,有一些協議或者原則還是需要每一個人注意。本文主要介紹關於爬蟲的一些理論和約定協議,然後相對完整完成一個爬蟲的基本功能。 本

開發一款開源爬蟲框架系列設計爬蟲架構

  既然是構建分散式爬蟲架構,分散式說明爬蟲能在多臺機器同時執行,所以一定是多客戶端的,客戶端主要用於下載網頁,內容會放入佇列,多客戶端就有可能執行在不同的作業系統不同的語言環境,所以我們讓它暫時支援java和scala兩種依賴jvm的語言,不用區分平臺。提到客戶端也一定意味著有服務端的存在,服務端主要用於解

2 Lucene筆記建立LuceneUtils工具

publicclass LuceneUtils { public LuceneUtils() {} private static Directory directory; private static Version versio

Lucene 學習使用IK Analyzer中文分詞

import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Fie

Python3爬蟲從入門到自殘HTML及其解析

一.HTML標記語言基礎 要從網頁中抽取資料出來,那麼瞭解HTML標記語言是很重要的,但是這個系列的部落格並不是要專門講HTML的,所以,不會講過多的HTML的細節.對於很熟悉HTML的人就不說啦,對於不熟悉HTML語言的同學,這裡推薦一個教程,精簡,方便查閱.

python爬蟲系列標準庫的使用A

(一)Py2和Py3中的基本庫使用的區分 Urllib庫是python中的一個功能強大的,用於操作URL。python2和python3中用法基本相同,但是。python2中分為urllib和urllib2庫。下面列出常見的變化有: 1.python2.x使

小白學 Python 爬蟲3前置準備Linux基礎入門

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 Linux 基礎 CentOS 官網: https://www.centos.org/ 。 CentOS 官方下載連結: https://www.cent