2021年Java爬虫技术教程(一小时实现)

article/2025/8/27 4:55:24

Java爬虫开发

操作要点

正则表达式
Java网络通信:URL
IO流
Map—HashMap
字符串操作
异常处理

项目已上传本人码云(gitee)传送门

如果这篇博客对你有一点点小帮助,希望您能给我来波一键三连;

前言

python优点:

1.各种爬虫框架,方便高效的下载网页;
2.多线程、进程模型成熟稳定,爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序效率,提升整个系统下载和分析能力。
3.gae 的支持,当初写爬虫的时候刚刚有 gae,而且只支持 python ,利用 gae 创建的爬虫几乎免费,最多的时候我有近千个应用实例在工作。

java 和 c++ :
相对脚本语言比较麻烦,所以放弃。总之,如果开发一个小规模的爬虫脚本语言是个各方面比较有优势的语言。如果要开发一个复杂的爬虫系统可能 java 是个增加选项, c++ 我感觉写个模块之类的更加适合。对于一个爬虫系统来说,下载和内文解析只是基本的两个功能。真正好的系统还包括完善的任务调度、监控、存储、页面数据保存和更新逻辑、排重等等。爬虫是一个耗费带宽的应用,好的设计会节约大量的带宽和服务器资源,并且好坏差距很大。

注意(爬虫爬取数据,必须是合法的数据,)

爬虫的类型

通用型的爬虫: 宽度遍历

		针对网页进行无差别抓取,例如Google搜索引擎和百度搜索引擎等等;(他们不生产网页内容,其内容都是类似的爬虫爬取来的)难点:页面下载和链接管理上,如果你要高效的抓取更多界面,就必须进行更快的下载;同时随着链接数量的增多,需要考虑如果对大规模的链接进行去重和调度,就成了一个很大的问题通用型爬虫框架:Nutch,     Heritrix

垂直型的爬虫

		关注内容与准确还有效率,仅仅抓取到有效有用的数据,并且在爬虫抓取之前,就能够对数据进行简单的处理:如:提取标题,内容,时间等;例如:股票财经,其涨跌幅度;难点:如何高效的定制一个爬虫,可以精确的抽取网页内容,并保存成结构化的数据。框架 :webmagic

本次代码实践所用技术

	模拟浏览器:HttpClient html解析:jsoup

1.在Module建立一个maven工程

(因为我提前建立了一个大的maven工程项目,本次为了节省时间,就不重新创建一个maven工程,直接利用现有的)
建立一个简单的maven,不选用现成的骨架
点击module在这里插入图片描述
选择好你需要的jdk版本,点击next
在这里插入图片描述
设置好工程名称,和域名倒写。点击finish
在这里插入图片描述
点击file,点击Project structure,再点击module
在这里插入图片描述
将 java设为Source 将resources 设为Resource
在这里插入图片描述
引入你需要的maven依赖

org.jsoup jsoup 1.10.3 org.apache.httpcomponents httpcore 4.4.10 org.apache.httpcomponents httpclient 4.5.6 commons-io commons-io 2.6
</dependencies>

