中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java之網絡爬蟲介紹

發布時間:2020-07-21 18:05:11 來源:網絡 閱讀:587 作者:沙漏半杯 欄目:編程語言

一、網絡爬蟲基本介紹

1. 什么是網絡爬蟲

??網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。

2. 常見問題介紹

爬蟲可以爬取ajax信息么?
??網頁上有一些異步加載的數據,爬取這些數據有兩種方法:使用模擬瀏覽器,或者分析ajax的http請求,自己生成ajax請求的url,獲取返回的數據。如果是自己生成ajax請求,使用開源爬蟲的意義在哪里?其實是要用開源爬蟲的線程池和URL管理功能(比如斷點爬取)。
??如果我已經可以生成我所需要的ajax請求(列表),如何用這些爬蟲來對這些請求進行爬取?
??爬蟲往往都是設計成廣度遍歷或者深度遍歷的模式,去遍歷靜態或者動態頁面。爬取ajax信息屬于deep web(深網)的范疇,雖然大多數爬蟲都不直接支持。但是也可以通過一些方法來完成。比如WebCollector使用廣度遍歷來遍歷網站。爬蟲的第一輪爬取就是爬取種子集合(seeds)中的所有url。簡單來說,就是將生成的ajax請求作為種子,放入爬蟲。用爬蟲對這些種子,進行深度為1的廣度遍歷(默認就是廣度遍歷)。

爬蟲支持多線程么、爬蟲能用代理么、爬蟲會爬取重復數據么、爬蟲能爬取JS生成的信息么?
??能不能爬js生成的信息和爬蟲本身沒有太大關系。爬蟲主要是負責遍歷網站和下載頁面。爬js生成的信息和網頁信息抽取模塊有關,往往需要通過模擬瀏覽器(htmlunit,selenium)來完成。這些模擬瀏覽器,往往需要耗費很多的時間來處理一個頁面。所以一種策略就是,使用這些爬蟲來遍歷網站,遇到需要解析的頁面,就將網頁的相關信息提交給模擬瀏覽器,來完成JS生成信息的抽取。

爬蟲怎么保存網頁的信息?
??有一些爬蟲,自帶一個模塊負責持久化。比如webmagic,有一個模塊叫pipeline。通過簡單地配置,可以將爬蟲抽取到的信息,持久化到文件、數據庫等。還有一些爬蟲,并沒有直接給用戶提供數據持久化的模塊。比如crawler4j和webcollector。讓用戶自己在網頁處理模塊中添加提交數據庫的操作。至于使用pipeline這種模塊好不好,就和操作數據庫使用ORM好不好這個問題類似,取決于你的業務。

爬蟲怎么爬取要登陸的網站?
??這些開源爬蟲都支持在爬取時指定cookies,模擬登陸主要是靠cookies。至于cookies怎么獲取,不是爬蟲管的事情。你可以手動獲取、用http請求模擬登陸或者用模擬瀏覽器自動登陸獲取cookie。

爬蟲怎么抽取網頁的信息?
??開源爬蟲一般都會集成網頁抽取工具。主要支持兩種規范:CSS SELECTOR和XPATH。至于哪個好,這里不評價。

明明代碼寫對了,爬不到數據,是不是爬蟲有問題,換個爬蟲能解決么?
??如果代碼寫對了,又爬不到數據,換其他爬蟲也是一樣爬不到。遇到這種情況,要么是網站把你封了,要么是你爬的數據是javascript生成的。爬不到數據通過換爬蟲是不能解決的。

爬蟲速度怎么樣?
??單機開源爬蟲的速度,基本都可以講本機的網速用到極限。爬蟲的速度慢,往往是因為用戶把線程數開少了、網速慢,或者在數據持久化時,和數據庫的交互速度慢。而這些東西,往往都是用戶的機器和二次開發的代碼決定的。

爬蟲被網站封了怎么辦?
??爬蟲被網站封了,一般用多代理(隨機代理)就可以解決。但是這些開源爬蟲一般沒有直接支持隨機代理ip的切換。

二、java常見爬蟲框架介紹

1. Apache Nutch

(1)是否支持分布式:是
(2)可擴展性:中。Apache Nutch并不是一個可擴展性很強的爬蟲,它是一個專門為搜索引擎定制的網絡爬蟲,雖然Apache Nutch具有一套強大的插件機制,但通過定制插件并不能修改爬蟲的遍歷算法、去重算法和爬取流程。
(3)適用性:Apache Nutch是為搜索引擎定制的爬蟲,具有一套適合搜索引擎的URL維護機制(包括URL去重、網頁更新等),但這套機制并不適合目前大多數的精抽取業務(即結構化數據采集)。
(4)上手難易度:難。需要使用者熟悉網絡爬蟲原理、hadoop開發基礎及linux shell,且需要熟悉Apache Ant

