欢迎点击「算法与编程之美」↑关注我们!
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。
1 前提简介
前面讲过了如何对文章小说的分目录,分章节爬取保存,下面将讲述对当前热门的表情包进行分页,分类爬取。
2 简单查看
下面是一个表情包网站的首页,并且分了很多类别。
图2.1 表情包首页
而且有很多页数。
图2.2 不同页
经过观察,每一页的url只有最后代表页数的数字变了,那就可以从这里下手,多页爬取。
图2.3 区别
3 代码及注释
下面就来看看详细的代码和注释吧,还是温馨提醒注意xpth以及url书写正确哦。
// 引入的包,略
public class GetPicture1 implements PageProcessor {
// 定义一个变量用来表示需要下载的总页数
private static int size = 3;
// 定义一个变量用来表示起始页
private static int number = 1;
// 声明一个用来存储需要下载的 url 路径的集合
private static List<String> listUrl = new ArrayList<String>();
// 对所要爬取的页面进行相关设置
private Site site = Site.me()
.setCharset("utf-8")
.setSleepTime(1000)// 休眠时间
.setTimeOut(1000);// 超时时间
@Override
public Site getSite() { return site; }
// 爬取数据的逻辑
@Override
public void process(Page page) {
// 获取 url
Selectable url = page.getUrl();
//url 匹配
if(url.regex("https://www.doutula.com/article/list///?page=//d*").match()){// 列表页
// 获取页面
Html html = page.getHtml();
// 解析页面获取相关信息 ( 获取所有的标题 url)
List<String> urls = html.xpath("[@class='container_']/div[1]/div[1]/div[2]/a").links().all();
if(number > size + 1){
return;
}
urls.add(listUrl.get(number - 1));
// 下一页
number++;
// 将连接放入待爬取序列
page.addTargetRequests(urls);
}else{
// 爬取图片 获取页面
Html html = page.getHtml();
// 获取表情包组的名称
String title = html.xpath("[@class='container_']/div[1]/div[1]/div[2]/li/div[1]/h1/a/text()").toString();
// 获取表情包图片的链接 //
List<String> pictureUrl = html.xpath("[@class='container_']/div[1]/div[1]/div[2]/li/div[2]/div/table/tbody/tr/td[1]/a/img/@src").all();
// 下载到本地
downPicture(pictureUrl,title);
}
}
// 将图片下载到本地
private void downPicture(List<String> pictureUrl, String title) {
for(int i=0;i<pictureUrl.size();i++){
// 获取每一张图片连接
String link = pictureUrl.get(i);
// 做一个非空判断
if(link == null || link == ""){
return;// 结束
}
try {
// 将连接字符串封装成一个 URL 对象
URL url = new URL(link);
// 获取网络连接
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// 获取一个输入流
InputStream in = conn.getInputStream();
// 指定图片目录存储的位置
File file = new File("D://doutula//" + title);
// 判断目录是否存在
if(! file.exists()){
// 创建多级目录
file.mkdirs();
}
// 自定图片的位置
File file2 = new File("D://doutula//" + title + "//" + i + ".jpg");
// 输出流
FileOutputStream fos = new FileOutputStream(file2);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 定义一个缓冲区
byte[] buf = new byte[1024];
// 定义一个标记用于判断有没有读完
int len = 0;
// 循环读取
while((len = in.read(buf)) != -1){
outStream.write(buf,0,len);
}
System.out.println(" 下载完毕 ");
// 写出到本地
fos.write(outStream.toByteArray());
// 关闭资源
in.close();
outStream.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 生成所有下载页的 url 列表,通过 size 控制的页数
public static List<String> listUrl(int num){
List<String> list = new ArrayList<String>();
// 循环往列表中添加 url
for(int i=1;i<=num;i++){
list.add("https://www.doutula.com/article/list/?page=" + (i+1));
}
return list;
}
// 主程序的入口、线程
public static void main(String[] args) {
// 获取所有需要下载页的 url
listUrl = listUrl(size);
Spider.create(new GetPicture1()).thread(1).addUrl("https://www.doutula.com/article/list/?page=1").run();
}
}
这样,就能拿到大量的热门表情包了,只要敢去“new”,“Java”都能感想敢做。
END
主 编 | 张祯悦
责 编 | 黄晓锋
where2go 团队
微信号:算法与编程之美
长按识别二维码关注我们!
温馨提示: 点击页面右下角 “写留言”发表评论,期待您的参与!期待您的转发!