测试爬取百度贴吧图片
定义爬取百度斗图吧首页的每条贴子的URL的爬取规则对象
/**
* 斗图吧贴子的url
*/
SpiderFunction<Set<String>> doutubaTieZiUrl = spider -> {
// 文本爬取对象
TextSpider textSpider = (TextSpider) spider;
// 文本爬取规则 定位元素
textSpider.setReg("div:t_concleafix>*>a>href>*");
return textSpider.getData().getResult().stream()
// 爬取后的数据处理 因为可能存在相同引用的连接所以使用Set容器去重
.filter(url -> (!"#".equals(url)) && (!url.contains("?")) && (url.contains("/p/")))
.map(url -> url.startsWith("http") ? url : "https://tieba.baidu.com" + url
).collect(Collectors.toSet());
};
在寻找爬取规则过程中发现百度贴吧贴子列表页的所有内容都被注释掉了所以需要修改一下文本规则截取部分的代码
需要将过滤注释的部分进行处理
编写爬取每个贴子页数的爬取规则对象
/**
* 百度贴吧贴子的每页的url
*/
SpiderFunction<Set<String>> doutubaTieZiPageUrl = spider -> {
Set<String> urls = new HashSet<>();
String page = spider.getUrl();
TextSpider textSpider = (TextSpider) spider;
// 定位总页数位置
textSpider.setReg("li:l_reply_num>1>span>2");
List<String> result = textSpider.getData().getResult();
// 循环生成某个贴子的所有页面的url
if (Lists.isValuable(result)) {
String endNum = result.get(0);
if (endNum.matches("^[0-9]+$")) {
for (int i = 1; i <= Integer.parseInt(endNum); i++) {
urls.add(page + "?pn=" + i);
}
}
}
return urls;
};
定义爬取贴子每页的每个楼层中的图片的url
/**
* 贴子上的每张图片的url
*/
SpiderFunction<Set<String>> tieZiPageImgUrl = spider -> {
TextSpider textSpider = (TextSpider) spider;
textSpider.setReg("div:p_content>*>img>src>*");
return textSpider.getData().getResult().stream()
.map(url -> url.startsWith("http") ? url