首先是工具介紹
Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
HttpClient
HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。
可能看的有點迷,直接上例子就好了
首先我們要確定一個要爬取的網站拿一個都快被爬破的經典教材起點中文網的完美世界吧
https://www.qidian.com/search?kw=%E5%AE%8C%E7%BE%8E%E4%B8%96%E7%95%8C
然后我們要對這個網頁的結構進行分析,按F12
找到書的名字和作者名字的具體在哪個div里面,或者可以直接根據class名字找到要爬取的內容
下面具體看代碼解釋
package com.wpb.dao; import java.io.IOException; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.wpb.bean.Book; public class test { public static void main(String[] args) throws IOException { //要爬取的網站 String url = "https://www.qidian.com/search?kw=完美世界"; //獲得一個和網站的鏈接,注意是Jsoup的connect Connection connect = Jsoup.connect(url); //獲得該網站的Document對象 Document document = connect.get(); int cnt = 1; //我們可以通過對Document對象的select方法獲得具體的文本內容 //下面的意思是獲得.bool-img-text這個類下的 ul 下的 li Elements rootselect = document.select(".book-img-text ul li"); for(Element ele : rootselect){ //然后獲得a標簽里面具體的內容 Elements novelname = ele.select(".book-mid-info h4 a"); String name = novelname.text(); Elements author = ele.select(".book-mid-info p a"); String authorname = author.first().text(); Elements sumadvice = ele.select(".total p"); String sum = sumadvice.last().text(); System.out.println("書名:"+name+" 作者:"+authorname+" 推薦量:"+sum); } } }
上面的一個例子差不多是Jsoup的一個簡單應用
下面來個Httpclient的簡單應用,我覺得這個就是簡單地模擬一下瀏覽器訪問這樣的形式獲取信息
網站是這個
那么既然是模擬瀏覽器訪問,就要設置Header來給人家網站說明一些信息
依然是F12然后點network,按F5找一個User-agent
package com.wpb.service; import java.io.IOException; import org.apache.http.HttpEntity; 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; public class httpUtilUse { public static void main(String[] args) throws ClientProtocolException, IOException { String URL = "https://www.tuicool.com/"; //創建模擬一個客戶端 CloseableHttpClient client = HttpClients.createDefault(); //創建一個網站的連接對象 HttpGet httpGet = new HttpGet(URL); //設置一些Header信息,說是從哪個瀏覽器訪問的 httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"); //讓客戶端開始訪問這個網站 CloseableHttpResponse response = client.execute(httpGet); //獲取到了該網站頁面的html HttpEntity entity = response.getEntity(); //把html轉化成String String html = EntityUtils.toString(entity); System.out.println(html); System.out.println("successful"); } }
通過這個httpclient我們可以進行一些其他的騷操作
比如下載個圖片啥的
package com.wpb.service; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.FileUtils; import org.apache.http.HttpEntity; 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; public class getImage { public static void main(String[] args) throws ClientProtocolException, IOException { String imgUrl = "http://aimg0.tuicool.com/EzQVN3u.jpg"; CloseableHttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(imgUrl); httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"); CloseableHttpResponse response = client.execute(httpGet); HttpEntity entity = response.getEntity(); //判斷獲取的信息的類型是什么樣嬸的 String fileType = entity.getContentType().getValue(); //如果這個是image型的 if(fileType.contains("image")){ //獲取這個東西的字節流 InputStream inputStream = entity.getContent(); //直接把他輸入到一個路徑中 FileUtils.copyInputStreamToFile(inputStream, new File("d://test.jpeg")); } response.close(); client.close(); System.out.println("successful"); } }
把Jsoup和javaIO流結合一下就可以爬取一些你想要的東西了
比如下載一些hdu的問題
package com.wpb.service; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class downLoadText { public static void main(String[] args) throws IOException { String s1 = "http://acm.hdu.edu.cn/showproblem.php?pid="; BufferedWriter bw = new BufferedWriter(new FileWriter("C:"+File.separator+"hdu.txt")); //循環訪問多個問題 for(int i = 1000; i<= 1099; i++){ String s2 = s1 + i; System.out.println(s2); Connection connection = Jsoup.connect(s2); Document document = connection.get(); bw.write("Problem"); bw.newLine(); Elements problem = document.select(".panel_content"); for(Element ele : problem){ String p = ele.text(); System.out.println(p); bw.write(p); bw.newLine(); } } bw.flush(); bw.close(); } }
還有還有 比如爬取我老婆照片
package com.wpb.service; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.FileUtils; import org.apache.http.HttpEntity; import org.apache.http.client.HttpClient; 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.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class getManyImag { public static int cnt = 1; public static void main(String[] args) throws IOException { //分析網頁的變化,發現每變化一個網頁,url里面就加30 for (int i = 30; i <= 2010; i += 30) { add("http://movie.douban.com/celebrity/1018562/photos/?type=C&start=" + i + "&sortby=like&size=a&subtype=a"); } } public static void add(String url) throws IOException { //獲取鏈接 Connection conn = Jsoup.connect(url); //獲取這個頁面內容 Document document = conn.get(); //使用Jsoup獲取具體內容 Elements ele = document.select(".cover a img"); //模擬一個瀏覽器用戶 CloseableHttpClient client = HttpClients.createDefault(); for (Element e : ele) { //通過Jsoup獲取圖片的url,我們要獲取這個圖片的url才能再通過httpclient下載下來 String imgurl = e.attr("src"); //設置一個連接對象 HttpGet httpGet = new HttpGet(imgurl); //設置header httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"); //httpclient進行連接 CloseableHttpResponse response = client.execute(httpGet); //獲取內容 HttpEntity entity = response.getEntity(); //將內容轉化成IO流 InputStream content = entity.getContent(); //寫入 FileUtils.copyInputStreamToFile(content, new File("c://tu//wpb" + cnt + ".jpg")); cnt++; } System.out.println("successful"); } }
完