天天看點

JSoup爬蟲技術

寫的都是自己的心得,轉載請标明出處:https://blog.csdn.net/weixin_41156319/article/details/94560767

JSoup是現在比較火的爬取資料的技術,因為其簡單有效,對于學習過JS,JQuery的開發人員比較容易。現在爬蟲技術一般都是通過HTTPClient進行擷取頁面源碼,然後通過JSoup進行解析HTML頁面。下面就我對JSoup的了解,并列舉一個小Demo進行說明。

JSoup是什麼?

 JSoup是一款Java的HTML解析器,主要用來對HTML解析。

JSoup的特點?

  • JSoup可以對Html頁面字元串,檔案,URL進行爬取并解析HTML。
  • JSoup可以利用DOM或則CSS選擇器來查找标簽進行擷取資料
  • JSoup可以通過attr進行标簽屬性的更改
  • JSoup可以通過白名單來清理使用者送出的内容,防止XSS攻擊

實戰-爬取京東商城商品資訊

本實戰直接采用JSoup進行頁面抓取,頁面資料爬取。雖然JSoup可以完成頁面擷取,但有局限性,隻能支援HTTP和HTTPS協定。本Demo為了友善直接采用JSoup來開發,建議采用HTTPClient來擷取源碼。

首先展示一下擷取到的資料,示範項目隻抓取了一個頁面的資料。