建立好包
在这里插入图片描述
本次爬取网站:昵图网传送门 以一个图片网站作为本次爬取对象
在这里插入图片描述
在网站中审查元素:确定图片的html代码结构
crtl+(a标签里面的http://www.nipic.com/topic/show_27400_1.html)
分析html代码,观察里面的结点结构特点。建立一个URL的值,把里面所有的html的保存起来。
然后来处理里面的每一个html,再来根据里面的每一个html,来取这个界面中间的图片。
需要分开处理,img图片和上面的a标签,来爬取上面的图片,将图片保存起来。
在这里插入图片描述
创建一个UrlPool类,用来存放html。
代码全在我的gitee:传送门
对你有用的话,可以点个收藏关注;给我的gitee点一个star;谢谢;

package com;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** Created with IntelliJ IDEA.** @Auther: 孙伟俊* @Date: 2021/03/14/22:37* @Description:*/
//用来存放html
public class UrlPool {public static void main(String[] args) {getURL("http://www.nipic.com/");}private static void getURL(String baseUrl) {
//        创建一个map集合,传入要爬取的页面的url,并定义一个Boole型值,用于判断当前传入的url是否被遍历过;Map<String,Boolean> oldMap=new LinkedHashMap<String,Boolean>();
//        如果采集下来的路径是相对路径的话,要将相对路径进行String oldLinkHost="";
//        使用正则表达式,对路径进行占位符替换Pattern p=Pattern.compile("(http?://)?[^/\\s]*");Matcher m=p.matcher(baseUrl);if(m.find()){oldLinkHost=m.group();
//            取到正则之后的值//因为baseUrl,也是需要去爬取的,所以要将baseUrl的值,放入到这个集合中,因为未采集,所以定值为falseoldMap.put(baseUrl,false);oldMap=crawlLinks(oldLinkHost,oldMap);//遍历这个url,告诉他传入的值经过正则处理过,如果取到一个相对路径则进行拼接//返回的也是一个oldMap;(是个引用类型)for (Map.Entry<String,Boolean> mapping:oldMap.entrySet()){System.out.println("链接"+ mapping.getKey());}}}/*** @Description: 实现递归    对传入的url进行处理* @Param: [oldLinkList, oldMap]* @return: void* @Author: 孙伟俊* @Date: 2021/3/14*/private static Map<String,Boolean> crawlLinks(String oldLinkHost, Map<String, Boolean> oldMap) {Map<String,Boolean> newMap=new LinkedHashMap<String,Boolean>();//创建一个新的容器
//        如果url被遍历过,就不做遍历,String oldLink="";for (Map.Entry<String,Boolean> mapping: oldMap.entrySet()){System.out.println("链接"+ mapping.getKey()+"----check"+mapping.getValue());if(!mapping.getValue()){}oldLink=mapping.getKey();try{URL url=new URL(oldLink);HttpURLConnection connection=(HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");//如果拿到的响应值为responseCode=200if(connection.getResponseCode()==200){//读取所有的a标签   使用BufferedReader 缓冲区来接收,这样读取速度快一点,BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));//定义 a标签的正则表达式Pattern p = Pattern.compile("a.*?href=[\\\"']?((https?://)?/?[^\"']+)[\\\"']?.*?>(.+)</a>");Matcher matcher=null;String line="";//开始流操作while ((line=reader.readLine())!=null){matcher=p.matcher(line);if(matcher.find()){String newLink=matcher.group(1).trim();//判断newLink是否为合法的,如果newLink不以http开头,此时的newLink就是一个相对路径if(!newLink.startsWith("http")){if (newLink.startsWith("/")){newLink=oldLinkHost+newLink;}else {newLink=oldLinkHost+"/"+newLink;}}if(newLink.endsWith("/")){newLink=newLink.substring(0,newLink.length()-1);}//判断url有没有重复if(!oldMap.containsKey(newLink)&&!newMap.containsKey(newLink)&&!newLink.startsWith(oldLinkHost)){newMap.put(newLink,false);}}}}}catch (Exception e){}finally {}oldMap.replace(oldLink,false,true);}if(!newMap.isEmpty()){//将新的url集合和oldMap进行合并oldMap.putAll(newMap);oldMap.putAll(crawlLinks( oldLinkHost, oldMap));}return oldMap;}}

运行上面的UrlPool类,得到下面的控制台输出:
为了拿到被爬取的内容图片,对内容解析并持久化,创建ImageCrawl类
这一部分:因为考虑到待会教程太长了,放到下一篇博客中说明;

对内容解析并持久化:放在下一篇博客教程中;

后续我会对本次爬虫中涉及的技术的内容,整理出相关博客:

正则表达式
Java网络通信:URL
IO流
Map—HashMap
字符串操作
异常处理

本人技术有限,如中间出现什么错误,欢迎大家在评论区指出,希望大家多多支持;

点赞+加一键三连


http://chatgpt.dhexx.cn/article/sWwNseKf.shtml

相关文章

java 爬虫大型教程(一)

java 爬虫大型教程&#xff08;一&#xff09; 写在开始前&#xff0c;既然是大型教程&#xff0c;那就从最初始的环境变量开始搭建说起。 电脑环境:我的电脑是macbook pro&#xff0c;因此系统环境变量配置是和Windows不一样的&#xff0c;如果你的电脑是Windows系统&#x…

java 爬虫 sessionid_java爬虫实战之模拟登陆

使用jsoup工具可以解析某个URL地址、HTML文本内容&#xff0c;是java爬虫很好的优势&#xff0c;也是我们在网络爬虫不可缺少的工具。本文小编带领大家使用jsoup 实现java爬虫模拟登陆&#xff0c;通过省力的API&#xff0c;很好的实现java爬虫模拟登陆。 一、使用工具&#xf…

java爬虫框架视频_Java爬虫博客采集系统视频教程

资源介绍 教程名称&#xff1a;Java爬虫博客采集系统视频教程xa0 教程目录&#xff1a; 【java爬虫博客采集系统】视频教程第00讲[20分钟] - 系统演示xa0 【java爬虫博客采集系统】视频教程第01讲[08分钟] - 博客爬虫模块Axa0 【java爬虫博客采集系统】视频教程第02讲[21分钟] …

Java版爬虫,爬网页,爬小说,完整教程,一看就会

昨天小编看到了一部不错的小说&#xff0c;但是没有办法下载&#xff0c;只能一页一页地看&#xff0c;于是想到了爬虫&#xff0c;现在Java也有了爬虫的框架&#xff0c;很简单&#xff0c;就算小白也能轻易入门&#xff0c;话不多说&#xff0c;直接上手。 1.首先引入相关依…

java-jsoup爬虫

1. 介绍 Jsoup是Java中的一个包&#xff0c;可以用于爬取页面中的数据 Jsoup爬取数据分为以下几个步骤&#xff1a; 1. 获取所爬取网页的Document对象 2. 找到所爬取数据所在的父级标签&#xff0c;将其从Document对象中解析出来&#xff0c;解析出来的内容放置在Element对象…

java爬虫 教程_Java爬虫其实也很简单,教你实用的入门级爬虫

原标题&#xff1a;Java爬虫其实也很简单&#xff0c;教你实用的入门级爬虫 任何语言都是可以爬虫的&#xff0c;只要你懂的常用的http协议啥的就可以模仿浏览器的行为获取你想要的数据。这里我将教大家一个简单实用的案例&#xff1a;如何获取全民K歌的下载链接。 ps: 这主要是…

java爬虫视频教程_JAVA开发教程:java视频教程java爬虫实战项目 百度网盘

– 源码 – 0 B |- 猫了个咪-更多IT精品课程.html – 41.00 kB |- 猫了个咪–it视频论坛.url – 51 B |- 22_项目优化三&#xff1a;邮件提醒.mp4 – 345.30 MB |- 21_项目优化二&#xff1a;爬虫项目监控[itjc8.com].mp4 – 353.40 MB |- 20-4_项目优化一&#xff1a;解决频繁…

手把手Java爬虫教学 - 1. 了解爬虫

一、什么是爬虫 先来看一下百度百科&#xff0c;了解一下爬虫~ 我们通过爬虫主要的目的就是爬取数据&#xff0c;好比 A 网站、B 网站有我们所需要的内容&#xff0c;但是这两个网站并没有给我们提供接口&#xff0c;那我们怎么能拿到上面的数据呢&#xff1f; 这时候我们就可…

java爬虫教程:模拟用户表单登录

转自&#xff1a;http://xiaolongonly.cn/2016/06/01/Reptile3/ 这个是爬虫教程第三篇&#xff0c;教大家如何模拟用户表单登录。 前期准备&#xff1a; JSOUP 1.83 jar包 Eclipse 任意版本能运行java就行 谷歌浏览器 第一步&#xff1a;依然是分析页面结构 我们要模拟C…

REmap包介绍及使用

2019独角兽企业重金招聘Python工程师标准>>> #REmap包简介 #包安装 #remapH函数 #remapH案例 #get_theme函数 #remapC函数 #markLineControl函数 #markPointControl函数 #remapC案例 REmap包简介 REmap包是R与echart的对接&#xff0c;在R里调用echar的api直接作图&…

用R语言绘制动态地图,代码奉上!(REmap包详解)

options(remap.ak="MY07CLhm3wKi4N2tQ6WP4kzz21BBZagI") 安装包 library(devtools) install_github(badbye/baidumap) install_github(lchiffon/REmap) baidumap包函数说明 getBaiduMap函数 getBaiduMap(location, width = 400, height = 400, zoom = 10, scale = …

remap()

学习自&#xff1a;【OpenCV入门教程之十七】OpenCV重映射 重映射&#xff0c;就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

REmap绘制地图

本文出自&#xff1a; http://blog.csdn.net/wzgl__wh/article/details/53108754 REmap这个包是通过调用百度地图API的一个程序包&#xff0c;与Google的ggmap包相比&#xff0c;不用翻墙就可以使用。其函数主要有&#xff1a;remap()&#xff0c;remapB()、remapC()、remapH()…

R语言:使用REmap绘制超炫酷的地图

REmap这个包是通过调用百度地图API的一个程序包,与Google的ggmap包相比,不用翻墙就可以使用。其函数主要有:remap(),remapB()、remapC()、remapH()四个。该程序包目前要github网站上,因此我们需要从github上面下载安装。 install.packages("devtools")#如果安装…

ioremap()

活动地址&#xff1a;CSDN21天学习挑战赛 前言 之前&#xff0c;我们使用 devmem 命令的方式&#xff0c;直接操作寄存器&#xff0c;控制 LED 的亮灭。 今天&#xff0c;我们在内核中使用 ioremap() 来实现该功能。 物理地址 vs 虚拟地址 在嵌入式 Linux 中&#xff0c;通常…

STM32和GD32的GPIO引脚的default(默认) alternate(引脚复用) remap(引脚重映射)三种用法 别把复用和重映射当一回事儿

STM32有很多内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用 重映射就是引脚重映射&#xff0c;本来每个内置外设都有原来设…

OpenCV函数remap详解

OpenCV函数remap详解 remap的作用是将原影像映射到目标影像的函数。 这是OpenCV文档中的说明。 但这个描述给人的感觉是&#xff0c;云里雾里&#xff0c;到底是需要计算目标到原的映射关系&#xff0c;还是原到目标的映射呢。 经过我的实验发现是需要给出目标到原的映射关系…

remap函数

cvRemap( img1, img1r, mx1, my1 );在这个函数中mx1、my1是由前面函数计算出的校正系数&#xff0c;其指明了具体像素重新分配的位置。在learning opencv的12.3自带程序中可以发现&#xff0c;一般来说my1的值是比较集中的&#xff0c;mx1的值是比较分散的&#xff0c;这满足基…

Python-OpenCV 的 remap函数

恒等映射 result_img 和 原图一模一样 import cv2 import numpy as npimg cv2.imread("OpenCV.png") rows, cols, ch img.shape mapx np.ones(img.shape[:2], np.float32) mapy np.ones(img.shape[:2], np.float32) for i in range(rows):for j in range(cols)…

STM32重映射(Remap)

STM32重映射&#xff08;Remap&#xff09; 在外设的初始化中默认为Default重映射函数复用功能 在外设的初始化中默认为Default 在参考手册中 均有USART1的功能&#xff0c;但是若是想要用PB6与PB7作为USART1_TX与USART1_RX则需要用到重映射。 使用PA9 PA10只需要直接配置就…