package com.test.pic.crawler;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.jsoup.Jsoup;
import org.jsoup.nodes.*;
import org.jsoup.select.Elements; /**
* @Title: PicCrawler.java
*
* @Package com.test.pic.crawler
*
* @Description: 爬取指定网站的指定Tag下的图片或者全部Tag图片
*
* @author CoderZZ
*
* @date 2018年1月12日 下午11:22:41
*
* @version V1.0
*
*/
public class PicCrawler implements Runnable{
private static String pathString = "G:/test/pic/";//存储目录
//存储真正的爬取页面
static BlockingQueue<String> urlBlockingQueue = new LinkedBlockingDeque<String>(1000);
static int threadNum = 10;
// public PicCrawler(String url){
// this.url = url;
// } /**
* @Title: main
*
* @Description: TODO(这里用一句话描述这个方法的作用)
*
* @param @param args 设定文件
*
* @return void 返回类型
*
* @throws
*
*/
public static void main(String[] args) {
String homeurlString = "https://www.xxxx.com";//爬取页面的基本地址
String tagPageUrl = "https://www.xxxx.com/tag/";//tag分页地址
//Tag标签的完整路径
Set<String> tagFullHrefSet = new HashSet<String>(16);
//想要爬取哪些tag,如果为空,则全部爬取;否则只配置对应的tag
String[] crawlerTagArray = {"风景"};
List<String> crawlerTagList = Arrays.asList(crawlerTagArray);
try {
//1.获取想要的tag完整的url
Document tagListDocument = Jsoup.connect(tagPageUrl).get();
Elements tagsListDivElements = tagListDocument.getElementsByClass("tags_list");
for(Element element:tagsListDivElements){
Elements aElements = element.getElementsByTag("a");
for(Element a:aElements){
if(crawlerTagList.size() == 0 || crawlerTagList.contains(a.text())){
String tagUrlString = homeurlString+a.attr("href");
//https://www.xxxx.com/tag/fengjing.html
tagUrlString = tagUrlString.substring(0, tagUrlString.lastIndexOf("."))+"/1.html";
tagFullHrefSet.add(tagUrlString);
}
}
}
//2.获取图片链接页面地址,分页爬取
for(String tagUrl:tagFullHrefSet){
String tempTagUrlString = tagUrl;
int currentPageNum = 1;
while(true){
try{
Document imagePageDocument = Jsoup.connect(tempTagUrlString).get();
Elements imageListElements = imagePageDocument.getElementsByClass("Pli-litpic");
if(imageListElements.size() == 0){
break;
}
for(Element image:imageListElements){
urlBlockingQueue.offer(homeurlString+image.attr("href"));
}
//https://www.xxxx.com/tag/fengjing/1.html
tempTagUrlString = tempTagUrlString.substring(0, tempTagUrlString.lastIndexOf("/")+1)+(++currentPageNum)+".html";
}catch(Exception e){
break;
}
}
}
ScheduledExecutorService excutor = new ScheduledThreadPoolExecutor(threadNum,new BasicThreadFactory.Builder().namingPattern("my-crawler-thread-%d").daemon(false).build());
for(int i=0;i<threadNum;i++){
// excutor.schedule(new PicCrawler(urlArray[i]), 1, TimeUnit.SECONDS);
// excutor.execute(new PicCrawler(urlArray[i]));
excutor.submit(new PicCrawler());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
long begin = System.currentTimeMillis();
String url = urlBlockingQueue.poll();
if(null != url){
Document doc = Jsoup.connect(url).get();
Elements titleElements =doc.select("#photos > h1");
if(null != titleElements && null != titleElements.get(0)){
Set<String> imgSrcSet = new HashSet<String>(16);
Element titleElement = titleElements.get(0);
String foldNameString = titleElement.text();
String[] nameArray = foldNameString.split("\\(");
foldNameString = nameArray[0];
nameArray = nameArray[1].split("/");
int totalPaggs = Integer.parseInt(nameArray[1].replace(")", ""));
for(int i=1;i<=totalPaggs;i++){
String urlTemp = url.replace(".html", "_"+i+".html");
Document docTemp = Jsoup.connect(urlTemp).get();
Element element = docTemp.getElementById("big-pic");
Elements imgElements = element.getElementsByTag("img");
for(Element imgElement:imgElements){
imgSrcSet.add(imgElement.attr("src"));
}
}
if(imgSrcSet.size()>0){
for(String imgSrc:imgSrcSet){
// 构造URL
URL imgurl = new URL(imgSrc);
// 打开连接
URLConnection con = imgurl.openConnection();
//设置请求超时为10s
con.setConnectTimeout(10*1000);
// 输入流
InputStream is = con.getInputStream();
// 500k的数据缓冲
byte[] bs = new byte[1024*500];
// 读取到的数据长度
int len;
// 输出的文件流
File sf=new File(pathString+"\\"+foldNameString);
if(!sf.exists()){
sf.mkdirs();
}
String filename = imgSrc.split("/")[imgSrc.split("/").length-1];
OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename);
// 开始读取
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
// 完毕,关闭所有链接
os.close();
is.close();
System.out.println(imgSrc+"下载完成!!!");
}
}
long end = System.currentTimeMillis();
System.out.println("================================================================");
System.out.println(Thread.currentThread().getName()+"******************已全部下载完成,用时:"+((end-begin)/1000)+"S");
}
}else{
System.out.println("========================BlockingQueue已空,已全部抓取完成!=======================");
}
} catch (Exception e) {
System.out.println("========================抓取异常=======================");
}
}
}
}