2. WebCollector

(1)可擴展性:強
(2)適用性:WebCollector適用于精抽取業務。
(3)上手難易度:簡單

3. WebMagic

(1)是否支持分布式:否
(2)可擴展性:強
(3)適用性:WebMagic適用于精抽取業務。
(4)上手難易度:簡單。

4. Crawler4j

(1) 是否支持分布式:否
(2)可擴展性:低。Crawler4j實際上是一個單機版的垂直爬蟲,其遍歷算法是一種類似泛爬的算法,雖然可以添加一些限制,但仍不能滿足目前大部分的精抽取業務。另外,Crawler4j并沒有提供定制http請求的接口,因此Crawler4j并不適用于需要定制http請求的爬取業務(例如模擬登陸、多代理切換)。
(3)上手難易度:簡單

三、WebCollector實戰

1. WebCollector與傳統網絡爬蟲的區別

??傳統的網絡爬蟲傾向于整站下載,目的是將網站內容原樣下載到本地,數據的最小單元是單個網頁或文件。而WebCollector可以通過設置爬取策略進行定向采集,并可以抽取網頁中的結構化信息。

2. WebCollector與HttpClient、Jsoup的區別

??WebCollector是爬蟲框架,HttpClient是Http請求組件,Jsoup是網頁解析器(內置了Http請求功能)。
一些程序員在單線程中通過迭代或遞歸的方法調用HttpClient和Jsoup進行數據采集,這樣雖然也可以完成任務,但存在兩個較大的問題:
(1)單線程速度慢,多線程爬蟲的速度遠超單線程爬蟲。
(2)需要自己編寫任務維護機制。這套機制里面包括了URL去重、斷點爬取(即異常中斷處理)等功能。
WebCollector框架自帶了多線程和URL維護,用戶在編寫爬蟲時無需考慮線程池、URL去重和斷點爬取的問題。

3. WebCollector能夠處理的量級

??WebCollector目前有單機版和Hadoop版(WebCollector-Hadoop),單機版能夠處理千萬級別的URL,對于大部分的精數據采集任務,這已經足夠了。WebCollector-Hadoop能夠處理的量級高于單機版,具體數量取決于集群的規模。

4. WebCollector的遍歷

??WebCollector采用一種粗略的廣度遍歷,但這里的遍歷與網站的拓撲樹結構沒有任何關系,用戶不需要在意遍歷的方式。
??網絡爬蟲會在訪問頁面時,從頁面中探索新的URL,繼續爬取。WebCollector為探索新URL提供了兩種機制,自動解析和手動解析。

5. 代碼實戰

maven引入依賴

   <dependencies>
        <dependency>
            <groupId>cn.edu.hfut.dmic.webcollector</groupId>
            <artifactId>WebCollector</artifactId>
            <version>2.73-alpha</version>
        </dependency>
    </dependencies>

自動解析

import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;import cn.edu.hfut.dmic.webcollector.model.Page;import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;public class AutoNewsCrawler extends BreadthCrawler {    public AutoNewsCrawler(String crawlPath, boolean autoParse) {        super(crawlPath, autoParse);        this.addSeed("http://news.hfut.edu.cn/list-1-1.html");//種子頁面,起始頁面

        //正則規則設置 尋找符合http://news.hfut.edu.cn/show-xxxxxxhtml的url
        this.addRegex("http://news.hfut.edu.cn/show-.*html");        this.addRegex("-.*\\.(jpg|png|gif).*");        //不要爬取包含 #的URL
        this.addRegex("-.*#.*");

        setThreads(50);//線程數

        getConf().setTopN(100);//設置每次迭代中爬取數量的上限

            //設置是否為斷點爬取,如果設置為false,任務啟動前會清空歷史數據。
            //如果設置為true,會在已有crawlPath(構造函數的第一個參數)的基礎上繼
            //續爬取。對于耗時較長的任務,很可能需要中途中斷爬蟲,也有可能遇到
            //死機、斷電等異常情況,使用斷點爬取模式,可以保證爬蟲不受這些因素
            //的影響,爬蟲可以在人為中斷、死機、斷電等情況出現后,繼續以前的任務
            //進行爬取。斷點爬取默認為false*///        setResumable(true);
    }    /*
        visit函數定制訪問每個頁面時所需進行的操作
    */
    @Override
    public void visit(Page page, CrawlDatums next) {
        String url = page.url();        //如果頁面地址如何我們要求
        if (page.matchUrl("http://news.hfut.edu.cn/show-.*html")) {

            String title = page.select("div[id=Article]>h3").first().text();//獲取url標題

            String content = page.selectText("div#artibody");

            System.out.println("URL:\n" + url);//地址

            System.out.println("title:\n" + title);//標題

            System.out.println("content:\n" + content);//內容

                        /*如果你想添加新的爬取任務,可以向next中添加爬取任務,
               這就是上文中提到的手動解析*/
            /*WebCollector會自動去掉重復的任務(通過任務的key,默認是URL),
              因此在編寫爬蟲時不需要考慮去重問題,加入重復的URL不會導致重復爬取*/
            /*如果autoParse是true(構造函數的第二個參數),爬蟲會自動抽取網頁中符合正則規則的URL,
              作為后續任務,當然,爬蟲會去掉重復的URL,不會爬取歷史中爬取過的URL。
              autoParse為true即開啟自動解析機制*/
            //next.add("http://xxxxxx.com");
        }
    }    public static void main(String[] args) throws Exception {

        AutoNewsCrawler crawler = new AutoNewsCrawler("crawl", true);

        crawler.start(4);//啟動爬蟲
    }

}

