java爬蟲-簡單爬取網頁圖片

  剛剛接觸到“爬蟲”這個詞的時候是在大一,那時候什么都不明白,但知道了百度、谷歌他們的搜索引擎就是個爬蟲。

現在大二。再次燃起對爬蟲的熱愛,查閱資料,知道常用java、python語言編程,這次我選擇了java。在網上查找的

代碼在本地跑大部分都不能使用,查找相關的資料教程也沒有適合的。實在頭疼、、、

  現在自己寫了一個簡單爬取網頁圖片的代碼,先分析一下自己寫的代碼吧

            //獲得html文本內容String HTML = cm.getHtml(URL);//獲取圖片標簽List<String> imgUrl = cm.getImageUrl(HTML);//獲取圖片src地址List<String> imgSrc = cm.getImageSrc(imgUrl);//下載圖片cm.Download(imgSrc);

  簡單分為四個功能方法(函數),首先是要獲取html文本

 //獲取HTML內容private String getHtml(String url)throws Exception{URL url1=new URL(url);//使用java.net.URLURLConnection connection=url1.openConnection();//打開鏈接InputStream in=connection.getInputStream();//獲取輸入流InputStreamReader isr=new InputStreamReader(in);//流的包裝BufferedReader br=new BufferedReader(isr);String line;StringBuffer sb=new StringBuffer();while((line=br.readLine())!=null){//整行讀取sb.append(line,0,line.length());//添加到StringBuffer中sb.append('\n');//添加換行符
        }//關閉各種流,先聲明的后關閉
        br.close();isr.close();in.close();return sb.toString();}

然后在獲取的html文本中尋找圖片,根據html標記語言不難發現圖片通常帶有<img>,所以

寫一個關于img的正則表達式

    // 獲取img標簽正則private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";

接著是獲取img標簽信息,大部分涉及的是集合接口和正則表達式的知識

//獲取ImageUrl地址private List<String> getImageUrl(String html){Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);List<String>listimgurl=new ArrayList<String>();while (matcher.find()){listimgurl.add(matcher.group());}return listimgurl;}

然后獲取img標簽信息中找取圖片的地址信息,需要構造圖片地址的正則表達式

// 獲取src路徑的正則private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";

接著是獲取圖片地址的信息,大部分涉及的也是集合接口和正則表達式的知識

//獲取ImageSrc地址private List<String> getImageSrc(List<String> listimageurl){List<String> listImageSrc=new ArrayList<String>();for (String image:listimageurl){Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);while (matcher.find()){listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));}}return listImageSrc;}

最后通過圖片地址信息下載圖片

//下載圖片private void Download(List<String> listImgSrc) {try {//開始時間Date begindate = new Date();for (String url : listImgSrc) {//開始時間Date begindate2 = new Date();String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());URL uri = new URL(url);InputStream in = uri.openStream();FileOutputStream fo = new FileOutputStream(new File("src/res/"+imageName));//文件輸出流byte[] buf = new byte[1024];int length = 0;System.out.println("開始下載:" + url);while ((length = in.read(buf, 0, buf.length)) != -1) {fo.write(buf, 0, length);}//關閉流
                in.close();fo.close();System.out.println(imageName + "下載完成");//結束時間Date overdate2 = new Date();double time = overdate2.getTime() - begindate2.getTime();System.out.println("耗時:" + time / 1000 + "s");}Date overdate = new Date();double time = overdate.getTime() - begindate.getTime();System.out.println("總耗時:" + time / 1000 + "s");} catch (Exception e) {System.out.println("下載失敗");}}    

展示一下運行結果:

?