Goods{name='六福珠寶 網絡專款足金康乃馨黃金琺琅工藝吊墜女款挂墜不含項鍊女款 計價 GDGTBP0022 2.63克(含工費171元)', price='1236.00', imgUrl='//img10.360buyimg.com/n7/jfs/t1/33090/4/15084/173381/5d195638E6acaf2ac/57963a0dafce6025.jpg', title='六福珠寶 網絡專款足金康乃馨黃金琺琅工藝吊墜女款挂墜不含項鍊女款 計價 GDGTBP0022 2.63克(含工費171元)', href='https://item.jd.com/46526107175.html'}
Goods{name='炫銀部落 黃金項鍊999足金吊墜18K金套鍊女心形3D硬金生日禮物 999足金心形吊墜+18k金鍊', price='229.00', imgUrl='//img14.360buyimg.com/n7/jfs/t1/83555/14/1070/87748/5cf48a2cEc3f57365/7a5eff80eb4bb098.jpg', title='炫銀部落 黃金項鍊999足金吊墜18K金套鍊女心形3D硬金生日禮物 999足金心形吊墜+18k金鍊', href='//item.jd.com/49209944114.html'}
Goods{name='賽菲爾 黃金項鍊足金 9999金吊墜花朵鎖骨鍊女款套鍊 芙蓉 送禮 金重約5.7-5.82克', price='2304.00', imgUrl='//img13.360buyimg.com/n7/jfs/t4726/58/2160648948/195202/7a708868/58f9d0a5N82afe5c7.jpg', title='賽菲爾 黃金項鍊足金 9999金吊墜花朵鎖骨鍊女款套鍊 芙蓉 送禮 金重約5.7-5.82克', href='//item.jd.com/3567923.html'}
Goods{name='鳴鑽國際 水滴之戀 黃金項鍊套鍊女款 足金石榴石吊墜項墜挂墜配金鍊子 珍貴如你,幸運如我,滿1000減100,白條6期免息,好貨不貴,立即搶購,猛戳!!', price='3488.00 ', imgUrl='//img10.360buyimg.com/n7/jfs/t1/10512/15/2087/93948/5be00b94Ea54ead1f/66394c64d9dda521.jpg', title='珍貴如你,幸運如我,滿1000減100,白條6期免息,好貨不貴,立即搶購,猛戳!!', href='//item.jd.com/100000837950.html'}
Goods{name='周大福 禮物 依戀 肖邦鍊 足金黃金項鍊(工費:98計價) F172885 足金 45cm 約5.80g 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='2447.00', imgUrl='//img10.360buyimg.com/n7/jfs/t18466/309/585753538/217120/1b00fc3d/5a97c76cNf5b706de.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/5712110.html'}
Goods{name='周生生 CHOW SANG SANG 黃金足金萬字項鍊百搭素鍊 女款 09251N 40厘米 - 2.5克 【京東物流,高效送達】6.30-7.7,熱銷黃金滿2000減80/滿3500減200/滿5000減350,指定非黃金飾品每滿599減60,領券再減!', price='1087.00', imgUrl='//img11.360buyimg.com/n7/jfs/t9781/93/1083934663/62687/2bc1e978/59dc92a7N9f23d3a9.jpg', title='【京東物流,高效送達】6.30-7.7,熱銷黃金滿2000減80/滿3500減200/滿5000減350,指定非黃金飾品每滿599減60,領券再減!', href='//item.jd.com/100001374616.html'}
Goods{name='潮宏基 黃金足金 精靈寶可夢-皮卡丘歡呼 黃金吊墜女款 定價 S 預售約7月中旬發貨', price='1580.00', imgUrl='//img13.360buyimg.com/n7/jfs/t1/64860/15/2538/167601/5d0c814bEee3e7dc8/2b79a0a9a845111d.jpg', title='潮宏基 黃金足金 精靈寶可夢-皮卡丘歡呼 黃金吊墜女款 定價 S 預售約7月中旬發貨', href='https://item.jd.com/29658717493.html'}
Goods{name='周生生CHOW SANG SANG 18K金黃色黃金項鍊百搭素鍊女款 04800N18KY 45厘米 【京東物流,高效送達】6.30-7.7,熱銷黃金滿2000減80/滿3500減200/滿5000減350,指定非黃金飾品每滿599減60,領券再減!', price='660.00', imgUrl='//img10.360buyimg.com/n7/jfs/t10525/321/1105962847/56507/60dc5a34/59dc91dbN68f6127c.jpg', title='【京東物流,高效送達】6.30-7.7,熱銷黃金滿2000減80/滿3500減200/滿5000減350,指定非黃金飾品每滿599減60,領券再減!', href='//item.jd.com/5483710.html'}
Goods{name='周大福(CHOW TAI FOOK)禮物 簡約 足金黃金項鍊 F159797 68 45cm 約3.7克 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='1566.50', imgUrl='//img10.360buyimg.com/n7/jfs/t16270/65/1937678174/69336/cd9050b4/5a6ec510N93c19094.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/6308550.html'}
Goods{name='周六福 珠寶女款黃18K金項鍊時尚肖邦鍊鎖骨鍊 KH050484 42cm 【京東配送,高效送達】7.1-7.9周六福珠寶周年店慶,指定款每滿1000減60,立即搶購', price='436.00', imgUrl='//img12.360buyimg.com/n7/jfs/t21529/11/2105069081/101544/63f5552c/5b45f4e7N9de5fef5.jpg', title='【京東配送,高效送達】7.1-7.9周六福珠寶周年店慶,指定款每滿1000減60,立即搶購', href='//item.jd.com/8347787.html'}
Goods{name='歐弗萊 黃金項鍊足金999女款鑲嵌時尚心形吊墜套鍊鎖骨鍊浪漫求愛生日禮物送女友送老婆 心心相印吊墜+足金項鍊(現貨立發) 【買即送檢查證書,假一罰三】【免費刻字,代寫賀卡】【品質保障,放心購】', price='2315.00', imgUrl='//img13.360buyimg.com/n7/jfs/t1/58433/19/3099/110834/5d103c20E0a56630c/4df63c869a17c6c1.jpg', title='【買即送檢查證書,假一罰三】【免費刻字,代寫賀卡】【品質保障,放心購】', href='//item.jd.com/42971379848.html'}
Goods{name='周大福(CHOW TAI FOOK)禮物 百搭簡約 足金黃金項鍊 F183782 48 40cm 約3.4克 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='1425.00', imgUrl='//img13.360buyimg.com/n7/jfs/t16108/18/1722972571/181934/3a69828f/5a6ed044N8f161127.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/6925068.html'}
Goods{name='鳴鑽國際 傾世之戀1 黃金項鍊 足金吊墜套鍊鎖骨鍊女款 送女友生日禮物', price='5999.00', imgUrl='//img14.360buyimg.com/n7/jfs/t1/20698/23/3221/103934/5c2595b5Ef44f73d8/fdf3fa4b93009a1b.jpg', title='鳴鑽國際 傾世之戀1 黃金項鍊 足金吊墜套鍊鎖骨鍊女款 送女友生日禮物', href='https://item.jd.com/100001626274.html'}
Goods{name='周大福(CHOW TAI FOOK)愛戀 足金黃金項鍊 F188335 58 約3克 45cm 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='1273.00', imgUrl='//img13.360buyimg.com/n7/jfs/t18061/122/1446734739/98751/a477e3f4/5acc3ce1N21bf1d5c.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/100002329283.html'}
Goods{name='米芙諾 黃金項鍊心語吊墜18K黃金套鍊love項鍊女鎖骨鍊生日禮物訂婚送女友 心語套鍊 長40厘米 愛的心語,閃閃亮。送玫瑰禮盒,帶證書!', price='739.00', imgUrl='//img13.360buyimg.com/n7/jfs/t23458/33/578117647/325664/cd69009e/5b35cbdeNb66dbc81.jpg', title='愛的心語,閃閃亮。送玫瑰禮盒,帶證書!', href='//item.jd.com/29776595913.html'}
Goods{name='周大福 禮物 ing系列 愛圓滿 足金黃金項鍊/吊墜(工費:238計價) F206704 足金 45cm 約7.50g 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='3275.50', imgUrl='//img14.360buyimg.com/n7/jfs/t18172/190/647596835/62304/71aca859/5a9cbf8aNc83f18d6.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/5563119.html'}
Goods{name='周大福(CHOW TAI FOOK)禮物 相戀 足金黃金項鍊 F173873 68 45cm 約3.9克 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='1647.50', imgUrl='//img11.360buyimg.com/n7/jfs/t19066/149/337920283/195653/6800409e/5a6eb93eN022cc074.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/100000480751.html'}
Goods{name='周生生 CHOW SANG SANG 黃金足金Amore心心相印項鍊女款 78039N 42厘米 4.14克 【京東物流,高效送達】6.30-7.7,熱銷黃金滿2000減80/滿3500減200/滿5000減350,指定非黃金飾品每滿599減60,領券再減!', price='1784.00', imgUrl='//img11.360buyimg.com/n7/jfs/t9829/15/1088569000/146286/84dda978/59dc944cN654da58a.jpg', title='【京東物流,高效送達】6.30-7.7,熱銷黃金滿2000減80/滿3500減200/滿5000減350,指定非黃金飾品每滿599減60,領券再減!', href='//item.jd.com/5113221.html'}
Goods{name='花好玉緣 蝶戀花 18K黃金項鍊 金吊墜項墜套鍊鎖骨鍊女款 送女友生日禮物 KJD161', price='2899.00', imgUrl='//img12.360buyimg.com/n7/jfs/t28960/135/290527453/95658/7bf5468c/5bee6661N7ec03adf.jpg', title='花好玉緣 蝶戀花 18K黃金項鍊 金吊墜項墜套鍊鎖骨鍊女款 送女友生日禮物 KJD161', href='https://item.jd.com/100001949482.html'}
Goods{name='賽菲爾 18k金項鍊 女款O字十字K金項鍊 鎖骨鍊女 金鍊子', price='347.00', imgUrl='//img10.360buyimg.com/n7/jfs/t5473/195/650144607/76431/c1c13bae/5904431fN59293854.jpg', title='賽菲爾 18k金項鍊 女款O字十字K金項鍊 鎖骨鍊女 金鍊子', href='//item.jd.com/4030285.html'}
Goods{name='CEMNI千年珠寶 黃金項鍊 全橄榄足金999土豪項鍊 金鍊子顯粗男女款 父親節禮物 約15.12g 長約45cm 多退少補', price='5156.00', imgUrl='//img11.360buyimg.com/n7/jfs/t3193/11/4946545803/318543/7968dbd2/585a447eN62fde79c.jpg', title='CEMNI千年珠寶 黃金項鍊 全橄榄足金999土豪項鍊 金鍊子顯粗男女款 父親節禮物 約15.12g  長約45cm 多退少補', href='//item.jd.com/31043961616.html'}
Goods{name='晴愛 黃金項鍊 999足金吊墜女款雙心鎖骨鍊套鍊 生日禮物送女友 雙心套鍊 約4.3-4.4g 節日禮物送女友送老婆,支援七天無理由退換貨', price='1859.00', imgUrl='//img11.360buyimg.com/n7/jfs/t24391/202/1322725541/141853/32101489/5b5ac38eN2a15039a.jpg', title='節日禮物送女友送老婆,支援七天無理由退換貨', href='//item.jd.com/14990255991.html'}
Goods{name='禦龍金翠 黃金項鍊 心心相印黃金吊墜套鍊 足金黃金首飾 金項鍊女款鍊長42cm+3cm 黃金心心相印(光砂更新版)約5.1克 順豐發貨,免費刻字請聯系客服,或者直接留言', price='1868.00', imgUrl='//img10.360buyimg.com/n7/jfs/t1/27857/3/10711/63399/5c88d6abE150b76bb/6664e32cdea7e6e4.jpg', title='順豐發貨,免費刻字請聯系客服,或者直接留言', href='//item.jd.com/1647784205.html'}
Goods{name='周大福(CHOW TAI FOOK)禮物 時尚水波鍊 18K金項鍊 E121035 980 45cm 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='931.00', imgUrl='//img10.360buyimg.com/n7/jfs/t19720/73/584000607/178264/935d52d/5a97c5c5N10c1d476.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/5264080.html'}
Goods{name='先恩尼 黃金丘比特吊墜 女款足金項鍊 小天使黃金吊墜 足金吊墜 黃金項鍊 黃金飾品 愛情禮物', price='1560.00', imgUrl='//img13.360buyimg.com/n7/jfs/t1/57930/27/2179/60013/5cff2b95E48155a1f/70623432f4d8b8f3.jpg', title='先恩尼 黃金丘比特吊墜 女款足金項鍊 小天使黃金吊墜 足金吊墜 黃金項鍊 黃金飾品 愛情禮物', href='https://item.jd.com/1017375403.html'}
Goods{name='周大福(CHOW TAI FOOK)因你而幸lucky字母足金黃金項鍊 吊墜 F217504 108 45cm 約6克 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='2538.00', imgUrl='//img10.360buyimg.com/n7/jfs/t17158/131/1487123533/124382/aba706ab/5acc37dcNa396117d.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/7135715.html'}
Goods{name='周大福(CHOW TAI FOOK)簡約 足金黃金項鍊 F132516 108 45cm 約9.0克 【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', price='3753.00', imgUrl='//img12.360buyimg.com/n7/jfs/t17683/296/1440839068/189380/cdd6356c/5acc37c4N09effc41.jpg', title='【京東配送,急速送達】6.25-7.3熱銷商品低至120元,用券更省,立即搶購!', href='//item.jd.com/7135717.html'}
Goods{name='周大福 簡約 足金黃金項鍊(工費:168計價) F178119 足金 45cm 約9.00g 6.28-7.3日追逐群星,黃金低至238元,用券更省猛戳', price='3813.00', imgUrl='//img12.360buyimg.com/n7/jfs/t3121/176/2913518645/237322/cc8627a0/57e8bbe7Na2e6e439.jpg', title='6.28-7.3日追逐群星,黃金低至238元,用券更省猛戳', href='//item.jd.com/13020508772.html'}
Goods{name='賽菲爾 黃金項鍊足金 9999金吊墜雙心扉鎖骨鍊女款套鍊 新品送禮', price='1651.00', imgUrl='//img12.360buyimg.com/n7/jfs/t1/59718/17/3388/83792/5d197805E0680247d/74cb083f4a414aee.jpg', title='賽菲爾 黃金項鍊足金 9999金吊墜雙心扉鎖骨鍊女款套鍊 新品送禮', href='//item.jd.com/3998872.html'}
Goods{name='翠廣源 黃金項鍊女款999足金吊墜女士愛心形鎖骨鍊套鍊 送女友、老婆禮物 慕心足金吊墜+黃金項鍊(總金重約2.4g) 順豐航空1-2天達、六期免息、支援京東物流貨到付款,一對一配送證書、假一罰十、七天無理由退換', price='1190.00', imgUrl='//img12.360buyimg.com/n7/jfs/t1/35170/18/4424/100884/5cbbe4b4E133c1fda/72384c26d068e50c.jpg', title='順豐航空1-2天達、六期免息、支援京東物流貨到付款,一對一配送證書、假一罰十、七天無理由退換', href='//item.jd.com/45919300547.html'}
           

項目代碼如下:

public static void main(String[] args) throws IOException {
        String url = "https://search.jd.com/Search?keyword=%E9%BB%84%E9%87%91%E9%A1%B9%E9%93%BE&enc=utf-8";
        //商品集合
        List<Goods> goods = Lists.newArrayList();
        //擷取Dom并解析
        Connection conn = Jsoup.connect(url);
        // 修改http包中的header,僞裝成浏覽器進行抓取
        conn.header("User-Agent",user-agent);
        Document doc = conn.get();
        Elements liElements = doc.getElementsByClass("gl-item");
        for(Element e : liElements) {
            Goods good = new Goods();
            Elements e1 = e.children();
            String title = e1.get(0).getElementsByTag("div").get(0).getElementsByTag("a").attr("title");
            String href = e1.get(0).getElementsByTag("div").get(0).getElementsByTag("a").attr("href");
            String imgUrl = e1.get(0).getElementsByTag("div").get(0).getElementsByTag("img").attr("source-data-lazy-img");

            String price = e.getElementsByClass("p-price").get(0).getElementsByTag("i").text();
            String name = e.getElementsByClass("p-name").get(0).getElementsByTag("a").text();
            good.setHref(href);
            good.setImgUrl(imgUrl);
            good.setName(name);
            good.setPrice(price);
            good.setTitle(title);
            goods.add(good);
        }
        for (Goods goods : goodsInfos){
                System.out.println(goods);
            }
    }
           
代碼中url含帶中文直接進行轉碼

代碼中conn.header()方法中設定的User-Agent是為了讓伺服器僞裝成浏覽器進行通路。可以使用JS代碼來檢視自己浏覽器user-agent

通過javascript:alert(navigator.userAgent)來檢視。

在爬取資料時檢視待爬取資料源碼規律,進行檢視找到最佳爬取資料使用的擷取标簽内容方法。

上面的代碼是自己習慣所向,每個人擷取标簽屬性都不一樣。比如我們擷取界面的title時可以直接使用doc.title()。使用HTTPClient可以通過傳輸頁面通路條件進行多頁面爬取。爬取任務一般時間較長,可以放線上程中執行,為了示範友善沒有寫線上程中。方法多種多樣。JSoup最重要的三個類就是:JSoup,Document,Element類,三者方法的具體API下面我已展示出來:

JSOUP類API    Document類API  Element類API

有需要的讀者可以進入官網API檢視,進行更細緻的學習。本人程式員小白,歡迎各位朋友進行指點讨論。