使用Jsoup爬取网站图片的更多相关文章

  1. jsoup爬取网站图片

    package com.ij34.JsoupTest; import java.io.File; import java.io.FileOutputStream; import java.io.Inp ...

  2. Python:爬取网站图片并保存至本地

    Python:爬取网页图片并保存至本地 python3爬取网页中的图片到本地的过程如下: 1.爬取网页 2.获取图片地址 3.爬取图片内容并保存到本地 实例:爬取百度贴吧首页图片. 代码如下: imp ...

  3. Day11 (黑客成长日记) 爬取网站图片

    #导入第三方库# coding:utf-8import requests,re #找到需要爬取的网站'http://www.qqjia.com/sucai/sucai1210.htm' #1>获 ...

  4. webmagic 二次开发爬虫 爬取网站图片

    webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. webmagic介绍 编写一个简单的爬虫 webmagic的使用文档:http://w ...

  5. 使用ajax爬取网站图片()

    以下内容转载自:https://www.makcyun.top/web_scraping_withpython4.html 文章关于网站使用Ajaxj技术加载页面数据,进行爬取讲的很详细 大致步骤如下 ...

  6. 【Python】爬取网站图片

    import requests import bs4 import urllib.request import urllib import os hdr = {'User-Agent': 'Mozil ...

  7. Jsoup爬取带登录验证码的网站

    今天学完爬虫之后想的爬一下我们学校的教务系统,可是发现登录的时候有验证码.因此研究了Jsoup爬取带验证码的网站: 大体的思路是:(需要注意的是__VIEWSTATE一直变化,所以我们每个页面都需要重 ...

  8. jsoup爬取某网站安全数据

    jsoup爬取某网站安全数据 package com.vfsd.net; import java.io.IOException; import java.sql.SQLException; impor ...

  9. Python爬虫学习(6): 爬取MM图片

    为了有趣我们今天就主要去爬取以下MM的图片,并将其按名保存在本地.要爬取的网站为: 大秀台模特网 1. 分析网站 进入官网后我们发现有很多分类: 而我们要爬取的模特中的女模内容,点进入之后其网址为:h ...

随机推荐

  1. JVM-GC算法(三)-分代收集算法

    对象分类 上次已经说过,分代收集算法是针对对象的不同特性,而使用合适的算法,这里面并没有实际上的新算法产生.与其说分代收集算法是第四个算法,不如说它是对前三个算法的实际应用.  首先我们来探讨一下对象 ...

  2. CodeForces 137A

    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Polyca ...

  3. eclipse 编辑器支持 Code Minings(代码挖掘)功能

    Java 编辑器支持 Code Minings 功能 Java 编辑器现在可以在 Java 元素的上方以“装饰文本”的形式显示实现和引用的数量,即 Code Minings(代码挖掘)功能 启用路径: ...

  4. Windows下Java JDK环境变量的配置

    注意:前提是你已经在电脑上安装了JDK 1.打开控制面板—系统和安全—系统,选择高级系统设置 2.选择环境变量 3. 然后看看用户变量中有没有JAVA_HOME和CLASSPATH变量 4.新建JAV ...

  5. flutter 单例

    flutter中的单例 class DataSave{ factory DataSave() => shared(); static DataSave _instance; DataSave._ ...

  6. 小D课堂 - 新版本微服务springcloud+Docker教程_汇总

    小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介 小D课堂 - 新版本微服务springcloud+Docker教程_1_02技术选型 小D课堂 - 新版本微服务s ...

  7. Java 语言实现 MD5 加密

    Java 语言实现 MD5 加密 背景说明 在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中. 这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么, ...

  8. 【D3D12学习手记】The Command Queue and Command Lists

    GPU有一个命令队列,CPU通过Direct3D API将命令提交到队列里来使用命令列表(command lists),如下图.当一套命令(a set of commands)已经被提交到命令队列,他 ...

  9. java:activiti(工作流简介 )

    1.工作流:(workflow) 整个工作的流程 eg:请假工作流 (我)员工-->组长-->经理-->主管-->人事-->总经理(董事会) eg:出差(报账)工作流 ( ...

  10. go语言20小时从入门到精通(六、工程管理)

    在实际的开发工作中,直接调用编译器进行编译和链接的场景是少而又少,因为在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系.如果这样一个文件一个文件逐步编译,那不亚于一场灾难. Go语 ...