爬虫是什么


这里引用一下 wiki 中关于 网络爬虫的定义,相信大家看过后会有一个清晰的认识

网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。

网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。

爬虫访问网站的过程会消耗目标系统资源。不少网络系统并不默许爬虫工作。因此在访问大量页面时,爬虫需要考虑到规划、负载,还需要讲“礼貌”。 不愿意被爬虫访问、被爬虫主人知晓的公开站点可以使用robots.txt文件之类的方法避免访问。这个文件可以要求机器人只对网站的一部分进行索引,或完全不作处理。

互联网上的页面极多,即使是最大的爬虫系统也无法做出完整的索引。因此在公元2000年之前的万维网出现初期,搜索引擎经常找不到多少相关结果。现在的搜索引擎在这方面已经进步很多,能够即刻给出高质量结果。

爬虫还可以验证超链接和HTML代码,用于网络抓取(参见数据驱动编程)。


爬虫的核心


  • 分析目标网站的数据格式
  • 编写对应的代码爬取

分析目标网站的数据格式 这一步中我们需要仔细分析目标网站的html格式,寻找它们的内在联系,(如果是异步加载的数据处理起来比较麻烦一点,此处我们不做讲解),找出规律

编写对应的代码爬取 第二步我们需要伪造好我们的目标网站需要的请求头部分,同时根据第一步的规律解析出你想要的数据,然后保存即可


示例


package photo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements; import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* @author: latinos-bub
* @date: 2019/11/10 17:18
* @description: 爬取 https://image.so.com/ 网站的图片
* @className: CrawlSophoto
*/
public class CrawlSophoto { /**
* @Author latinos-bub
* @Description //TODO 获取页面中所有的 <img src/> 中的 src 链接 https://p5.ssl.qhimgs1.com/bdr/326__/t0104acadc3f46e94a5.jpg
* @Date 2019/11/10 17:20
* @Param [url]
* @return java.util.List<java.lang.String>
**/
public static List<String> getImgSrc(String url) throws Exception{ // 实例化 返回数据
List<String> imgSrcList = new ArrayList<String>(); // 使用 Jsoup 获取 document 文档对象
Document document = Jsoup.connect(url).get(); // 获取所有的 img 标签元素
Elements elements = document.getElementsByTag("img"); String srcUrl; // 遍历所有的 elements 元素,获取 <img src/> 中的 src 属性值 (不推荐使用,涉及的图片太多了,建议使用下面的 for 循环控制大小)
// for (Element e : elements){
// srcUrl = e.attr("src");
//
// // 添加入 imgSrcList 集合中
// imgSrcList.add(srcUrl);
// } for (int i = 0; i < 7; i++){ // 因为 https://image.so.com/ 图片默认是7个,采用的 异步加载,我们这里不处理这种的,只取默认的7个
srcUrl = elements.get(i).attr("src"); // 添加入 imgSrcList 集合中
imgSrcList.add(srcUrl);
} // 返回符合你要求的所有的 <img src/> 中的 src 链接
return imgSrcList;
} public static void saveImage(List<String> imgSrcList){ // 先设置 你的图片保存位置
String path = "E:\\本地图片\\爬虫图片\\20191110\\"; // 实例化一个 File 对象 (文件/文件夹)
File file = new File(path); // 如果上述目录不存在,则自动创建
if (!file.exists()){
file.mkdir();
} // 声明 HttpURLConnection 请求对象
HttpURLConnection httpURLConnection = null; // 声明 InputStream 输入字节流
InputStream inputStream = null; System.out.println("开始下载图片..."); // 循环遍历 imgSrcList
for (String src : imgSrcList){ try {
// 实例化 一个特定 http 类型的新的 URL 对象
URL url = new URL(src); // 实例化 HttpURLConnection 对象
httpURLConnection = (HttpURLConnection) url.openConnection(); // 设置 HttpURLConnection 请求头部分,通过 chrome 的 F12 查看
httpURLConnection.setRequestProperty("Cookie", "opqopq=0c01989c7413e5a5d21e68f310c397b5.1573377223; _S=03b161a0b5b7eaaadd261490c514a29d; __guid=16527278.863313966117013800.1573377222710.2178; count=1; tracker=; test_cookie_enable=null");
httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"); // 从 HttpURLConnection 请求对象中 实例化(获取) 输入字节流
inputStream = httpURLConnection.getInputStream(); // 声明 输出流对象, 并实例化为 一个 文件输出流对象; 这里很好理解,实例化文件输出流对象,肯定需要一个文件对象作参数
OutputStream outputStream = new FileOutputStream(new File(path + new Date().getTime() + ".jpg")); // 实例化一个 byte[] 对象,用于 io 缓冲区的大小设置
byte[] bytes = new byte[2048]; // 接收 每次读取到的 字节数
int len = 0; // 采用 while 循环,只要满足条件,一直循环执行
while ((len = inputStream.read(bytes)) != -1) { // 从 输入字节流 中读取内容
// 将 读取到的 字节 写入文件即可
outputStream.write(bytes, 0, len);
} }catch (Exception e){
System.out.println( "src为: " + src + " 的图片下载出错..." + e.getMessage());
continue;
} } System.out.println("下载图片完成..."); } public static void main(String[] args){ // 输入 https://image.so.com/ 进行测试
String url = "https://image.so.com/"; try {
// 先获取 src 路径
List<String> imgSrcList = getImgSrc(url); // 下载
saveImage(imgSrcList);
}catch (Exception e){
System.out.println("测试出错..." + e.getMessage());
} } }

