org.jsoup
jsoup
1.13.1
2、基本方法
public static void main(String[] args) throws IOException {
// 1、访问url
String url = "";
// 2、参数,没有可不写
Map<String, String> params = new HashMap<>();
// params.put("word","壁纸");
// 3、请求文档资源—有get和post两种方法,取决于要爬取的数据,爬取html一般使用get即可
Document document = Jsoup.connect(url).data(params).get();
// 4、选择器—用来选择元素,主要有几种方式
/*
* 1、getElementsByTag 按照标签选择,通常用来选择 h1 ,img标题等元素
* 2、getElementsByClass 按照元素的class命名选取
* 3、getElementById 按照元素ID
* 4.select 复合选择器,最常用的方法—如下
* #nav 选择id为nav的元素
* .container 选择class为 container的元素
* p > img 选择p标签下的所有img标签,如果是p>a>img,则选择不到。层级必须对应
* 其余方法详情见官方API https://jsoup.org/cookbook/extracting-data/attributes-text-html
*/
Elements elements = document.select("div.post_body > p > img");
/*
* 这里就已经获取到了所有的图片,可以通过attr方法获取标签的属性,获取图片url
* 使用工具类写到本地文件夹就行了
*/
String FilePath = "D://imgDown/";
for (int i = 0; i < elements.size() ; i++) {
//此方法只有三个参数——URL地址,文件名字(全名,包含路径),超时时间
FileUtil.downFile(elements.get(i).attr("src"),FilePath+i+".jpg",5000);
}
}
3、工具类代码—lombok看自己想法是否引入,不需要的话,删除掉log相关的打印就行了
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
@Slf4j
public class FileUtil {
public static boolean downFile(String urlString, String fileName, Integer timeout) {
boolean ret = false;
File file = new File(fileName);
try {
if(file.exists()){
file.delete();
}
log.info("开始下载文件");
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
if (timeout != null) {
con.setConnectTimeout(timeout);
con.setReadTimeout(timeout);
}
con.connect();
int contentLength = con.getContentLength();
InputStream is = con.getInputStream();
int len;
File file2=new File(file.getParent());
file2.mkdirs();
if(file.isDirectory()){
}else{
file.createNewFile();//创建文件
}
OutputStream os = new FileOutputStream(file);
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.close();
is.close();
if(contentLength != file.length()){
file.delete();
ret = false;
}else{
ret = true;
}
} catch (IOException e) {
file.delete();
ret = false;
}finally {
return ret;
}
}
}
4、补充
一般在爬取网页的过程中,标题都会是h1标签,可以根据标题创建文件夹,这样方便管理
String title = document.select("h1").text();
String FilePath = "D://imgDown/"+title+"/";
部分网站做了请求头校验,在创建连接的时候,需要添加 headers()参数(单个添加用header),以下是比较常见的的数据,还有Token和Authorization等校验(极少数会有cookie校验),具体可以以浏览器抓取到的参数填写。
Map<String, String> headers = new HashMap<String, String>();
//此处Host的值需要按照访问地址填写
header.put("Host", "https://www.163.com");
header.put("User-Agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0");
header.put("Accept", " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
header.put("Accept-Language", "zh-cn,zh;q=0.5");
header.put("Accept-Charset", " GB2312,utf-8;q=0.7,*;q=0.7");
header.put("Connection", "keep-alive");
Document document = Jsoup.connect(url).headers(headers).data(params).get();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)