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