摘要:介紹本篇博客將繼續上一篇博客爬蟲之使用的模塊爬取各國國旗的內容,將用來實現這個爬蟲,下載全世界國家的國旗圖片。
介紹
??本篇博客將繼續上一篇博客:Python爬蟲之使用Fiddler+Postman+Python的requests模塊爬取各國國旗 的內容,將用Java來實現這個爬蟲,下載全世界國家的國旗圖片。項目不再過多介紹,具體可以參考上一篇博客。
??我們將全世界國家的名稱放在一個txt文件中,每一行一個國家名字,該文件位于E盤flag目錄下,名稱為countries.txt, 部分內容如下:
??我們這個爬蟲的思路還是和上一篇博客的思路一樣:先是讀取countries.txt中的國家名稱,以國家名稱為參數,讀取該國家搜索后的所在網頁,再找到該搜索網頁中的國家的國旗圖片,并實現下載。這個搜索的過程,我們可以用Java的URL包中的POST方法來實現,關于POST方法的請求頭和請求體,可以用Fiddler工具進行抓包分析。
??該Java項目的具體結構如下:
其中用到的第三方API為commons-io和Jsoup,主函數為Country_Flag_Download.java,其java代碼完整如下:
package wikiScrape; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.apache.commons.io.FileUtils; public class Country_Flag_Download { public static void main(String[] args){ String fileName ="E://flag/countries.txt"; // 讀取countries.txt文件中的國家名,儲存在ArrayList中 ArrayList運行結果countries = readFileByLines(fileName); for(String country: countries) { String page = doPost(country); // 獲取國家所在的網頁 if (page.indexOf("html") >= 0) { // 獲取成功 getContent(page); // 下載該國國家的國旗 } } System.out.println("國旗下載完畢!"); } /* 發送HTTP的POST請求,獲取指定國家的網頁地址 * 傳入參數:country(國家): String類型 */ public static String doPost(String country){ String url = "http://country.911cha.com/"; try { // 設置網址,打開連接 URL obj = new URL(url); HttpURLConnection conn = (HttpURLConnection) obj.openConnection(); // 設置POST請求頭和請求體,請求體的參數為國家(country) conn.setUseCaches(false); conn.setRequestMethod("POST"); String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"; conn.setRequestProperty("User-Agent", USER_AGENT); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); String postParams = String.format("q=%s", country); // 傳入POST請求體的參數 conn.setDoOutput(true); OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream(),"UTF-8"); os.write(postParams); os.flush(); os.close(); // 獲取響應結果狀態碼 int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { //如果響應狀態碼為200 // 將HTML內容解析成UTF-8格式 Document doc = Jsoup.parse(conn.getInputStream(), "utf-8", url); // 刷選需要的網頁內容 String page = doc.select("div.mcon").get(1) .selectFirst("ul") .selectFirst("li") .selectFirst("a") .attr("href"); return page; } else { // 如果響應狀態碼不是200, 則返回"Get page failed!" return "Get page failed.!"; } } catch(Exception e){ return "Get page failed."; } } // getContent()函數主要實現下載指定國家的國旗 public static void getContent(String page){ String base_url = "http://country.911cha.com/"; String url = base_url+page; try{ // 利用URL解析網址 URL urlObj = new URL(url); // URL連接 URLConnection urlCon = urlObj.openConnection(); // 打開URL連接 // 將HTML內容解析成UTF-8格式 Document doc = Jsoup.parse(urlCon.getInputStream(), "utf-8", url); // 刷選需要的網頁內容 Element image = doc.selectFirst("img"); String flag_name = image.attr("alt").replace("國旗", ""); String flag_url = image.attr("src"); URL httpurl = new URL(base_url+"/"+flag_url); // 利用FileUtils.copyURLToFile()實現圖片下載 FileUtils.copyURLToFile(httpurl, new File("E://flag/"+flag_name+".gif")); System.out.println(String.format("%s國旗下載成功~", flag_name)); } catch(Exception e){ e.printStackTrace(); System.out.println("下載失敗!"); } } // 以行讀取文件,返回ArrayList, 里面的元素為每個國家的名稱 public static ArrayList readFileByLines(String fileName) { File file = new File(fileName); BufferedReader reader = null; // 設置reader為null ArrayList countries = new ArrayList (); try { reader = new BufferedReader(new FileReader(file)); String tempString = null; // 一次讀入一行,直到讀入null為文件結束 while ((tempString = reader.readLine()) != null) countries.add(tempString); // 在列表中添加國家名稱 reader.close(); // 關閉reader return countries; } catch (IOException e) { return countries; } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } }
??點擊運行該Java程序,可以發現在E盤的flag目錄下已經下載了全世界國家的國旗圖片,查看如下:
??Bingo, 我們的Java爬蟲程序運行成功!本次爬蟲的主要目標是為了在Java中實現類似于Python中的requests模塊的POST方法~
注意:本人現已開通兩個微信公眾號: 因為Python(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關注哦~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71511.html
摘要:流程作為上述過程的一個演示,我們使用的網址為頁面如下在表單中輸入德國,跳轉后的頁面如下我們可以發現,在搜索的結果中,會出現德國這個搜索結果。點擊該搜索結果,跳轉后的頁面如下在這個頁面中有我們需要的德國的國旗。 介紹 ??本篇博客將會介紹一個Python爬蟲,用來爬取各個國家的國旗,主要的目標是為了展示如何在Python的requests模塊中使用POST方法來爬取網頁內容。??為了知道...
摘要:異步下載國旗圖片和國家名數據用來捕獲異常保存圖片文件負責下載的主函數,由傳遞國家名是數據。異步獲取圖片異步獲取國家名中的子句在沒有異常時會運行這里獲取循環是為了在保存圖片時不阻塞函數內部維護了一個對象注。 異步下載國旗圖片和國家名數據 import aiohttp import asyncio import os import time import sys POP20_CC = (...
摘要:本屆世界杯中,在日本與比利時的比賽中,日本球迷們高舉隊長小翼的畫面就足以證明這部動漫對日本足球的深遠影響。本文將介紹如何利用爬蟲來下載足球小將的動漫圖片。 ??盡管俄羅斯世界杯的熱度已經褪去,但這屆世界杯還是給全世界人民留下了無數難忘的回憶,不知你的回憶里有沒有日本隊的身影?本次世界杯中,日本隊的表現讓人眼前一亮,很難想象,就是這樣一只隊伍,二十幾年還是我們國家足球隊的水平一樣,也許還...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:本次分享將在此基礎上,利用多線程,提高程序運行的效率。思路本次分享建立在博客爬蟲之下載中電影的圖片上,總體的爬蟲思路沒有變化,只是在此基礎上引入多線程。 介紹 ??在博客:Java爬蟲之下載IMDB中Top250電影的圖片中我們實現了利用Java爬蟲來下載圖片,但是效率不算太高。本次分享將在此基礎上,利用多線程,提高程序運行的效率。 思路 ??本次分享建立在博客Java爬蟲之下載IMD...
閱讀 1139·2021-11-08 13:13
閱讀 1721·2019-08-30 15:55
閱讀 2773·2019-08-29 11:26
閱讀 2439·2019-08-26 13:56
閱讀 2561·2019-08-26 12:15
閱讀 2143·2019-08-26 11:41
閱讀 1404·2019-08-26 11:00
閱讀 1543·2019-08-23 18:30