背景
近些日子對java爬蟲有興趣,所以又做了一個K站的爬蟲,只實現基礎功能對請求頭沒有什麼封裝(初衷是爬些圖片做壁紙),因爲以前又做過D站的爬蟲,所以這次就一起總結一下吧。
不放源碼,想要的同學在git上找:https://github.com/Yan1less/MySpriders
梳理關係
寫爬蟲主要是邏輯梳理清楚,總站->輸入檢索標籤->每個匹配的圖片連接入隊->挨個進入連接->獲得圖片src->下載。
邏輯是這麼個邏輯,具體實現時有一些容易忘記的點,這裏點名提一下吧
具體操作
1.需要先通過HttpURLConnection類來獲取到頁面的代碼(這個工具類網上到處都是)
2.然後就是標準的素質三連(要硬說是幹嘛的我覺得應該視爲了符合Jsoup的篩選格式吧。。。?)
String code = GetCode.GetPageCodeByUrl(url);
Document document = Jsoup.parse(code);
Elements select = document.select(".inner a");//裏面內容的書寫方法看下文
3.這是後我們拿到了關鍵的Elements對象,其通過get(int index).toString()方法來獲得某一行的數據,並把它變成String(不然是Element對象)
4.這個時候我們一般拿到的是整個標籤,而我想要標籤裏面的一些連接,這時候就要用正則了
5.一個十分好用的正則(想要href就把src換成href,不行在改變括號外面的東西,這一步完了之後就可以拿到一個能用的連接了)
public static String getImgSrc(String img){
String src = "";
Pattern p = Pattern.compile("[\\s|\\S]* src=\"([^<]*)\" [\\s|\\S]*");
Matcher m =p.matcher(img);
if(m.matches()){
src= m.group(1);
}
return src;
}
6.拿到連接就下載到本地,工具類也到處都是
關於Jsoup的選擇器
https://jsoup.org/apidocs/org/jsoup/select/Selector.html
這個頁面十分好用,不過這裏也放一些常用的吧
圖案 | 火柴 | 例 |
---|---|---|
* |
任何元素 | * |
tag |
具有給定標記名稱的元素 | div |
*|E |
任何名稱空間ns中的 E類型元素 | *|name 找到<fb:name> 元素 |
ns|E |
名稱空間ns中的 E類型的元素 | fb|name 找到<fb:name> 元素 |
#id |
屬性ID爲“id”的元素 | div#wrap , #logo |
.class |
類名爲“class”的元素 | div.left , .result |
[attr] |
具有名爲“attr”的屬性的元素(具有任何值) | a[href] , [title] |
[^attrPrefix] |
屬性名稱以“attrPrefix”開頭的元素。用於查找包含HTML5數據集的元素 | [^data-] , div[^data-] |
[attr=val] |
具有名爲“attr”的屬性的元素,以及等於“val”的值 | img[width=500] , a[rel=nofollow] |
[attr="val"] |
具有名爲“attr”的屬性的元素,以及等於“val”的值 | span[hello="Cleveland"][goodbye="Columbus"] , a[rel="nofollow"] |
[attr^=valPrefix] |
具有名爲“attr”的屬性的元素,以及以“valPrefix”開頭的值 | a[href^=http:] |
[attr$=valSuffix] |
具有名爲“attr”的屬性的元素,以及以“valSuffix”結尾的值 | img[src$=.png] |
[attr*=valContaining] |
具有名爲“attr”的屬性的元素,以及包含“valContaining”的值 | a[href*=/search/] |
[attr~=regex] |
具有名爲“attr”的屬性的元素,以及與正則表達式匹配的值 | img[src~=(?i)\\.(png|jpe?g)] |
以上可以以任何順序組合 | div.header[title] |
|
||
E F |
來自E元素的F元素 | div a , .logo h1 |
E > F |
E的直接孩子 | ol > li |
E + F |
緊接着兄弟姐妹E的F元素 | li + li , div.head + div |
E ~ F |
一個F元素,前面是兄弟E | h1 ~ p |
E, F, G |
所有匹配元素E,F或G. | a[href], div, h3 |