絡爬蟲基本思路
基本思路:由關鍵字指定的url把所有相關的html頁面全抓下來(html即為字符串),然后解析html文本(通常是正則表達式或者現成工具包如jsoup),提取文本信息,然后把文本信息存儲起來。
網絡爬蟲操作步驟
URL(統一資源定位符)
下載資源
分析下載資源(正則表達式)
抽取、清洗、儲存
該文章只會操作兩步步驟URL和下載html資源。
網絡編程小知識
URI:(Universal Resource Identifier)統一資源標記符,用來標記抽象或物理資源的一個緊湊字符串。
URL:(Universal Resource Locator)統一資源定位符,一種定位資源的主要訪問機制的字符串,一個標準的URL必須包括:protocal(協議)、host(主機)、port(端口號)、path(路徑)、parameter(參數)、anchor(錨)。
URN:(Universal Resource Name)統一資源名稱,通過特定命名空間中的唯一名稱或ID來標識資源。
URL和URN都是URI,但是URI不一定是URL或者URN。
SEO搜索引擎優化
SEO是搜索引擎優化(Search Engine Optimization)的英文縮寫,中文譯為“搜索引擎優化”。在了解搜索引擎自然排名機制的基礎上,對網站進行內部及外部的調整優化,改進網站在搜索引擎中的關鍵詞自然排名,獲得更多流量,從而達成網站銷售及品牌建設的預期目標。
網絡爬蟲技術是SEO搜索引擎優化的基礎(對網絡爬蟲感興趣的同學可以深入研究)
JAVA中的JDK已經對URL(資源定位符)封裝完畢,使用者只要會用即可。
使用JAVA代碼下載網站資源有如下兩種情況:
該代碼主要是通過URL類的openStream方法來獲取網絡資源,如果還想了解URL類的信息的同學可以去看看JDK中URL類的源代碼。
二、網站不允許外來訪問(模仿瀏覽器使用HTTP協議交流)代碼如下
注意事項
JAVA中的控制臺儲存空間有限,所以有時候HTML源代碼會顯示不全,但你可以通過IO操作來拷貝到文件中去。
HttpURLConnection類的setRequestProperty方法中的(String key,String value)參數需要到瀏覽器相應網頁中去拷貝。
拷貝如下:
1、進入瀏覽器相關網頁。
2、按住F12進入devtools。
3、拷貝Request包中最后一行數據。
4、冒號前的對應key參數,冒號后的對應value參數。
點擊關注私信小編“資源”即可獲得
近在工作中遇到一個bug,將word轉換成html,轉換成功之后在瀏覽器中打開其中圖片不顯示,使用img標簽,src指定圖片相對地址又是能顯示的,排除圖片問題。
網上能搜索到的demo
打開轉碼之后的html代碼發現,生成的是vml圖片標簽,這個在IE9以后就不支持了,更別說現在的主流瀏覽器了。
生成的html中使用的是vml標簽
將這個跟大佬分析分析,各種文檔一查,咔咔咔大致分析出問題所在。原來jacob使用的是word本身自帶的功能,相當于把word打開另存為html,于是手動將word轉為html試了一下,果然效果與代碼轉換一致,這時候注意到word另存為時有一個web選項,里面有個使用vml渲染圖片默認是選中的,去掉這個選項,再次生成,圖片正常顯示。
到這里基本已經確定了問題的解決思路,另存為時不勾選這個選項,那么問題來了,怎么利用jacob操作另存為時去掉這個選項呢,想去搜搜看jacob相關的文檔,結果不知道是不是因為這個很老了,網上大多數都是demo,根本沒有相關的文檔可看,Github上也是只言片語,根本無從查起。
jacob github 地址:https://github.com/joval/jacob
微軟官網文檔
官方文檔連接:https://docs.microsoft.com/zh-cn/office/vba/api/word.weboptions.relyonvml
微軟官網查詢相關文檔,發現其實是可以關閉的,于是代碼變成這樣
關閉relyOnVml
再次運行程序,這次轉出來的html就能在瀏覽器打開了。
總結,在這次解決問題的過程中,學會了往更深層次去想問題,找對方向,迎難而上。
記錄一下這個問題解決的經驗,也希望能幫到同樣遇到這個問題的人。
.Jsoup介紹
- 官網文檔:https://jsoup.org
- Jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。
2. Jsoup快速入門
- 獲取網頁標題
String url="https://search.jd.com/Search?keyword=手機&wq=手機&page=1";
Document document=Jsoup.connect(url).get();
String title=document.select("title").text();
System.out.println(title);
```
- 運行效果:手機 - 商品搜索 - 京東
3. 網站數據分析
3.1 分析網站的訪問地址
- 以京東商城為例,商品分頁列表的url地址,需要帶如下幾個參數,因此,在發送http請求時,需要攜帶正確的參數。
- URL:https://search.jd.com/Search?keyword=手機&wq=手機&page=1
3.2 分析網站的頁面結構
- 通過瀏覽器的開發者工具,可以分析出頁面中我們需要的html結構。
<img src="assets/image-20220717171103097.png" alt="image-20220717171103097" style="zoom:67%;" />
- 可以看出,我們需要的商品數據,封裝在一個id=J_goodsList的div標簽中,我們可以方便的通過DOM解析出這塊數據。
4. 實戰實現過程
- 獲取第1頁的商品基本數據
public static void main(String[] args) throws Exception {
//第1頁地址
String url="https://search.jd.com/Search?keyword=手機&wq=手機&page=1";
//發送http請求
Document document=Jsoup.connect(url).get();
//在id=J_goodsList的div下,獲取所有帶有data-sku屬性的li標簽
Elements lis=document.select("div[id=J_goodsList] li[data-sku]");
lis.forEach(
li -> {
//獲取商品sku
String sku=li.attr("data-sku");
//獲取商品name
String name=li.select("div[class='p-name p-name-type-2'] a em").text();
//獲取商品圖片地址
String img=li.select("div[class=p-img] a img[data-lazy-img]").attr("data-lazy-img");
System.out.println(String.format("%s, %s, %s", sku, name, img));
}
);
}
- 效果預覽
- 改造為分頁獲取
*請認真填寫需求信息,我們會在24小時內與您取得聯系。