一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup

Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup

2021-02-24 13:58雜兵2號 JAVA教程

下面小編就為大家分享一篇Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1、需求及配置

需求:爬取京東手機搜索頁面的信息,記錄各手機的名稱,價格,評論數等,形成一個可用于實際分析的數據表格。

Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup

使用maven項目,log4j記錄日志,日志僅導出到控制臺。

maven依賴如下(pom.xml)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>
 <dependency>
 <groupid>org.apache.httpcomponents</groupid>
 <artifactid>httpclient</artifactid>
 <version>4.5.3</version>
 </dependency>
 
 <dependency>
 <!-- jsoup html parser library @ https://jsoup.org/ -->
 <groupid>org.jsoup</groupid>
 <artifactid>jsoup</artifactid>
 <version>1.11.2</version>
 </dependency>
 
 <!-- https://mvnrepository.com/artifact/log4j/log4j -->
 <dependency>
 <groupid>log4j</groupid>
 <artifactid>log4j</artifactid>
 <version>1.2.17</version>
 </dependency>
 </dependencies>

log4j配置(log4j.properties),將info及以上等級信息輸出到控制臺,不單獨設置輸出文檔。

?
1
2
3
4
5
6
log4j.rootlogger=info, console
 
#console
log4j.appender.console=org.apache.log4j.consoleappender
log4j.appender.console.layout=org.apache.log4j.patternlayout
log4j.appender.console.layout.conversionpattern=%d [%t] %-5p [%c] - %m%n

2、需求分析與代碼

2.1需求分析

第一步,建立客戶端與服務端的連接,并通過url獲得網頁上的html內容。

第二步,解析html內容,獲取需要的元素。

第三步,將html內容輸出到本地的文本文檔中,可直接通過其他數據分析軟件進行分析。

根據以上分析,建立4個類,gethtml(用于獲取網站html), parsehtml(用于解析html), writeto(用于輸出文檔), maincontrol(主控).下面分別對四個類進行說明。為使代碼盡量簡潔,所有的異常均從方法上直接拋出,不catch。

2.2代碼

2.2.1gethtml類

該類包含兩個方法:geth(string url), urlcontrol(string baseurl, int page),分別用于獲取網頁html及控制url。由于此次爬取的網頁內容只是京東上某一類商品的搜索結果,所以不需要對頁面上所有的url進行遍歷,只需要觀察翻頁時url的變化,推出規律即可。只向外暴露urlcontrol方法,類中設置一個private的log屬性:private static logger log = logger.getlogger(gethtml.class); 用于記錄日志。

geth(string url),對單個url的html內容進行獲取。

urlcontrol(string baseurl, int page),設置循環,訪問多個頁面的數據。通過審查元素可以看到京東上搜索頁page的變化實際是奇數順序的變化。

Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup

再看一下點擊后網址的變化,可以發現實際變化的是page屬性的值。通過拼接的方式就可以很的容易的獲得下一個網頁的地址。

https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=3&s=47&click=0
https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=5&s=111&click=0
https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=7&s=162&click=0

整體代碼:

?
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
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;
import org.apache.log4j.logger;
 
public class gethtml {
 //建立日志
 private static logger log = logger.getlogger(gethtml.class);
 private static string geth(string url) throws clientprotocolexception, ioexception {
 //控制臺輸出日志,這樣每條訪問的url都可以在控制臺上看到訪問情況
 log.info("正在解析" + url);
 
 /*
  * 以下內容為httpclient建立連接的一般用法
  * 使用httpclient建立客戶端
  * 使用get方法訪問指定url
  * 獲得應答
  * */
 
 closeablehttpclient client = httpclients.createdefault();
 httpget get = new httpget(url);
 closeablehttpresponse response = client.execute(get);
 
 /*
  * 以下內容為將html內容轉化為string
  * 獲得應答體
  * 將應答體轉為string格式,此處使用了entityutils中的tostring方法,編碼格式設置為"utf-8"
  * 完成后關閉客戶端與應答
  * */
 httpentity entity = response.getentity();
 string content;
 if (entity != null) {
  content = entityutils.tostring(entity, "utf-8");
  client.close();
  response.close();
  return content;
 } else
  return null;
 }
 public static void urlcontrol(string baseurl, int page) throws clientprotocolexception, ioexception {
 //設置當前頁count
 int count = 1;
 //如果當前頁小于想要爬取的頁數則執行
 while (count < page) {
  //實際訪問的url為不變的url值拼接上url變化的值
  string u = baseurl + (2 * count - 1) + "&click=0";
  //此處調用parsehtml類中的方法對url中的html頁面進行處理,后面詳細介紹該類
  string content = parsehtml.parse(geth(u)).tostring();
  //此處調用writeto類中的方法對解析出來的內容寫入到本地,后面詳細介紹該類
  writeto.writeto(content);
  count++;
 }
 }
}

2.2.2parsehtml類

