这是一个简单的java爬虫代码
用来爬妹子图的
mport org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MZiTuBugs {
public static void main(String[] args) throws IOException {
//1. 获取网络资源地址
String url = "https://www.mzitu.com/20513";//修改此地址就可以获取另外的图集了
Document document = Jsoup.connect(url).get();
//找到表示总共多少页的 <a> 标签
Elements elements = document.select(".pagenavi a");
Integer span = Integer.valueOf(elements.eq(elements.size() - 2).select("span").text());
for (Integer i = 1; i <= span; i++) {
String url02 = url+"/"+i;//具体每张图对应的页面
Document document02 = Jsoup.connect(url02).get();
//找到这个图片列表对应的位置
String src = "";
Elements elements02 = document02.select(".main-image p a img");
for (Element element02 : elements02) {
//每一个a标签就对应一张图,然后拿到里面的href属性的值
src = element02.attr("src");
System.out.println(src);
}
//使用这个地址下载图片
//1.使用Java代码模拟出一个客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
//2.创建一个get请求
HttpGet httpGet = new HttpGet(src);
//添加头部信息模拟浏览器访问
httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
httpGet.setHeader("Accept-Encoding", "gzip, deflate, sdch, br");
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
httpGet.setHeader("Referer", "https://www.mzitu.com/");//告诉服务器women从哪里来的
//3.使用客户端执行请求,获取响应
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
//4.获取响应体
HttpEntity entity = httpResponse.getEntity();
//5.获取响应体的内容
InputStream is = entity.getContent();
//创建一个字节输出流,将图片输出到硬盘中"D/aa"目录
//解析src获取图片的后缀名
//int i1 = src.lastIndexOf(".");//得到的是最后一个 . 的索引,然后用substring来根据索引切割
String sub = src.substring(src.lastIndexOf("."));
//创建一个随时间毫秒值变化的的文件名
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMddHHmmssSSS");
String imgName = sdf.format(date)+sub;
FileOutputStream out = new FileOutputStream("D:/aa/" + imgName);//具体放在哪个地方可以由你自己确定,但是记得要这个文件夹一定要存在,否则会报错
//将输入流中的内容拷贝到输出流
IOUtils.copy(is,out);
//关流
out.close();
is.close();
System.out.println("下载ing.......");
}
System.out.println("本次下载完成了,快去打开吧...");
}
}
在本次的爬虫实践中要用的 jar 依赖包如下:
- commons-io-1.4
- httpclient-4.5.3
- httpcore-4.4.6
- jsoup-1.11.2
- JsoupXpath-0.3.2
- commons-logging-1.2
心得体会
好吧 , 其实我踩了不少的坑 , 作为一名初学者 , 在自己上手的时候很多东西都要慢慢摸索 .
最开始的时候 , 得到了图片的连接但是 发现并不能成功的下载 , 报了错
错误详情是...
然后我使用浏览器打开,发现返回了 403
001.jpg
但是如果我打开了妹子图的网址,然后再打开这个图片地址却又可以正确的加载 , 我百思不得其解 , 网上找了很多方法 , 但是说的我还是不能解决 , 最后 复习了一下资料,发现有可能是我没有加请求头 , 于是我尝试加入一个请求头
//添加头部信息模拟浏览器访问
httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
httpGet.setHeader("Accept-Encoding", "gzip, deflate, sdch, br");
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
httpGet.setHeader("Referer", "https://www.mzitu.com/");//告诉服务器women从哪里来的
结果 发现果然可以了
然后是 element 标签元素的长度是 .size() 不是.length() , 这个也坑了我一下 , 最后查找得到了正确的方法
另外,这个案列中有一个时间毫秒值得获取方法 , 涉及到了时间格式转换的知识
最开始的时候我使用的是配置文件的方式读取url地址
//1.0 读取 beans.properties 文件中的url地址
ResourceBundle bundle = ResourceBundle.getBundle("beans");
String url = bundle.getString("url");
但是为了简化代码,就注释掉了,不过我们以后在写代码的时候使用配置文件的方式会更加利于代码的维护和修改
然后是 文件的读写, 涉及到了 io 流的知识
不过这里使用了工具类 IOUtils.copy(is,out);
直接拷贝输出了
总的来说 , 这个爬虫还是很有意思的 , 有兴趣的小伙伴可以尝试着自己写一下
网友评论