一个简单粗暴的爬虫 - 必应今日美图

1. 必应今日美图

当使用bing搜索时,每天都会出现一副美图。

搜索找到bing今日美图  http://bing.plmeizi.com/

目前共47页

url格式按 http://bing.plmeizi.com/?page=*

点进去就是我们要的名称和名称

2. 开始编码

使用简单的Jsoup进行爬虫,很简单,很好理解。

HrmlUtil

 1 package util;
 2
 3 import java.io.IOException;
 4
 5 import org.jsoup.Jsoup;
 6 import org.jsoup.nodes.Document;
 7
 8 public class HtmlUtil {
 9     // 根据url从网络获取网页文本
10     public Document getHtmlTextByUrl(String url) {
11         Document doc = null;
12         try {
13             // doc = Jsoup.connect(url).timeout(5000000).get();
14             int i = (int) (Math.random() * 1000); // 做一个随机延时,防止网站屏蔽
15             while (i != 0) {
16                 i--;
17             }
18             doc = Jsoup.connect(url).data("query", "Java").userAgent("Mozilla").cookie("auth", "token").timeout(300000)
19                     .post();
20         } catch (IOException e) {
21             e.printStackTrace();
22             try {
23                 doc = Jsoup.connect(url).timeout(5000000).get();
24             } catch (IOException e1) {
25                 // TODO Auto-generated catch block
26                 e1.printStackTrace();
27             }
28         }
29         return doc;
30     }
31 }

GetPhoto

这个编码主要需要先分析html属性,按照属性取到我们需要的元素,元素值。

我是先拿到每个图的page页面url

然后到详情页面拿到图的url,图的名字截取。

然后将图保存到本地。

 1 package bing;
 2
 3 import java.io.DataInputStream;
 4 import java.io.File;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.net.URL;
 8
 9 import org.jsoup.nodes.Document;
10 import org.jsoup.nodes.Element;
11 import org.jsoup.select.Elements;
12
13 import util.HtmlUtil;
14
15 /**
16  *
17  * @author loveincode
18  * @data Sep 29, 2017 1:15:00 PM
19  */
20 public class GetPhoto {
21
22     public static void go(int startpage, int endpage) throws IOException {
23
24         HtmlUtil htmlutil = new HtmlUtil();
25         // 获取图片的绝对路径
26         String url = "http://bing.plmeizi.com/?page=";
27         for (int i = startpage; i <= endpage; i++) {
28             String gourl = url + i + "";
29             Document dochtml = htmlutil.getHtmlTextByUrl(gourl);
30             Elements elements_a = dochtml.getElementsByClass("item");
31             for (int x = 0; x < elements_a.size(); x++) {
32                 String pyotopage = elements_a.get(x).attr("href");
33                 Document dochtml_photo = htmlutil.getHtmlTextByUrl(pyotopage);
34                 Element elements_picurl = dochtml_photo.getElementById("picurl");
35                 String picurl = elements_picurl.attr("href");
36                 Element elements_searchlink = dochtml_photo.getElementById("searchlink");
37                 String name = elements_searchlink.getElementsByTag("span").get(0).html();
38                 name = name.split("\\(")[0];
39
40                 if (picurl.contains("jpg")) {
41                     // 下载图片
42                     URL url_pic = new URL(picurl);
43                     DataInputStream dataInputStream = new DataInputStream(url_pic.openStream());
44                     String imageName = name + ".jpg";
45                     FileOutputStream fileOutputStream = new FileOutputStream(new File("bing_pic/" + imageName));
46                     byte[] buffer = new byte[1024];
47                     int length;
48                     while ((length = dataInputStream.read(buffer)) > 0) {
49                         fileOutputStream.write(buffer, 0, length);
50                     }
51                     dataInputStream.close();
52                     fileOutputStream.close();
53                 }
54             }
55         }
56
57     }
58
59     public static void main(String[] args) throws IOException {
60         System.out.println("test");
61         go(1, 1);
62     }
63
64 }

