jsoup实现Java爬虫
使用的jar包
简单案例:
package web;
import org.apache.commons.io.IOUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@WebServlet("/img")
public class WServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据网址获取它的网页源代码文档对象
Document doc = Jsoup.connect("https://XXX").get();
//从文档doc对象找到所有的图片标签img
Elements es = doc.select("img[src]");
//遍历得到每一个图片标签
for (Element e : es) {
//得到图片的路径
String src = e.attr("href");
//将图片路径给下载和储存的方法
getImg(src);
}
}
private void getImg(String imgPath) {
try {
//将图片拿到程序中
InputStream is = new URL(imgPath).openStream();
//将图片储存在自己的本地文件夹中加上毫秒数命名
FileOutputStream os = new FileOutputStream("D:\\XXXXX/" + System.currentTimeMillis()+".jpg");
//io工具类对接两个流
IOUtils.copy(is,os);
} catch (IOException e) {
e.printStackTrace();
}
}
}
扩展
当然上面的案例只能访问一些本地的资源,如果要真正的爬到东西还需要绕开反爬机制。
Document doc = Jsoup.connect("http://XXXXXX" ).timeout(5000).data(map).proxy(ip, port).ignoreContentType(true).userAgent(ua[i]).header("referer", "http://XXXXXX/").get();
//找到标签
大家可以从请求发送的数据入手,例如修改userAgent(ua[i]),或者延迟线程执行时间,更换IP等等