運行接入如下所示:

 

java之網絡爬蟲介紹

手動解析

import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;import cn.edu.hfut.dmic.webcollector.model.Page;import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;public class ManualNewsCrawler extends BreadthCrawler {    public ManualNewsCrawler(String crawlPath, boolean autoParse) {        super(crawlPath, autoParse);        /*add 10 start pages and set their type to "list"
          "list" is not a reserved word, you can use other string instead
         */
        for(int i = 1; i <= 10; i++) {            this.addSeed("http://news.hfut.edu.cn/list-1-" + i + ".html", "list");//種子頁面,起始頁面
        }

        setThreads(50);//線程數

        getConf().setTopN(100);//設置每次迭代中爬取數量的上限

        //設置是否為斷點爬取,如果設置為false,任務啟動前會清空歷史數據。
        //如果設置為true,會在已有crawlPath(構造函數的第一個參數)的基礎上繼
        //續爬取。對于耗時較長的任務,很可能需要中途中斷爬蟲,也有可能遇到
        //死機、斷電等異常情況,使用斷點爬取模式,可以保證爬蟲不受這些因素
        //的影響,爬蟲可以在人為中斷、死機、斷電等情況出現后,繼續以前的任務
        //進行爬取。斷點爬取默認為false*///        setResumable(true);
    }    /*
       visit函數定制訪問每個頁面時所需進行的操作
    * */
    @Override
    public void visit(Page page, CrawlDatums next) {
        String url = page.url();        if (page.matchType("list")) {

            next.add(page.links("div[class=' col-lg-8 '] li>a")).type("content");

        }else if(page.matchType("content")) {            /*if type is "content"*/
            /*extract title and content of news by css selector*/
            String title = page.select("div[id=Article]>h3").first().text();
            String content = page.selectText("div#artibody", 0);            //read title_prefix and content_length_limit from configuration
            title = getConf().getString("title_prefix") + title;
            content = content.substring(0, getConf().getInteger("content_length_limit"));

            System.out.println("URL:\n" + url);
            System.out.println("title:\n" + title);
            System.out.println("content:\n" + content);
        }

    }    public static void main(String[] args) throws Exception {
        ManualNewsCrawler crawler = new ManualNewsCrawler("crawl", false);

        crawler.getConf().setExecuteInterval(5000);

        crawler.getConf().set("title_prefix","PREFIX_");
        crawler.getConf().set("content_length_limit", 20);

        crawler.start(4);//啟動爬蟲
    }

}

運行結果如下圖所示:

 

java之網絡爬蟲介紹


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莱阳市| 镇沅| 禄丰县| 呼图壁县| 达尔| 南江县| 上杭县| 崇礼县| 中宁县| 北碚区| 湘乡市| 通渭县| 峡江县| 罗定市| 温泉县| 报价| 石狮市| 珠海市| 堆龙德庆县| 宜兴市| 金溪县| 甘南县| 齐河县| 台州市| 兰考县| 镇江市| 迭部县| 弥勒县| 乳山市| 故城县| 文山县| 红安县| 杭锦旗| 哈密市| 南昌县| 义乌市| 察隅县| 马鞍山市| 黄龙县| 章丘市| 永福县|