上一下全部代碼:

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Main {// 地址private static final String URL = "http://www.tooopen.com/view/1439719.html";// 獲取img標簽正則private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";// 獲取src路徑的正則private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";public static void main(String[] args) {try {Main cm=new Main();//獲得html文本內容String HTML = cm.getHtml(URL);//獲取圖片標簽List<String> imgUrl = cm.getImageUrl(HTML);//獲取圖片src地址List<String> imgSrc = cm.getImageSrc(imgUrl);//下載圖片
            cm.Download(imgSrc);}catch (Exception e){System.out.println("發生錯誤");}}//獲取HTML內容private String getHtml(String url)throws Exception{URL url1=new URL(url);URLConnection connection=url1.openConnection();InputStream in=connection.getInputStream();InputStreamReader isr=new InputStreamReader(in);BufferedReader br=new BufferedReader(isr);String line;StringBuffer sb=new StringBuffer();while((line=br.readLine())!=null){sb.append(line,0,line.length());sb.append('\n');}
        br.close();isr.close();in.close();return sb.toString();}//獲取ImageUrl地址private List<String> getImageUrl(String html){Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);List<String>listimgurl=new ArrayList<String>();while (matcher.find()){listimgurl.add(matcher.group());}return listimgurl;}//獲取ImageSrc地址private List<String> getImageSrc(List<String> listimageurl){List<String> listImageSrc=new ArrayList<String>();for (String image:listimageurl){Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);while (matcher.find()){listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));}}return listImageSrc;}//下載圖片private void Download(List<String> listImgSrc) {try {//開始時間Date begindate = new Date();for (String url : listImgSrc) {//開始時間Date begindate2 = new Date();String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());URL uri = new URL(url);InputStream in = uri.openStream();FileOutputStream fo = new FileOutputStream(new File("src/res/"+imageName));byte[] buf = new byte[1024];int length = 0;System.out.println("開始下載:" + url);while ((length = in.read(buf, 0, buf.length)) != -1) {fo.write(buf, 0, length);}in.close();fo.close();System.out.println(imageName + "下載完成");//結束時間Date overdate2 = new Date();double time = overdate2.getTime() - begindate2.getTime();System.out.println("耗時:" + time / 1000 + "s");}Date overdate = new Date();double time = overdate.getTime() - begindate.getTime();System.out.println("總耗時:" + time / 1000 + "s");} catch (Exception e) {System.out.println("下載失敗");}}
}

  本人還是java初學者,能力有限,如有更好的代碼或者教程可以留言,我們可以交流學習。
以上還有不足或者不對之處請指出,非常感謝個位。

轉載于:https://www.cnblogs.com/jinxiaohang/p/6637209.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

擴展方法必須在非泛型靜態類中定義

擴展方法必須在非泛型靜態類中定義&#xff1a;public class CustomerHelperClass{public static MvcHtmlString CreateImage(string p_w_picpathSource, string altText, string width, string height){//通過TagBulider創建標簽TagBuilder p_w_picpathTag new TagBuilder(&…

Windows Server 2016-圖形化遷移FSMO角色

上章節我們簡單介紹了三種不同方式查看FSMO主機角色信息&#xff0c;在開篇之前我們簡單回顧一下FSMO五種操作主機角色&#xff1a;林范圍操作主機角色有兩種&#xff0c;分別是 架構主機角色&#xff08;Schema Master&#xff09;和 域命名主機角色&#xff08;Domain Naming…

C# WPF設備監控軟件(經典)-下篇

上節已經對本軟件的功能和意圖進行了詳細講解&#xff0c;這節就不再啰嗦&#xff0c;本節主要對功能實現和代碼部分展開講解.01—前臺代碼前臺XAML:<Window x:Class"EquipmentMonitor.EquipmentView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pr…

[轉]互聯網最大謠言:程序員35歲必淘汰?今天我就來擊碎他

朋友&#xff0c;只要你是程序員&#xff0c;你一定知道996和“程序員35歲必死”的言論。 這兩個話題在互聯網上的討論一次比一次激烈。 996工作制&#xff0c;眾所周知&#xff0c;每天早上9點到崗&#xff0c;一直待到晚上9點&#xff0c;每周工作6天&#xff0c;很多互聯網公…

【ArcGIS微課1000例】0057:將多波段柵格(影像.tif)背景設置為無數據nodata的方法

本文講解將多波段柵格(影像.tif)背景設置為無數據nodata的方法。 文章目錄 一、背景值識別二、背景值去除【推薦閱讀】: 【ArcGIS微課1000例】0056:將單波段柵格背景設置為無數據NoData的方法 一、背景值識別 可以用【識別】工具來獲取影像數據的背景值。 在背景上單擊,…

華為HCIA認證H12-811題庫新增

801、[單選題]178/832、在系統視圖下鍵入什么命令可以切換到用戶視圖? A quit B souter C system-view D user-view 試題答案&#xff1a;A 試題解析&#xff1a;在系統視圖下鍵入quit命令退出到用戶視圖。因此答案選A。 802、[單選題]“網絡管理員在三層交換機上創建了V…

經典Java微服務架構教程 微服務從開發到部署

圖書目錄腦圖&#xff1a; 本書根據開源項目整理&#xff0c;由于原在線文檔無法正常使用&#xff0c;本人重新在Github上重新布署了一套在線文檔。 書中講解非常詳細&#xff0c;并且有在線的視頻教程&#xff0c;另有在線文檔和在線的源碼。 書中的代碼由于PDF排版問題可能顯…

linux下redis安裝

轉自&#xff1a;http://blog.java1234.com/blog/articles/311.html Redis從一開始就只支持Linux&#xff0c;后面雖然有團隊搞出Window版本&#xff0c;但是我還是建議大伙安裝到Linux中。 準備工作 &#xff08;wm VirtualBox&#xff09; VMware 以及Xshell https://redis…

cobbler koan自動重裝系統

