精品久久久久久综合网-精品久久久久久中文字幕一区-精品久久久久久中文字幕2017-精品久久久久久中文-精品久久久久久影院免费-精品久久久久久免费影院

歡迎您的來訪!有源碼,好建站(www.jsxyx.com.cn)源碼海洋源碼網為您提供快速建站平臺.
當前位置: 首頁 > 行業資訊 > java資料 >

Java爬蟲實戰代碼

時間:2019-01-25 20:43來源:未知 作者:源碼海洋 點擊:
Java爬蟲實戰代碼 業務背景 大家在平時的生活或工作種多少都會遇到類似下面的情況吧 非技術人員: 我身邊有同學在一家裝修設計公司上班,她每天的工作就是去其他各大裝修平臺,去借鑒別人家設計師的創意,找到合適的圖片,就會一張張點擊圖片另存到自己電腦

 

Java爬蟲實戰代碼

 

業務背景

大家在平時的生活或工作種多少都會遇到類似下面的情況吧

非技術人員:

我身邊有同學在一家裝修設計公司上班,她每天的工作就是去其他各大裝修平臺,去“借鑒”別人家設計師的創意,找到合適的圖片,就會一張張點擊圖片另存到自己電腦中。

其實這些工作都是重復性且毫無技術含量,完全可以用工具自動化實現。

技術人員:

比如我喜歡看一些技術帖子(微信公總號,技術博客等),有時候會覺得文章中的一些技術原理、架構圖片非常直觀,為了方便下次鞏固這些技術,我一般都會把圖片保存下來。

如果圖片不多的話,一般有如下方法

1 點擊圖片另存為 (原圖像素還不錯) 
2 用手機拍照(像素不好)

如果要下載保存的圖片過多,通過以上兩種方式去抓取圖片,有兩個弊端

1 效率低下 
2 重復工作,浪費不必要的時間

作為一位懶惰的碼農,怎么可以把時間浪費在不需要腦力的事情上呢? 為了減少重復性的工作,便有了這篇文章,我這里寫的并不是很深入,只是提供一個思路,實現簡單從網頁中抓取所有圖片并重命名保存到電腦中;希望對大家有所幫助。

開發環境

  • jdk1.6&以上
  • Eclipse或Intellij idea
  • Maven

編碼

