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. Function和Object 应该知道的

    javascript有5种基础的内建对象(Fundamental Objects),Object.Function.Error.Symbol.Boolean,而Object/Function尤为特殊, ...

  2. linux安装mysql可视化界面

    之前是一直用shell交互界面,但是最近频繁地检查数据库中的数据感觉特别麻烦,便装了一个可视化工具. 安装: $ sudo apt-get install mysql-workbench [sudo] ...

  3. Redis5.0 3台主机三主三从部署Cluster集群

    1.下载安装 [root@ip101 redis-5.0.4]# pwd /opt/app/redis-5.0.4 [root@ip101 redis-5.0.4]# ls 00-RELEASENOT ...

  4. sklearn3_svc分类器预测

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  5. [SQL Server 视图的创建- (create view必须是批处理中仅有的语句问题)]

    当我们SQL Server在创建视图时 ,会出现"create view 必须是批处理中仅有的语句"这个语法错误提示 ,实际上这本身没什么错! 因为create view 必须是批 ...

  6. centos的KVM初级安装

    什么是KVM虚拟化技术?KVM(Kernel-based Virtual Machine),主流虚拟化技术之一,集成与Linux2.6之后版本中,通过linux内核提供任务调度及管理.kvm,在实现虚 ...

  7. phpStudy本地搭建wordpress教程

    一.启用phpStudy环境包 phpStudy简单易用,一键启动配置本地环境; 二.wordpress博客程序 登陆wordpress官网下载最新程序,解压后提取wordpress目录下全部文件到p ...

  8. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_3 PathVariable注解

    请求地址都一样,根据不同的请求方式,最终让不同的方法去执行.这就是restfull的风格 如果有两个查询都是get的.那么当前访问 满足条件的就是两个. 用一个占位符 {id} 演示PathVaria ...

  9. koa2-connect-history-api-fallback 使用

    单页面应用程序(SPA)通常使用一个web浏览器可以访问的索引文件,比如index.html,然后,在HTML5 History API的帮助下(vue-router就是基于History API实现 ...

  10. 卷积的三种模式:full、same、valid + 卷积输出size的计算

    转自https://blog.csdn.net/u012370185/article/details/95238828 通常用外部api进行卷积的时候,会面临mode选择. 这三种mode的不同点:对 ...