java-jsoup爬虫
1. 介紹
Jsoup是Java中的一個包,可以用于爬取頁面中的數據
Jsoup爬取數據分為以下幾個步驟:
1. 獲取所爬取網頁的Document對象
2. 找到所爬取數據所在的父級標簽,將其從Document對象中解析出來,解析出來的內容放置在Element對象中
3. 再在Element中通過每一個數據所在的子標簽去解析,解析出來的內容放置在Elements對象中
4. 最后再通過每一個Element對象中的屬性獲得想要爬取的數據
接下來以爬取京東商品頁面中的商品數據為例
2. 新建SpringBoot項目,并導入依賴
<!-- 解析網頁 --> <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version> </dependency> <!-- lombok --> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency>3. 確認進行爬取的鏈接
進入京東官網,隨便搜索一個商品,看上方的鏈接
例如:https://search.jd.com/Search?keyword=筆記本&enc=utf-8&wq=筆記本&pvid=371fd4a6b1ef4b138e493cd39d4a34dc
去掉后面多余的參數,得到最后的目標鏈接:
https://search.jd.com/Search?keyword=筆記本
這個就是最后我們爬取數據時需要的鏈接
// 獲取請求 https://search.jd.com/Search?keyword=java String url = "https://search.jd.com/Search?keyword=" + keywords;/*解析網頁超過 30s 沒有返回就報錯Jsoup返回的Document就是瀏覽器的Document對象 */ Document document = Jsoup.parse(new URL(url), 30000);4. 找到所有數據的父級標簽
找到所有商品所在的父級div,通過其id獲取該div的Element對象
/*J_goodsList 是京東數據展示的那個 div 的名字獲取上述 url 中 div 名字為 J_goodsList 的 html */ Element element = document.getElementById("J_goodsList");5. 找到每個數據放置的標簽
發現頁面中每個商品的數據都是放在li里,然后通過getElementsByTag()方法獲取上述父級盒子的Element對象里所有li標簽的Element對象集合
6. 準備對象
本次只爬取頁面中商品的標題,圖片鏈接和價格
@Data @NoArgsConstructor @AllArgsConstructor public class Content {private String title;private String img;private String price; }6.1 找到數據所處的位置
位置都是通過標簽里的屬性來進行定位的
普及:
大部分圖片特別多的網站,所有的圖片都是延遲加載的,即在頁面進行渲染時,圖片的鏈接不是放在標簽的src屬性中
所謂延遲加載,意思是頁面在出現的時候,所有圖片不會立馬顯現出來,而是都會先默認顯示一張圖片,等到真正的圖片傳輸過來時才將默認圖片替換成真正的圖片
所以在這里尋找圖片鏈接時,不能去尋找圖片的src屬性
6.1.1 尋找圖片
在京東,圖片的真正地址在img標簽里的data-lazy-img屬性中。所以我們要獲取上述li標簽里的img標簽的屬性
6.1.2 尋找價格數據所處位置
/*getElementsByClass 通過 class 的名字進行獲取eq(0) 獲取第一個元素text() 所有的文本 */ String price = el.getElementsByClass("p-price").eq(0).text();6.1.3 尋找標題數據所處位置
/*getElementsByClass 通過 class 的名字進行獲取eq(0) 獲取第一個元素text() 所有的文本 */ String title = el.getElementsByClass("p-name").eq(0).text();7. 將找到的數據封裝進對象
完整代碼如下:
import com.gec.pojo.Content; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List;public class HtmlParseUtil {public static void main(String[] args) throws IOException {new HtmlParseUtil().parseJD("搞笑").forEach(System.out::println);}public List<Content> parseJD(String keywords) throws IOException {String url = "https://search.jd.com/Search?keyword=" + keywords;Document document = Jsoup.parse(new URL(url), 30000);Element element = document.getElementById("J_goodsList");// 獲取 J_goodsList 中的所有 liElements elements = element.getElementsByTag("li");List<Content> goodsList = new ArrayList<>();// 獲取元素中的內容,這里是 el ,就是每一個li標簽for (Element el : elements) {String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");String price = el.getElementsByClass("p-price").eq(0).text();String title = el.getElementsByClass("p-name").eq(0).text();Content content = new Content();content.setImg(img);content.setPrice(price);content.setTitle(title);goodsList.add(content);}return goodsList;} }8. 結果
Content(title=匯鑫泉運通 假山流水噴泉屏風高山水景觀流水墻水幕墻風水輪家居公司前臺風水輪招財落地擺件裝飾品 7079 (長91*寬51*高170CM), img=//img12.360buyimg.com/n7/jfs/t1/154317/8/10257/352628/5fdac831Efef04fcb/13a5e3a464c0c024.jpg, price=¥3188.00) Content(title=抖音同款網紅遙控大便屎玩具便便車發聲仿真粑粑惡搞整蠱搞笑禮物 遙控便便 普通電池款 抖音同款網紅遙控大便屎玩具便便車發聲仿真粑粑惡搞整蠱搞笑禮物 遙控便便 普通電池款, img=//img11.360buyimg.com/n7/jfs/t1/135096/39/22238/136938/61e57f8fE8f1f97a3/7a462e78f4d3b762.jpg, price=¥25.80) ...總結
以上是生活随笔為你收集整理的java-jsoup爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: micropython oled中文_m
- 下一篇: centos7搭建FTP服务器