InetAddress和爬蟲簡單應用(一)

勿以惡小而爲之,勿以善小而不爲--------------------------劉備
勸諸君,多行善事積福報,莫作惡

上一章簡單介紹了 多線程的鎖(六),如果沒有看過,請觀看上一章

網絡編程,是很重要的,一定要掌握的。

關於網絡編程,需要掌握 InetAddress 和 InetSocketAddress 等類。

一. InetAddress 類

InetAddress 是將主機名與ip地址進行關聯的類, 指的是哪一個主機。

一.一 方法

一.一.一 構造方法

一.一.一.一 方法

方法 作用
getByName​(String host) 根據主機名或者ip獲取主機
getLocalHost​() 獲取本機

一.一.一.二 演示

    @Test
    public void conTest(){

        //1. 根據主機名獲取
        try {
            InetAddress inetAddress=InetAddress.getByName("www.baidu.com");

            System.out.println("輸出ip:"+inetAddress.getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        // 百度的 ip 地址
        try {
            InetAddress inetAddress1=InetAddress.getByName("39.156.66.14");

            System.out.println("輸出名稱:"+inetAddress1.getHostName());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //獲取當地的

        try {

            //等價於  localhost ,獲取的並不是  127.0.0.1, 而是ipconfig的值

            InetAddress inetAddress2=InetAddress.getLocalHost();

            System.out.println("名稱:"+inetAddress2.getHostName());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

運行程序,控制檯打印輸出:

有圖片

一.一. 二 其他常用方法

方法 作用
String getHostAddress​() 獲取主機
boolean isReachable​(int timeout) 指定時間內是否可達

一.二 演示 InetAddress

  @Test
    public void methodTest() throws Exception{

        //獲取當地的
        InetAddress inetAddress=InetAddress.getLocalHost();

        System.out.println("輸出主機名:"+inetAddress.getHostName());

        System.out.println("輸出主機地址:"+inetAddress.getHostAddress());

        System.out.println("完全限定域名:"+inetAddress.getCanonicalHostName());


        //在指定的時間內是否可達
        System.out.println("判斷是否可達:"+inetAddress.isReachable(200));

        //yuezl/192.168.190.1
        System.out.println("ip地址:"+inetAddress.toString());
    }

運行程序,控制檯打印輸出:

有圖片

二. InetSocketAddress 類

指出 具體的哪個主機的哪個端口

二.一 方法

二.一.一 構造方法

二.一.一.一 方法

方法 作用
InetSocketAddress​(String hostname, int port) 傳入主機名和端口號
InetSocketAddress​(InetAddress addr, int port) 傳入 inetAddress對象和端口號
靜態方法獲取對象
static InetSocketAddress createUnresolved​(String host, int port) 從主機名和端口號創建未解析的套接字地址。

二.一.一.二 演示

 @Test
    public void conTest(){

        //放置主機名和端口
        InetSocketAddress inetSocketAddress=new InetSocketAddress("localhost",999);

        //第二種方式
        InetAddress inetAddress= null;
        try {
            inetAddress = InetAddress.getByName("localhost");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        InetSocketAddress inetSocketAddress1=new InetSocketAddress(inetAddress,999);

        //3. 通過靜態方法獲取

        InetSocketAddress inetSocketAddress2=InetSocketAddress.createUnresolved("localhost",999);

    }

二.一.二 其他常用方法

方法 作用
String getHostName​() 獲取主機名
int getPort​() 獲取端口號
InetAddress getAddress​() 獲取 inetAddress對象

二.二 演示 InetSocketAddress

  @Test
    public void methodTest() throws Exception{

        //1. 實例化本地的

        InetSocketAddress inetSocketAddress=new InetSocketAddress("localhost",999);

        //.獲取主機名

        System.out.println("主機名:"+inetSocketAddress.getHostName());

        System.out.println("獲取端口:"+inetSocketAddress.getPort());

        System.out.println("獲取 hostString:"+inetSocketAddress.getHostString());

        InetAddress inetAddress=inetSocketAddress.getAddress();

        System.out.println("判斷是否可達:"+inetAddress.isReachable(200));
    }

運行程序,控制檯打印輸出

有圖片

三. URL 類

指定網絡的具體的地址, 可以帶請求參數和描點,能夠精確的定位到地址。

三.一 方法

三.一.一 構造方法

三.一.一.一 方法

方法 作用
URL​(String spec) 直接傳入 url 字符串地址
URL​(String protocol, String host, int port, String file) 傳入協議,主機名,端口和具體的地址

三.一.一.二 演示


   @Test
    public void conTest(){

        try {
            //1. 第一種方式
            URL url=new URL("https://blog.csdn.net/yjltx1234csdn/article/details/105459342");


        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //2. 第二種

        try {
            URL url1=new URL("https","blog.csdn.net",80,"yjltx1234csdn/article/details/105459342");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

三.一.二 其他方法

方法 作用
String getProtocol​() 獲取協議名稱
String getHost​() 獲取主機
int getPort​() 獲取端口號,如果傳入了,則能獲取到,沒有傳入,則返回 -1
int getDefaultPort​() 獲取默認的端口號,如 80,21,443等
String getFile​() 獲取完整的路徑名
String getPath​() 只獲取路徑部分
String getQuery​() 獲取查詢參數部分
String getRef​() 獲取描點
文件流部分:
InputStream openStream​() 將該文件變成輸入流的形式
爬蟲部分:
URLConnection openConnection​() 變成 URLConnection 部分

三.二 演示 URL

三.二.一 RESTFUL 的地址形式

 @Test
    public void operTest() throws Exception{

        //1. 構造對象, restful 的形式
        URL url=new URL("https://blog.csdn.net/yjltx1234csdn/article/details/105459342");

        System.out.println("獲取協議:"+url.getProtocol());
        System.out.println("獲取主機:"+url.getHost());
        System.out.println("獲取端口:"+url.getPort());
        System.out.println("獲取默認端口:"+url.getDefaultPort());
        System.out.println("獲取地址:"+url.getFile());


        //變成流,讀取相應的文件信息. 注意,不一定所有的url都可以進行轉換。
        InputStream inputStream=url.openStream();

        int len=-1;
        byte[] bytes=new byte[1024];

        StringBuilder sb=new StringBuilder();
        while((len=inputStream.read(bytes))!=-1){

            String temp=new String(bytes,0,len);

            sb.append(temp);
        }
        System.out.println("文件內容是:\n"+sb.toString());

        //打開connection,關於 urlConnection,後面會講解
        URLConnection connection=url.openConnection();
    }

運行程序,查看控制檯輸出:

有圖片

能夠查詢出文件的內容信息。

三.二.二 正常的ur地址

  @Test
    public void oper1Test() throws Exception{
        URL url=new URL("https://www.baidu.com:80/TwoButterfly/index.html?uname=兩個蝴蝶飛&age=24#a");

        System.out.println("獲取路徑path:"+url.getPath()); ///TwoButterfly/index.html

        System.out.println("獲取查詢部分:"+url.getQuery()); //uname=兩個蝴蝶飛&age=24

        System.out.println("獲取描點:"+url.getRef()); //a

        System.out.println("獲取userInfo:"+url.getUserInfo());//null 

    }

運行程序,查看控制檯輸出:

有圖片

四. URLConnection類

程序與 url 進行通信, 是一個非常重要的類。

用 URLConnection 類,主要可以獲取網絡地址 url 的相應的信息, 可以模擬瀏覽器的訪問,達到爬蟲的目的。

四.一 方法

四.一.一 構造方法

四.一.一.一 方法

方法 作用
URLConnection openConnection​() 變成 URLConnection 部分

四.一.一.二 演示

@Test
    public void conTest() throws Exception{

        URL url=new URL("https://blog.csdn.net/yjltx1234csdn/article/details/105459342");

        //url 獲取的方法

        URLConnection urlConnection=url.openConnection();
    }

四.一.二 其他方法

方法 作用
String getContentEncoding​() 獲取編碼方式
String getContentType​() 獲取 content-type的值
void setConnectTimeout​(int timeout) 設置連接超時時間
void setRequestProperty​(String key, String value) 設置請求訪問的屬性,模擬瀏覽器訪問
InputStream getInputStream​() 獲取輸入流
OutputStream getOutputStream​() 獲取輸出流

四.二 演示URLConnection 爬蟲

四.二.一 爬取沒有設置禁止爬蟲的網址

   @Test
    public void pa1Test() throws Exception{
        URL url=new URL("https://www.jd.com");
       // URL url=new URL("https://www.dianping.com");

        InputStream inputStream=url.openStream();

        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

        String temp=null;

        while(null!=(temp=bufferedReader.readLine())){
            System.out.println(temp);
        }

        //關閉流
        bufferedReader.close();

        inputStream.close();

        
    }

運行程序,查看控制檯輸出

有圖片

如果不允許爬蟲,如 dianping 網的話,那麼會拋出異常

java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.dianping.com

四.二.二 模擬瀏覽器進行訪問爬取

    @Test
    public void pa2Test() throws Exception{

        URL url=new URL("https://www.dianping.com");
        //模擬瀏覽器,因爲瀏覽器可以訪問
        HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();

        //設置請求方式
        httpURLConnection.setRequestMethod("GET");
        //設置時間
        httpURLConnection.setReadTimeout(2000);

        //設置瀏覽器
        httpURLConnection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/77.0");

        //設置語言
        httpURLConnection.setRequestProperty("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,
en-US;q=0.3,en;q=0.2");

        InputStream inputStream=httpURLConnection.getInputStream();

        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

        String temp=null;

        while(null!=(temp=bufferedReader.readLine())){
            System.out.println(temp);
        }

        //關閉流
        bufferedReader.close();

        inputStream.close();


    }

運行程序,查看控制檯輸出打印

有圖片


謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章