該步驟需要通過審查元素對需要爬取內容的標簽進行確定,再通過jsoup中的css選擇器進行獲取。

?
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
import org.jsoup.jsoup;
import org.jsoup.nodes.document;
import org.jsoup.nodes.element;
import org.jsoup.select.elements;
 
public class parsehtml {
 
 public static stringbuilder parse(string content)
 {
 //使用jsoup中的parse方法對已經轉換為string的html內容進行分析,返回值為document類
 document doc = jsoup.parse(content);
 //使用選擇器select對需要找的元素進行抓取,例如第一個select中選擇的是ul標簽中class屬性等于gl-warp clearfix的內容
 elements ele = doc.select("ul[class = gl-warp clearfix]").select("li[class=gl-item]");
 //設置一個容器,用于裝各個屬性
 stringbuilder sb = new stringbuilder();
 //通過上一個選擇器可以獲得整個頁面中所有符合要求的元素,也即各款手機,下面則需要對每款手機進行遍歷,獲取其屬性
 for (element e : ele) {
  //此處對各個屬性的獲取參考了網上一篇爬取京東上內容的文章,應該有其他不同的寫法
  string id = e.attr("data-pid");
  string mingzi = e.select("div[class = p-name p-name-type-2]").select("a").select("em").text();
  string jiage = e.select("div[class=p-price]").select("strong").select("i").text();
  string pinglun = e.select("div[class=p-commit]").select("strong").select("a").text();
  //向容器中添加屬性
  sb.append(id+"\t");
  sb.append(mingzi+"\t");
  sb.append(jiage+"\t");
  sb.append(pinglun+"\t");
  sb.append("\r\n");
 }
 return sb;
 }
}

2.2.3writeto類

此類中的方法將解析完成的內容寫入到一個本地文件中。只是簡單的io。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.bufferedwriter;
import java.io.file;
import java.io.filewriter;
import java.io.ioexception;
 
public class writeto {
 // 設置文件存放的位置
 private static file f = new file("c:\\jingdong.txt");
 public static void writeto(string content) throws ioexception {
 //使用續寫的方式,以免覆蓋前面寫入的內容
 bufferedwriter bw = new bufferedwriter(new filewriter(f, true));
 bw.append(content);
 bw.flush();
 bw.close();
 }
}

2.2.4maincontrol類

主控程序,寫入基地址與想要獲取的頁面數。調用gethtml類中的urlcontrol方法對頁面進行抓取。

?
1
2
3
4
5
6
7
8
9
10
11
12
import java.io.ioexception;
import org.apache.http.client.clientprotocolexception;
 
public class maincontrol {
 public static void main(string[] args) throws clientprotocolexception, ioexception {
 // todo auto-generated method stub
 string baseurl = "https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc="
  + "utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=";
 int page = 5;//設置爬取頁數
 gethtml.urlcontrol(baseurl, page);
 }
}

3、爬取結果

爬取20頁。

3.1控制臺輸出

Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup

3.2文檔輸出

可以直接使用excel打開,分隔符為制表符。列分別為商品編號,名稱,價格與評論數。

Java爬蟲實現爬取京東上的手機搜索頁面 HttpCliient+Jsoup

4、小結

此次爬取使用了httpclient與jsoup,可以看到對于簡單的需求,這些工具還是非常高效的。實際上也可以把所有類寫到一個類當中,寫多個類的方式思路比較清晰。

以上這篇java爬蟲實現爬取京東上的手機搜索頁面 httpcliient+jsoup就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/pandasgb/archive/2017/11/30/7920323.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 暴露狂婷婷 | 国产成人在线播放 | 国产99er66在线视频 | 91一个人的在线观看www | 国产成+人+综合+欧美 亚洲 | www一级片| 欧美又黄又激烈真实床戏 | 被18号每天强行榨干acg | 波多野结衣178部中文字幕 | 久久亚洲成a人片 | 亚洲国产精品一区二区首页 | 调教女帝| 特黄特色大片免费影院 | 农村妇女野外性生话免费视频 | 午夜影院0606| 日本一卡二卡3卡四卡无卡网址 | 精品免费久久久久久成人影院 | 超逼网 | 欧美一区不卡二区不卡三区 | 成人网18免费网 | 久久精品国产久精国产果冻传媒 | 校园春色自拍偷拍 | 三级aa久久 | 婷婷综合七月激情啪啪 | 亚洲女bbwxxxx另类 | 国产特黄一级一片免费 | 国产资源视频在线观看 | 美女脱一净二净不带胸罩 | 亚洲 欧美 另类 中文 在线 | 小小水蜜桃视频高清在线观看免费 | 国产成人免费 | 日本免费高清在线观看播放 | 亚洲欧洲日产v特级毛片 | 国产精品一区二区三区免费 | 91麻豆国产福利在线观看 | 羞羞色男人的天堂伊人久久 | 丰满肥臀风间由美357在线 | 日本色女| 日本一区二区免费在线 | 爆操萝莉 | 美式禁忌在线 |