Mythread

 1 package bing;
 2
 3 import java.io.IOException;
 4
 5 public class Mythread extends Thread {
 6
 7     private int startpage;
 8
 9     private int endpage;
10
11     public Mythread(int startpage, int endpage) {
12         this.startpage = startpage;
13         this.endpage = endpage;
14     }
15
16     @SuppressWarnings("static-access")
17     @Override
18     public void run() {
19         GetPhoto getPhoto = new GetPhoto();
20         try {
21             getPhoto.go(startpage, endpage);
22         } catch (IOException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         }
26     }
27 }RUN

RUN

采用多线程,开启多个线程同时爬取图片

 1 package bing;
 2
 3 import java.io.IOException;
 4
 5 /**
 6  *
 7  * @author loveincode
 8  * @data Sep 29, 2017 1:55:57 PM
 9  */
10 public class RUN {
11
12     public static void main(String[] args) throws IOException {
13
14         long startTime = System.currentTimeMillis(); // 获取开始时间
15
16         Mythread a1 = new Mythread(1, 5);
17         Mythread a2 = new Mythread(6, 10);
18         Mythread a3 = new Mythread(11, 15);
19         Mythread a4 = new Mythread(16, 20);
20         Mythread a5 = new Mythread(21, 25);
21         Mythread a6 = new Mythread(26, 30);
22         Mythread a7 = new Mythread(31, 35);
23         Mythread a8 = new Mythread(36, 40);
24         Mythread a9 = new Mythread(41, 45);
25         Mythread a10 = new Mythread(46, 47);
26
27         a1.start();
28         a2.start();
29         a3.start();
30         a4.start();
31         a5.start();
32         a6.start();
33         a7.start();
34         a8.start();
35         a9.start();
36         a10.start();
37
38         while (true) {
39             if (a1.isAlive() == false && a2.isAlive() == false && a3.isAlive() == false && a4.isAlive() == false
40                     && a5.isAlive() == false && a6.isAlive() == false && a7.isAlive() == false && a8.isAlive() == false
41                     && a9.isAlive() == false && a10.isAlive() == false) {
42                 long endTime = System.currentTimeMillis(); // 获取结束时间
43                 System.out.println("程序运行时间: " + (endTime - startTime) / 1000.0 + "s");
44                 break;
45             }
46         }
47     }
48
49 }

执行 RUN

耗时76.962s 完成图片下载到本地。

成功

效果:

很高清吧

时间: 2024-10-11 06:20:15

一个简单粗暴的爬虫 - 必应今日美图的相关文章

一个更加简单粗暴的爬虫-必应今日美图

今天上午看到一篇文章:一个简单粗暴的爬虫 - 必应今日美图.我也用自己的方式更加简单的实现了这个功能.下面我就贴一下自己的代码和思路. 我就不分析原博的思路了,原博写的很清楚.我用的是htmlunit,从原博的第三步开始,观察三级地址的规律,从http://bing.plmeizi.com/show/1-490开始爬取的.页面比较少,图片也不多,没用多线程. 1 import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException

一个简单的分布式爬虫

下载scrapy-redis: https://github.com/rmax/scrapy-redis 下载zip文件之后解压 建立两个批处理文件,start.bat和clear.batstart.bat的内容为redis-server redis.windows.confclear.bat的内容为redis-cli flushdb双击start.bat启动 这样就说明下好了,运行正常. 我们需要构建一个分布式爬虫系统:由一个master爬虫和slave爬虫组成,master端部署了redis

python实现的一个简单的网页爬虫

学习了下python,看了一个简单的网页爬虫:http://www.cnblogs.com/fnng/p/3576154.html 自己实现了一个简单的网页爬虫,获取豆瓣的最新电影信息. 爬虫主要是获取页面,然后对页面进行解析,解析出自己所需要的信息进行进一步分析和挖掘. 首先需要学习python的正则表达式:http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html 解析的url:http://movie.douban.com/ 查看

分享并开源一个简单粗暴的redmine测试报告系统