结果展示



摸鱼儿·雁丘词 / 迈陂塘·雁丘词
-- 金朝:元好问

乙丑岁赴试并州,道逢捕雁者云:“今旦获一雁,杀之矣。其脱网者悲鸣不能去,竟自投于地而 死。”予因买得之,葬之汾水之上,垒石为识,号曰“雁丘”。 同行者多为赋诗,予亦有《雁丘词》。旧所作无宫商,今改定之。

问世间,情为何物,直教生死相许?

天南地北双飞客,老翅几回寒暑。

欢乐趣,离别苦,就中更有痴儿女。

君应有语:渺万里层云,千山暮雪,只影向谁去?

横汾路,寂寞当年箫鼓,荒烟依旧平楚。

招魂楚些何嗟及,山鬼暗啼风雨。

天也妒,未信与,莺儿燕子俱黄土。

千秋万古,为留待骚人,狂歌痛饮,来访雁丘处。

java爬取图片示例的更多相关文章

  1. Java jsoup爬取图片

    jsoup爬取百度瀑布流图片 是的,Java也可以做网络爬虫,不仅可以爬静态网页的图片,也可以爬动态网页的图片,比如采用Ajax技术进行异步加载的百度瀑布流. 以前有写过用Java进行百度图片的抓取, ...

  2. [python爬虫] 爬取图片无法打开或已损坏的简单探讨

    本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时 ...

  3. 爬取图片过程遇到的ValueError: Missing scheme in request url: h 报错与解决方法

    一 .scrapy整体框架 1.1 scrapy框架图 1.2 scrapy框架各结构解析 item:保存抓取的内容 spider:定义抓取内容的规则,也是我们主要编辑的文件 pipelines:管道 ...

  4. [译]Java Thread Sleep示例

    Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...

  5. [译]Java Thread join示例与详解

    Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...

  6. MinerHtmlThread.java 爬取页面线程

    MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...

  7. MinerConfig.java 爬取配置类

    MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...

  8. Java爬取网络博客文章

    前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...

  9. Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

随机推荐

  1. Python访问元组

    Python访问元组: 使用索引下标进行访问元组: # 通过索引下标进行访问 tuple_1 = ('a','b','c','d','e','f','g') # 输出元组中的第一个值 print(tu ...

  2. 4.22 省选模拟赛 三元组 manacher 回文自动机

    容易发现可以枚举j 那么只需要计算出 l~j这段是回文串的l的和 以及j+1~r这段是回文串的r的和. 可以manacher 之后想要求出以j为右端点的回文串左端点的和 这个东西我们通过某个点为中心的 ...

  3. 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图

    由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...

  4. luogu P6091 原根

    LINK:原根 再复习一下原根 防止考场上要NTT求原根的时候不会求... 这道题要求求出n之内的所有原根 根据原根的定义. 原根指 若x对于模n的阶为phi(n)且\(1\leq x\leq n\) ...

  5. luogu P3920 [WC2014]紫荆花之恋

    LINK:紫荆花之恋 每次动态加入一个节点 统计 有多少个节点和当前节点的距离小于他们的权值和. 显然我们不能n^2暴力. 考虑一个简化版的问题 树已经给出 每次求某个节点和其他节点的贡献. 不难想到 ...

  6. Eclipse Java EE IDE for Web Developers 4.5.1 安装hibername tools 插件

    方式一:在线安装(太慢) 方式二:离线安装,下载hibernate tools 插件到本地,然后在eclipse菜单栏点击 help: ①添加插件,选择下载后的插件,内容框中可选择hibernate ...

  7. JS笔记 语法

    javascript概述 简称为JS,是一款能够运行在JS解释器.引擎中的脚本语言 JS解释器.引擎 JS的运行环境 1.独立安装的js解释器 -nodeJS 2.嵌入在浏览器中的js解释器 JS基于 ...

  8. Python实现迪杰斯特拉算法

    首先我采用邻接矩阵法来表示图(有向图无向图皆可) 图的定义如下: class Graph: def __init__(self, arcs=[]): self.vexs = [] self.arcs ...

  9. java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片

    因为业务的需要,公司产品要求商品详情页面有个下载的功能 找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法 跟同事沟通后发现他那里有个下载的方法,不过是C#写 ...

  10. 刚体验完RabbitMQ?一文带你SpringBoot+RabbitMQ方式收发消息

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 这篇是消息队列RabbitMQ的第二弹. 上一篇的结尾我也预告了本篇的内容:利用RabbitTemplate和注解进行收发消息,还有一个我 ...