背景
近些日子对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 |