背景 软件测试的最后有一道比较繁琐的工作,就是编写测试报告.手写测试报告在数据统计和分析上面要耗费比较大的事件和精力.之前工作室使用mantis管理bug缺陷.公司有内部有个系统,可以直接从mantis上面获取数据并进行统计,生成一份测试报告.后来换了一个工作室,bug缺陷管理平台也从原来的mantis 换成了redmine (http://www.redmine.org/ ). 然后走上了一条手写测试报告的不归路(测试人员前期还是推荐手写测试报告的).搞游戏的都知道,平时加班加点压力就够大的.

一个简单粗暴的前后端分离方案

项目背景 刚刚参加完一个项目,背景:后端是用java,后端服务已经开发的差不多了,现在要通过web的方式对外提供服务,也就是B/S架构.后端专注做业务逻辑,不想在后端做页面渲染的事情,只向前端提供数据接口.于是协商后打算将前后端完全分离,页面上的所有数据都通过ajax向后端取,页面渲染的事情完全由前端来做.另外还有一个紧急的情况,项目要紧急上线,整个web站点的开发时间只有两周,两周啊!于是在这样的背景下,决定开始一次前后端完全分离的尝试. 之前开发都是同步渲染和异步渲染混搭的,有些东西可以有后

也写一个简单的网络爬虫

引子 在cnblogs也混了许久,不过碍于平日工作太忙,一篇随笔也没有写过.最近经常感觉到自己曾经积累过的经验逐步的丢失,于是开通了博客,主要是记录一下自己在业余时间里玩的一些东西. 缘起 言归正传.某次在在某高校网站闲逛,看到了一些有趣的东西想要保存起来,但是却分散在各个页面,难以下手.使用baidu,google却有无法避免的搜索到此站点之外的内容.于是就想如果有一个爬虫,可以抓取指定域名的某些感兴趣的内容,不是很好.在网上简单搜索了一下,简单的都不满意,功能强大的又太复杂,就想自己写一个.

一个简单的多线程爬虫

   本文介绍一个简单的多线程并发爬虫,这里说的简单是指爬取的数据规模不大,单机运行,并且不使用数据库,但保证多线程下的数据的一致性,并且能让爬得正起劲的爬虫停下来,而且能保存爬取状态以备下次继续. 爬虫实现的步骤基本如下: 分析网页结构,选取自己感兴趣的部分; 建立两个Buffer,一个用于保存已经访问的URL,一个用户保存带访问的URL; 从待访问的Buffer中取出一个URL来爬取,保存这个URL中感兴趣的信息:并将这个URL加入已经访问的Buffer中,然后将这个URL中的所有外链URL

大数据之网络爬虫-一个简单的多线程爬虫

   本文介绍一个简单的多线程并发爬虫,这里说的简单是指爬取的数据规模不大,单机运行,并且不使用数据库,但保证多线程下的数据的一致性,并且能让爬得正起劲的爬虫停下来,而且能保存爬取状态以备下次继续. 爬虫实现的步骤基本如下: 分析网页结构,选取自己感兴趣的部分; 建立两个Buffer,一个用于保存已经访问的URL,一个用户保存带访问的URL; 从待访问的Buffer中取出一个URL来爬取,保存这个URL中感兴趣的信息:并将这个URL加入已经访问的Buffer中,然后将这个URL中的所有外链URL

一个简单粗暴的前后端分离方案(转)

项目背景 刚刚参加完一个项目,背景:后端是用java,后端服务已经开发的差不多了,现在要通过web的方式对外提供服务,也就是B/S架构.后端专注做业务逻辑,不想在后端做页面渲染的事情,只向前端提供数据接口.于是协商后打算将前后端完全分离,页面上的所有数据都通过ajax向后端取,页面渲染的事情完全由前端来做.另外还有一个紧急的情况,项目要紧急上线,整个web站点的开发时间只有两周,两周啊!于是在这样的背景下,决定开始一次前后端完全分离的尝试. 之前开发都是同步渲染和异步渲染混搭的,有些东西可以有后