package com.xyq.maventest.util;  import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;  import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; 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.HttpClients; import org.apache.http.util.EntityUtils;   /**** *  * @ClassName: DownloadImageUtil  * @Description: 此類主要作用從一個網址上爬圖片,然后重命名保存到本地路徑中 * @author youqiang.xiong * @date 2018年2月26日 下午12:09:29  * */ public class DownloadImageUtil {      /***      * 請求的網址url常量      */     public static final String REQUEST_URL = "https://www.cnblogs.com/EasonJim/p/6919369.html";     /****      * 圖片保存路徑      */     public static final String IMAGE_SAVE_PATH = "C:\\Users\\youqiang.xiong\\Desktop\\image\\test";      /***      *  獲取img標簽正則表達式      */     public static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";       /****      * 獲取src路徑的正則        */     public static final String IMGSRC_REG = "(http|https):\"?(.*?)(\"|>|\\s+)";        public static String[] IMAGE_TYPE_SUFFIX = new String[]{"=png","=jpg","=jpeg",".png",".jpg","jpeg"};     /****      * 生成圖片的名稱默認從1開始遞增      */     public static Integer imageIndex = 1;       public static void main(String[] args) {          //第一步通過請求url解析出響應內容         String htmlContent = parseContext(REQUEST_URL);         //通過正則表達式匹配,取出data-src的圖片鏈接存放到list數組中         //<img class="" data-ratio="0.5993031358885017" data-src="https://mmbiz.qpic.cn/mmbiz_png/dkwuWwLoRK8POMmicDvKwHwYrqrG7KyiaCGBdaib7rOlRlCSfLqaecaXeJvyRGwZZyvmvL9YGiaicNlLs6jlLKaia1icA/640?wx_fmt=png" data-type="png" data-w="861" height="516" style="margin: auto;max-width: 80%;box-sizing: inherit;-webkit-tap-highlight-color: transparent;border-width: initial;border-style: none;border-color: initial;" width="861"  />         List<String> imageUrlList = getImageSrc(htmlContent);          for(String imageUrl:imageUrlList){             try {                 download(imageUrl, IMAGE_SAVE_PATH);             } catch (Exception e) {                 System.out.println(e.getMessage());             }         }          System.out.println("從【"+REQUEST_URL+"】網站,共抓取【"+(imageIndex-1)+"】張圖片。");     }        /***      * 解析圖片url路徑,保存到對應目錄下      * @param oldUrl 圖片鏈接url      * @param savePath 圖片報錯路徑      * @throws Exception      */     public static void download(String oldUrl,String savePath) throws Exception {          String imageType = "";         boolean flag = false;         for(String suffix:IMAGE_TYPE_SUFFIX){             if(oldUrl.lastIndexOf(suffix) > -1 || oldUrl.lastIndexOf(suffix.toUpperCase()) > -1){                 flag = true;                 imageType = suffix.replace("=", ".");                 break;             }         }         //圖片類型存在         if(flag){             String filename = String.valueOf(imageIndex) + imageType;             download(oldUrl, filename, savePath);             imageIndex ++ ;         }     }      /*****      * 根據圖片url路徑,下載到對應目錄下      * @param urlString 圖片url路徑      * @param filename  文件名稱      * @param savePath  文件報錯路徑      * @throws Exception      */     public static void download(String urlString, String filename, String savePath) throws Exception {          if(StringUtils.isEmpty(urlString) || StringUtils.isEmpty(filename) || StringUtils.isEmpty(savePath)){             throw new IllegalArgumentException("方法入參不能為空!");         }         //目錄如果不存在,則新增         File dir = new File(savePath);         if(!dir.exists() && dir.isDirectory()){             dir.mkdirs();         }         // 構造URL         URL url = new URL(urlString);         // 打開連接         URLConnection con = url.openConnection();         // 設置請求超時為5s         con.setConnectTimeout(5 * 1000);         // 輸入流         InputStream is = con.getInputStream();          // 1K的數據緩沖         byte[] bs = new byte[1024];         // 讀取到的數據長度         int len;         // 輸出的文件流         File sf = new File(savePath);         if (!sf.exists()) {             sf.mkdirs();         }         OutputStream os = new FileOutputStream(sf.getPath() + "/" + filename);         // 開始讀取         while ((len = is.read(bs)) != -1) {             os.write(bs, 0, len);         }         // 完畢,關閉所有鏈接         os.close();         is.close();     }        /****      * 通過httpclient,讀取url中的響應內容并返回       * @param url 請求的url路徑      * @return       */     public static String  parseContext(String url) {          if(StringUtils.isEmpty(url)){             throw new IllegalArgumentException("訪問地址url不能為空");         }          String html = null;         // 創建httpclient對象         CloseableHttpClient httpclient = HttpClients.createDefault();         try {             // 創建httpget對象             HttpGet httpGet = new HttpGet(url);             // 執行get請求.             CloseableHttpResponse response = httpclient.execute(httpGet);             try {                 // 獲取響應實體                 HttpEntity entity = response.getEntity();                 if (entity != null) {                     html = EntityUtils.toString(entity);                 }             } finally {                 response.close();             }         } catch (ClientProtocolException e) {             e.printStackTrace();         } catch (ParseException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         } finally {             // 關閉連接,釋放資源             try {                 httpclient.close();             } catch (IOException e) {                 e.printStackTrace();             }         }          return html;     }        /***       * 獲取ImageUrl地址       *        * @param htmlContext       * @return       */       private static List<String> getImageUrl(String htmlContext) {            if(StringUtils.isEmpty(htmlContext)){             throw new IllegalArgumentException("html請求內容不能為空.");         }          List<String> listImgUrl = new ArrayList<String>();            Matcher matcher = Pattern.compile(IMGURL_REG).matcher(htmlContext);            while (matcher.find()) {               listImgUrl.add(matcher.group().replaceAll("'", ""));           }            return listImgUrl;       }        /***       * 獲取ImageSrc地址       *        * @param htmlContext       * @return       */       public static  List<String> getImageSrc(String htmlContext) {            if(StringUtils.isEmpty(htmlContext)){             throw new IllegalArgumentException("html請求內容不能為空.");         }         List<String> listImageUrl = getImageUrl(htmlContext);          List<String> listImgSrc = new ArrayList<String>();            for (String imageContext : listImageUrl) {               Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(imageContext);               while (matcher.find()) {                   listImgSrc.add(matcher.group().substring(0, matcher.group().length() - 1));               }           }           return listImgSrc;       }    } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251

說明需要引入httpclient和commons-lang兩個jar包

我的項目是通過maven管理,所以只需要在pom.xml中添加以下配置即可

        <!-- apache開源組織的jar包 -->         <dependency>             <groupId>org.apache.httpcomponents</groupId>             <artifactId>httpclient</artifactId>             <version>4.5.4</version>         </dependency>         <!-- apache提供的工具jar,包含 字符串,數字、反射等工具類-->         <dependency>             <groupId>commons-lang</groupId>             <artifactId>commons-lang</artifactId>             <version>2.6</version>           </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

測試效果

1、修改常量

修改RQQUEST_URL 和IMAGE_SAVE_PATH 兩個常量值改成你想抓取的網址url和保存圖片的路徑即可

     /***      * 請求的網址url常量      */ public static final String RQQUEST_URL = "https://www.cnblogs.com/EasonJim/p/6919369.html";     /****      * 圖片保存路徑      */ public static final String IMAGE_SAVE_PATH = "C:\\Users\\youqiang.xiong\\Desktop\\image\\test";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、運行main方法

3、等待不久,Console控制臺會輸出一段信息

從【https://www.cnblogs.com/EasonJim/p/6919369.html】網站,共抓取【7】張圖片。
  • 1

這里寫圖片描述

4、打開C:\Users\youqiang.xiong\Desktop\image\test 目錄查看圖片是否成功生成

這里寫圖片描述

對比https://www.cnblogs.com/EasonJim/p/6919369.html 網址上的圖片跟test目錄中的發現一模一樣,這樣就大功告成了。

TODO

以上功能還有一些需要完善和優化的地方,由于時間有限這里還沒有太多時間去研究,后續會進一步補充。

1 加入多線程,同時抓取多個網站的圖片 
2 利用Java swing技術開發圖形界面,供普通用戶使用

 

(責任編輯:源碼海洋)本文地址:http://www.jsxyx.com.cn/info/java/2019/0125/17175.html

推薦資訊

国产女人乱子对白AV片| 俄罗斯1317大但人文艺术| 色老板精品无码免费视频| 国产精品无码专区在线播放 | 国产白浆喷水在线视频| 亚洲AV无码一区二区在线蜜桃| 久久久久九九精品影院| AV人摸人人人澡人人超碰妓女| 少妇性SEXBBWZⅩX| 极品妇女扒开粉嫩小泬| 43417大但人文艺术| 色欲久久久天天天综合网| 国模无码一区二区三区| 中国女RAPPER大妈| 日韩av一区二区三区| 国产专区一线二线三线品牌东| 月光影视WWW在线观看| 日韩激情无码不卡码| 国模少妇一区二区三区咪咕| 中文乱码字幕高清一区二区| 色婷婷欧美在线播放内射| 狠狠色丁香久久婷婷综合五月| 24小时最新在线视频免费观看 | GV无码免费无禁网站男男| 无码动漫性爽XO视频在线| 久久精品中文闷骚内射| 被俩个黑人前后破苞的女人| 亚洲 欧美 国产 日韩 精品| 免费看成熟丰满少妇AⅤ无码精品| 成人综合伊人五月婷久久| 亚洲成A人片在线观看WWW| 欧美A级情欲片在线观看免费| 国产成人精品一区二区秒拍| 亚洲综合色区另类AV| 日本高清在线观看视频WWW色| 含羞草实验室隐藏路线| 99久久夜色精品国产网站| 翁止熄痒苏钥第9章的内容| 久久人人爽人人爽人人片AV| 成人免费AⅤ视频一区二区| 亚洲国产AV无码精品| 去部队探亲晚上叫太大声| 国模GOGO无码人体啪啪| AV无码一区二区大桥未久| 午夜天堂一区人妻| 奶大灬舒服灬太大了一进一出| 国产成人MV在线播放| 又大又粗又硬又爽黄毛少妇| 他把胸罩撕了捏胸吃奶 | 亚洲 日韩 欧美 成人 在线| 女人张开腿让男人添| 国产日韩在线欧美视频| 99精品视频一区在线观看| 性色欲网站人妻丰满中文久久不卡 | 国产精品女同一区二区| 18禁真人床震无遮挡免费| 无码人妻精品一区二区| 免费网站看AV片| 国产午夜免费啪视频观看视频 | 亚洲中文字幕日产无码| 深夜成人毛片天堂| 里面也请好好疼爱第5话在哪 | CHINESE高潮收缩ORGASM| 亚洲成人AV在线播放| 日韩国产成人无码AV毛片蜜柚| 久久人人爽人人爽人人片AV麻烦| 国产成人无码AV一区二区| 中文字幕在线无码一区二区三区 | 国产精品55夜色66夜色| 97色偷偷色噜噜狠狠爱网站97| 亚洲AV无码乱码在线观看性色| 人妻久久久精品99系列A片| 精品无码国产污污污免费网站国产 | 亚洲人妻av在线| 熟妇人妻久久中文字幕老熟妇| 美丽女邻居交换5完整版| 国产亚洲人成A在线V网站| ZOOM与人性ZOOM我放弃播放器| 亚洲色成人网站WWW永久下载| 熟妇人妻VA精品中文字幕| 男女无遮挡XX00动态图120秒| 国模小黎大尺度精品(02)[| 菠萝菠萝蜜在线观看| 尤物国精品午夜福利视频| 西西人体大胆WWW444| 人妻中字视频中文乱码| 久久久久久一区国产精品| 国产精品免费视频网站| 99久久精品国产一区二区蜜芽| 亚洲欧美日韩一区二区三区在线| 天国少女免费观看| 欧美人妻精品一区二区三区| 久久精品A一国产成人免费网站| 国产精华液一线二线三线| 锕锕锕锕锕锕~好湿WWW| 一本到午夜92版福利| 亚欧免费无码AⅤ在线观看| 日韩AV无码AV免费AV不卡| 男女爽到高潮的免费网站| 精品无码人妻一区二区三区 | 日本黑人乱偷人妻中文字幕| 蜜臀av免费一区二区三区观看| 好姐妹高清在线韩国电影观看| 丰满多毛的大隂户BEST| A级毛片毛片免费观看丝瓜| 一本一道人人妻人人妻ΑV| 亚洲AV无码乱码在线观看代蜜桃| 日日摸夜夜添夜夜添无码国产| 欧美 国产 综合 欧美 视频| 久久国产午夜精品理论片| 国产日产欧洲系列| 俄罗斯18XXOO在线| GAYFUCKⅩⅩⅩⅩHD激情| 伊人久久大香线蕉午夜AV| 亚洲成A人片在线观看无码专区| 婷婷成人综合激情在线视频播放| 人妻无码第一区二区三区 | 极品婬荡少妇XXXX欧美| 国产乱码日产精品BD| 丰满少妇人妻HD高清果冻传媒| PYTHON人狗大CSDN| 中文字幕乱偷无码av先锋蜜桃| 亚洲精品无码AV人在线观看| 性中国VODAFONEWIFI| 特黄特色三级在线观看| 日本欧美午夜成人免费观看| 欧美黑人又大又粗高潮喷水| 乱中年女人伦AV二区| 久久精品国产网红主播| 狠狠做深爱婷婷久久综合一区| 国产精品一线二线三线有什么区别 | 中文在线А√在线| 亚洲中文字幕无码中文字| 亚洲AV综合色区无码一区爱AV| 无遮挡粉嫩小泬久久久久久久动漫| 色婷婷欧美在线播放内射| 日本老肥婆BBBWBBBWZR| 漂亮人妻被中出中文字幕久久| 男女无遮挡XX00动态图120秒| 领导不戴套玩弄下属娇妻 | 亚洲AV片不卡无码潮| 午夜影视免费观看2023| 无码超乳爆乳中文字幕久久| 天堂中文在线资源| 色综合久久婷婷88| 日老太太毛茸茸B.内射| 日本无码视频精品一二三区| 翘臀后进少妇大白嫩屁股| 欧美三级一区二区| 欧美VIDEOS另类极品| 免费无码的AV片在线观看| 乱码专区一卡二卡国色天香| 老少交TNBE少老配| 久久一区二区三区精华液| 久久午夜福利无码1000合集| 久久久久久精品国产亚洲AV麻豆| 久久精品国产亚洲色欲蜜壂AV| 久久R热这里只有精品| 精品无码人妻少妇久久久久久| 精品毛片高清一区二区三区| 精品露脸国产偷人在视频| 精品午夜福利在线观看| 久久AV喷吹AV高潮AV欧美| 久久精品亚洲精品无码金尊 | 精产国品一二三产品区别在哪里| 黑料社ZZTT.WIN免费观看| 狠狠爱俺也去去就色| 精品国际久久久久999波多野| 精品麻豆一卡2卡三卡4卡乱码| 精品无码成人网站久久久久久| 久9视频这里只有精品试看| 久久国内精品自在自线400部| 久久精品人人做人人爽老司机| 久久久受WWW免费人成| 老师你乖乖的可以让你少吃点苦头 | 黑人巨根在线观看| 精品国产一区二区三区久久| 九九九精品成人免费视频| 久久久久亚洲AV成人网人人网站| 久久综合给合久久国产免费| 麻豆亚洲AV熟女国产一区二| 欧美IPHONEXSMAX免费| 欧美性猛尖ⅩⅩⅩⅩ乱大交| 日本动漫爆乳H动漫无遮挡| 日韩AV无码精品一二三区| 少妇寂寞难耐被黑人中出| 铜铜铜铜铜铜铜铜铜好多水| 性色A∨人人爽网站| 亚洲精品国产情侣AV在线| 亚洲中文AⅤ中文字幕| 中文无码日韩欧免费视频| 99在线精品免费视频九九视| 草草浮力地址线路①屁屁影院 | CHINESE熟女老女人HD视频| 不什么不什么的成语| 国产VIVODESHD精品| 国产午夜精品一区二区三区软件 | 无码专区AAAAAA免费视频| 亚洲CHINESE男同志GAY| 亚洲综合成人婷婷五月在线观看|