介紹 koan是kickstart-over-a-network的縮寫&#xff0c;它是cobbler的客戶端幫助程序&#xff0c;koan允許你通過網絡提供虛擬機&#xff0c;也允許你重裝已經存在的客戶端。當運行時&#xff0c;koan會從遠端的cobbler server獲取安裝信息&#xff0c;然后根據獲取的安裝信息…

Quartz.NET simple_demo

Quartz.NET是一個開源的作業調度框架&#xff0c;非常適合在平時的工作中&#xff0c;定時輪詢數據庫同步&#xff0c;定時郵件通知&#xff0c;定時處理數據等。 Quartz.NET允許開發人員根據時間間隔&#xff08;或天&#xff09;來調度作業。它實現了作業和觸發器的多對多關系…

Hello Playwright:(9)執行 JavaScript 代碼

Playwright 提供了大量的 API 用于與頁面元素交互&#xff0c;但是在某些場景下還是不能完全滿足要求。比如我們需要獲得包括元素本身的 HTML&#xff0c;但是目前只有下列 API :InnerHTMLAsync 返回元素內的 HTML 內容InnerTextAsync 返回元素內的文本內容而使用 JavaScript 執…

【PhotoScan精品教程】photoscan無法啟動此程序,因為計算機中丟失cholmod.dll解決辦法

安裝完航測軟件photoscan&#xff0c;打開時提示&#xff1a;無法啟動此程序&#xff0c;因為計算機中丟失 cholmod.dll解決辦法。 錯誤提示&#xff1a; 解決辦法&#xff1a; 并不是缺少該動態鏈接庫文件&#xff0c;而是補丁文件拷貝錯了。

什么是中臺?企業為什么要建中臺?從數據中臺到AI中臺。

從去年開始&#xff0c;好像就有一只無形的手一直將我與“微服務”、“平臺化”、“中臺化”撮合在一起&#xff0c;給我帶來了很多的困擾和思考與收獲。 故事的開始源于去年的技術雷達峰會&#xff0c;我在會上做了一場關于平臺崛起的主題分享&#xff08;《The Rise of Plat…

老司機帶你重構Android的v4包的部分源碼

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。https://www.jianshu.com/p/a08d754944c4 轉載請標明出處&#xff1a;https://www.jianshu.com/p/a08d754944c4 本文出自 AWeiLoveAndroid的博客 【前言】過年回家忙著干活&#xff0c;忙著給親戚的孩…

.NET靜態代碼織入——肉夾饃(Rougamo) 發布1.1.0

肉夾饃是什么肉夾饃(https://github.com/inversionhourglass/Rougamo)通過靜態代碼織入方式實現AOP的組件。.NET常用的AOP有Castle DynamicProxy、AspectCore等&#xff0c;以上兩種AOP組件都是通過運行時生成一個代理類執行AOP代碼的&#xff0c;肉夾饃則是在代碼編譯時直接修…

Msys2 國內源(2017.3.30)

確定可用&#xff01; Server https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch轉載于:https://www.cnblogs.com/baud/p/6644887.html

基于 IdentityServer3 實現 OAuth 2.0 授權服務【密碼模式(Resource Owner Password Credentials)】...

密碼模式&#xff08;Resource Owner Password Credentials Grant&#xff09;中&#xff0c;用戶向客戶端提供自己的用戶名和密碼。客戶端使用這些信息&#xff0c;向"服務商提供商"索要授權。基于之前的 IdentityServer3 實現 OAuth 2.0 授權服務【客戶端模式(Clie…

【GlobalMapper精品教程】035:用CASS自帶數據創建高程地形、等高線教程

本文講述globalmapper用CASS自帶數據創建高程地形、等高線教程。 文章目錄 1. 坐標生成點2. 點轉高程格網3. 生成等高線4. 保存等高線CASS自帶等高線數據dgx.dat預覽:包含點號、編碼、東坐標、北坐標、高程5列,可以不用做任何修改,在Globalmapper中生成點。 1. 坐標生成點 …

SaaS產品的免費試用到底該怎么做

”SaaS產品的免費試用&#xff0c;絕不僅僅只是開放產品試用期這么簡單&#xff0c;很多企業并沒有重視免費試用模式的搭建和轉化路徑“ 很多SaaS廠商的產品都會提供免費試用的機會&#xff0c;雖然試用的最終目標是促成用戶為產品價值付費&#xff0c;但是很多SaaS廠商在開放系…

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現MVVM雙向綁定和依賴注入

前言&#xff1a;在C/S架構上&#xff0c;WPF無疑已經是“桌面一霸”了。在.NET生態環境中&#xff0c;很多小伙伴還在使用Winform開發C/S架構的桌面應用。但是WPF也有很多年的歷史了&#xff0c;并且基于MVVM的開發模式&#xff0c;受到了很多開發者的喜愛。并且隨著工業化的進…