使用HttpClient和Jsoup實現一個簡單爬蟲

來源:互聯網
上載者:User

標籤:瞭解   用戶端   stream   nod   return   tar   spi   java   cti   

一直很想瞭解一下爬蟲這個東西的,完全是出於興趣,其實剛開始是準備用python的,但是由於種種原因選擇了java,此處省略很多字... 總之,如果你想做一件事情的話就儘快去做吧,千萬不要把戰線拉得太長了,否則時間一長其實發現自己什麼都沒做... 拖延症就是這樣慢慢形成了。

在寫一個爬蟲以前需要瞭解一下HTTP協議的,通常的B/S程式都是用戶端請求、服務端響應這種模式,通過一個URL就能從伺服器上請求到一些資訊。而爬蟲就是用程式實現了這個過程,用程式發起一個HTTP請求,然後接收服務端的響應結果,然後就從這些響應中抽取出你想要的資訊。這裡介紹了使用HttpClient和Jsoup編寫的一個網路爬蟲,爬取了http://jandan.net/上的一些圖片,並且把圖片儲存到本地。

HttpClient

官網地址:http://hc.apache.org/httpclient-3.x/  這是apache上的一個項目,主要作用是發起一個Http請求,並且接收響應,並且可以設定逾時時間,比傳統Java中的API要方便很多。

Jsoup

官網地址:https://jsoup.org/ 雖然這是官方地址,但是卻是英文的,推薦看這裡http://www.open-open.com/jsoup/ 這裡是中文的文檔,看這裡就足夠使用這個工具了,主要用於解析響應的html,但是也可以使用Jsoup發起一個http請求,但是功能沒有HttpClient強大。所有一般是用HttpClient請求,Jsoup解析。

 

直接上代碼吧:這基本上是一個通用的類了,給定一個URL返回一個請求響應的html,並且設定了請求逾時的參數。

package spider.img.service;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.util.EntityUtils;/** * 2017-5-17 基礎類,通過URL返回一個響應的html *  * @author tom */public class AbstractSpider {    public static String getResult(String url) throws Exception {        try (CloseableHttpClient httpClient = HttpClientBuilder.create().build();                CloseableHttpResponse response = httpClient.execute(new HttpGetConfig(url))) {            String result = EntityUtils.toString(response.getEntity());            return result;        } catch (Exception e) {            System.out.println("擷取失敗");            return "";        }    }}/** * 內部類,繼承HttpGet,為了佈建要求逾時的參數 *  * @author tom * */class HttpGetConfig extends HttpGet {    public HttpGetConfig(String url) {        super(url);        setDefaulConfig();    }    private void setDefaulConfig() {        this.setConfig(RequestConfig.custom()                .setConnectionRequestTimeout(10000)                .setConnectTimeout(10000)                .setSocketTimeout(10000).build());        this.setHeader("User-Agent", "spider");    }}

 

爬取圖片:

package spider.img.service;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.URL;import java.net.URLConnection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;/** * 2017-5-17 爬取指定URL的圖片 *  * @author tom * */public class SpiderImgs {    public SpiderImgs(String url) throws Exception {        //擷取工具類返回的html,並用Jsoup解析        String result = AbstractSpider.getResult(url);        Document document = Jsoup.parse(result);        document.setBaseUri(url);        //擷取所有的img元素        Elements elements = document.select("img");        for (Element e : elements) {            //擷取每個src的絕對路徑            String src = e.absUrl("src");            URL urlSource = new URL(src);            URLConnection urlConnection = urlSource.openConnection();            String imageName = src.substring(src.lastIndexOf("/") + 1, src.length());            System.out.println(e.absUrl("src"));            //通過URLConnection得到一個流,將圖片寫到流中,並且建立檔案儲存            InputStream in = urlConnection.getInputStream();            OutputStream out = new FileOutputStream(new File("E:\\IDEA\\imgs\\", imageName));            byte[] buf = new byte[1024];            int l = 0;            while ((l = in.read(buf)) != -1) {                out.write(buf, 0, l);            }        }    }}

 

寫一個單元測試試一下:

package spider.img.service.test;import org.junit.Test;import spider.img.service.SpiderImgs;/** * 2017-5-17 單元測試 * @author tom */public class TestCase {    @Test    public void testGetResult() throws Exception{        SpiderImgs spider=new SpiderImgs("http://jandan.net/ooxx/page-60#comments");    }}

控制台輸出了一些東西,本地也儲存了圖片。

http://wx4.sinaimg.cn/mw600/0063qhYBgy1ffolz6oon2j30rs15o428.jpg
http://wx2.sinaimg.cn/mw600/0063qhYBgy1ffoiucdw5yj30xc0m9gpt.jpg
http://wx2.sinaimg.cn/mw600/0063qhYBgy1ffoivfcfpwj30xc0m9jt3.jpg
http://wx3.sinaimg.cn/mw600/0063qhYBgy1ffoiqgqqc0j30lc0w1402.jpg
http://wx3.sinaimg.cn/mw600/0063qhYBgy1ffoiqg5kz2j30hs0qogo7.jpg
http://wx4.sinaimg.cn/mw600/0063qhYBgy1ffoiqewsbej30go0l60wc.jpg
http://wx3.sinaimg.cn/mw600/0063qhYBgy1ffoiqdglc7j30lc0voq5k.jpg
http://wx4.sinaimg.cn/mw600/0063qhYBgy1ffoiqaz4dej30lc0w0gn6.jpg

 

使用HttpClient和Jsoup實現一個簡單爬蟲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.