-
2021-08-01 11:29:17
一、网络爬虫
网络爬虫(又称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
通俗的讲,爬虫就是能够自动访问互联网并将网站内容下载下来的的程序或脚本,类似于一个机器人,能把别人网站的信息弄到自己的电脑上,再通过做一些过滤,筛选,归纳,整理,排序等操作,得到你想要的数据信息。二、学习目的
1.制定个人搜索引擎,利用爬虫采集互联网的信息
2.在大数据时代,采集数据,从而进行数据分析,获取有价值的信息
3.学习爬虫,可以更深层次地理解搜索引擎爬虫的工作原理,从而可以更好地进行搜 索引擎优化
4.就业三、java爬虫和python爬虫的区别
python:①代码简洁,代码量相对较少,容易上手 ②多线程、进程模型成熟稳定
③各种爬虫框架
java:有很多解析器,对网页的解析支持很好,适合处理复杂的网页四、爬虫过程
1.环境准备(导入爬虫所需的库)
2.使用程序模拟浏览器,发送请求(相当于打开浏览器,输入网址,并按回车)
3.获取响应内容(得到一个Response,即所需要的获取的内容,相当于服务器接收客户端的请求,进过解析发送给浏览器的网页HTML文件)
4.解析内容(通过使用正则表达式、Jsoup等方法对获取的内容进行解析)
5.保存数据(可以将筛选的信息保存到文件中或数据库中,相当于我们在浏览网页时,下载了网页上的照片或者视频)更多相关内容 -
java爬虫入门
2018-07-19 11:55:14简单的java爬虫实现,使用 httpclient 、jsoup 、线程池等技术爬取了nba官网的nba球员数据,打包前刚刚重新调试代码,可以直接运行 -
Java爬虫入门
2022-04-11 16:21:46Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发的。 环境准备 pom.xml <dependency> <groupId>org.apache....Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发的。
环境准备
pom.xml
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency>
log4j.properties
log4j.rootLogger=DEBUG,A1 log4j.logger.cn.itcast = DEBUG log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
URLConnection
URLConnection 是 JDK 自带的一个抽象类,其代表应用程序和 URL 之间的通信链接。在网络爬虫中,我们可以使用 URLConnection 请求一个 URL 地址,然后获取流信息,通过对流信息的操作,可获得请求到的实体内容。
代码演示
package cn.itcast; import org.junit.Test; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; /** * 演示原生JDK-API-URLConnection发送get和post请求 */ public class JDKAPITest { @Test public void testGet() throws Exception{ //1.确定首页的URL URL url = new URL("http://www.itcast.cn/?username=zhangsan"); //2.通过url对象获取远程连接 HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); //3.设置请求方式 请求参数 请求头 urlConnection.setRequestMethod("GET"); //设置请求方式的时候一定要大写, 默认的请求方式是GET urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"); urlConnection.setConnectTimeout(30000); //连接超时 单位毫秒 urlConnection.setReadTimeout(30000); //读取超时 单位毫秒 //4.获取数据 InputStream in = urlConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; String html = ""; while ((line = reader.readLine()) != null) { html += line + "\n"; } System.out.println(html); in.close(); reader.close(); } @Test public void testPost() throws Exception{ //1.确定首页的URL URL url = new URL("http://www.itcast.cn"); //2.获取远程连接 HttpURLConnection urlConnection =(HttpURLConnection) url.openConnection(); //3.设置请求方式 请求参数 请求头 urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); // 原生jdk默认关闭了输出流 urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"); urlConnection.setConnectTimeout(30000); //连接超时 单位毫秒 urlConnection.setReadTimeout(30000); //读取超时 单位毫秒 OutputStream out = urlConnection.getOutputStream(); out.write("username=zhangsan&password=123".getBytes()); //4.获取数据 InputStream in = urlConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; String html = ""; while ((line = reader.readLine()) != null) { html += line + "\n"; } System.out.println(html); in.close(); reader.close(); } }
HttpClient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。其相比于传统 JDK 自带的 URLConnection,增加了易用性和灵活性。其功能主要是用来向服务器发送请求,并返回相关资源。在网络爬虫实战中,经常使用 HttpClient 获取网页内容,使用 jsoup 解析网页内容。
演示代码
package cn.itcast; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.junit.Test; import java.util.ArrayList; import java.util.List; /** * Author itcast * Date 2020/5/4 14:30 * Desc */ public class HttpClientTest { /** * 测试HttpClient发送Get请求 */ @Test public void testGet() throws Exception { //0.创建配置 RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(10000)//设置连接的超时时间 .setConnectTimeout(10000)//设置创建连接的超时时间 .setConnectionRequestTimeout(10000)//设置请求超时时间 //.setProxy(new HttpHost("123.207.57.145", 1080, null))//添加代理 .build(); //1.创建HttpClient对象 //HttpClient httpClient = new DefaultHttpClient();//不用 //CloseableHttpClient httpClient = HttpClients.createDefault();//简单API CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();//常用 //2.创建HttpGet请求 String uri = "http://yun.itheima.com/search?so=java"; HttpGet httpGet = new HttpGet(uri); //或者单独给httpGet设置 //httpGet.setConfig(requestConfig); //3.设置请求头 httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"); CloseableHttpResponse response = null; try { //4.使用HttpClient发起请求 response = httpClient.execute(httpGet); //5.判断响应状态码是否为200 if (response.getStatusLine().getStatusCode() == 200) { //6.获取响应数据 String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } } catch (Exception e) { e.printStackTrace(); } finally { //6.关闭资源 response.close(); httpClient.close(); } } /** * 测试HttpClient发送Post请求 */ @Test public void testPost() throws Exception { //1.创建HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //2.创建HttpPost请求 HttpPost httpPost = new HttpPost("http://yun.itheima.com/search"); //3.准备参数 List<NameValuePair> params = new ArrayList(); params.add(new BasicNameValuePair("so", "java")); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, "UTF-8"); //4.设置参数 httpPost.setEntity(formEntity); //5.发起请求 CloseableHttpResponse response = null; try { response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == 200) { //6.获取响应 String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } } catch (Exception e) { e.printStackTrace(); } finally { //7.关闭资源 response.close(); httpClient.close(); } } /** * 测试HttpClient连接池 */ @Test public void testPool() throws Exception { PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); //设置最大连接数 cm.setMaxTotal(200); //设置每个主机的并发数 cm.setDefaultMaxPerRoute(20); doGet(cm); doGet(cm); } private static void doGet(PoolingHttpClientConnectionManager cm) throws Exception { CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); //在下一行加断点 HttpGet httpGet = new HttpGet("http://www.itcast.cn/"); CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content.length()); } } catch (Exception e) { e.printStackTrace(); } finally { //释放连接 response.close(); //不能关闭HttpClient //httpClient.close(); } } }
代理服务器
代理服务器(Proxy Server)是网上提供转接功能的服务器,一般情况下,我们使用网络浏览器直接连接其他Internet站点取得网络信息。代理服务器是介于客户端和 Web 服务器之间的另一台服务器,基于代理,浏览器不再直接向 Web 服务器取数据,而是向代理服务器发出请求,信号会先送到代理服务器,由代理服务器取回浏览器所需要的信息。简单的可以理解为中介。
在网络爬虫中,使用代理服务器访问站点内容,能够隐藏爬虫的真实 IP 地址,从而防止网络爬虫被封。另外,普通网络爬虫使用固定 IP 请求时,往往需要设置随机休息时间,而通过代理却不需要,从而提高了爬虫的效率。
目前,代理可以来源于提供免费代理地址以及接口的网站(如https://proxy.mimvp.com/freeopen),但这些免费的代理 IP 都是不稳定的。另外,也可通过购买的方式使用代理,其提供的代理 IP 可用率较高,稳定性较强注释
@Test: 该方法可以不用main方法调用就可以测试出运行结果,是一种测试方法一般函数都需要有main方法调用才能执行,注意被测试的方法必须是public修饰的
-
java爬虫入门示例,源码
2018-08-14 21:03:36java爬虫入门示例,包含所有源码。 主要实现了爬取大众点评商户基本信息 新手入门或者参考可用 -
Java爬虫入门案例
2018-04-05 23:50:20这是一个使用Java开发的网络爬虫的Demo, 实现了从网页中抓取数据,存储到数据库的功能。项目中给出了数据库的脚本文件。是一个JavaWeb项目,可以在前端输入要抓取的网页网址。 -
Java爬虫入门(一)
2020-03-23 11:11:38package 爬虫; import java.io.*; import java.net.*; public class pachong1 { public static void main(String[] args) { //设置爬取网页的网址 String strurl = "https://www.w3cschool.cn/java/java-...package 爬虫; import java.io.*; import java.net.*; public class pachong1 { public static void main(String[] args) { //设置爬取网页的网址 String strurl = "https://www.w3cschool.cn/java/java-tutorial.html"; try{ //先拿到这个url URL url = new URL(strurl); //通过url建立与网页之间的连接 URLConnection com = url.openConnection(); //通过这个连接呢,取得这网页返回回来的数据 InputStream word = com.getInputStream(); System.out.println(com.getContentEncoding()); //按行读取网页的数据,并进行内容分析 //使用BufferedReader和InputStreamReader把字节流转化成字符流的缓冲流(=。= 禁止套娃) //字符编码设置gbk或者utf8 BufferedReader br = new BufferedReader(new InputStreamReader(word,"utf8")); //创建一个String来装这些字符串 String line = null; //去除空行 遍历打印 while ((line = br.readLine()) != null){ System.out.println(line); } //关闭缓冲 br.close(); }catch (Exception e){ e.printStackTrace(); } } }
-
java爬虫入门视频+solor技术合集
2017-11-02 10:21:04爬虫技术入门视频。另外附带有solor视频教程。我也是爬虫技术的初学者,愿大家能共同进步 -
java爬虫入门---WebMagic
2019-01-31 13:30:42一、爬虫框架的使用 爬虫的底层实现 :HttpClient + Jsoup,这里使用别人做好的的爬虫框架的轮子,可以省略我们绝大多数步骤! webmagic 的设计目标是尽量的模块化,并体现爬虫的功能特点。这部分提供非常简 单、...一、爬虫框架的使用
爬虫的底层实现 :HttpClient + Jsoup,这里使用别人做好的的爬虫框架的轮子,可以省略我们绝大多数步骤!
webmagic 的设计目标是尽量的模块化,并体现爬虫的功能特点。这部分提供非常简
单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。
1.2、主要特色
- 完全模块化的设计,强大的可扩展性。
- 核心简单但是涵盖爬虫的全部流程,灵活而强大,也是学习爬虫入门的好材料。
- 提供丰富的抽取页面API。
- 无配置,但是可通过POJO+注解形式实现一个爬虫。
- 支持多线程。
- 支持分布式。
- 支持爬取js动态渲染的页面。
- 无框架依赖,可以灵活的嵌入到项目中去
1.3、官网
二、使用
2.1、 引入webMagic的依赖
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency>
2.2、爬取指定内容(XPath)
如果我们想爬取网页中部分指定的内容,需要指定xpath。关于xpath这里就不再多说主要就是指定xml元素的位置!
列如://*[@id=\"nav\"]/div/div/ul/li[5]/a
以上代码的含义:id为nav的节点下的div节点下的div节点下的ul下的第5个li节点下的a节点
2.3、整体代码
package cn.gxm.webmagic; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.processor.example.GithubRepoPageProcessor; /** * @author GXM * @date 2019/1/31 * 自己的process */ public class MyProcessor implements PageProcessor { /** * 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等 */ private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); /** * process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑 * @param page */ public void process(Page page) { // 部分二:定义如何抽取页面信息,并保存下来 // 正则表示爬去那个页面 例如 scdn的博客地址类型 https://blog.csdn.net/mumu1998/article/details/86528729 page.addTargetRequests(page.getHtml().links() .regex("https://blog.csdn.net/[a-z A-Z 0-9]+/article/details/[0-9]{8}") .all()); //关于 xpath 路径 可以使用 浏览器工具 获取每篇博客的 nickname 昵称 String nickname = page.getHtml().xpath("//*[@id=\"uid\"]").toString(); System.out.println(nickname); } public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new MyProcessor()) //从"https://blog.csdn.net"开始抓 .addUrl("https://blog.csdn.net") .run(); } }
2.4、结果说明
这里可以看到是把整个连接抓取过来了,如果我只想获取nickename (csdn官方博客 、果冻虾仁等 )可以更改 xpath 如下: //*[@id=“uid”]/text()3、总结
我这里只是做了一个简单的demo,轮子别人已近造好了,我们拿来使用即可!大家也可以看官方文档,也很详细!!
-
Java爬虫入门(一)——项目介绍
2018-08-06 19:26:05前言: 突然心血来潮想学一下爬虫,本来是打算学python的(学习成本不高),不过既然是搞java的,那就用java好啦,毕竟知识可以复用,而且java的爬虫框架库也不少。...java爬虫入门 爬虫一般分三步: 1. 建立... -
Java爬虫入门【两种请求方式爬取,设置相关配置参数以及封装HttpClient工具】
2020-08-04 11:25:27Java爬虫入门 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著 名的网络爬虫工具 Nutch 便是采用 Java 开发 2.2.2.1.环境准备 pom.xml <dependencies> <!--... -
java爬虫入门jsoup入门(简单示例,五分钟)
2020-10-14 01:37:281. 创建一个java工程 我每次都创建一个springboot工程,不管用不用的上,感觉方便。 2.在pom.xml添加jsoup依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</... -
java爬取读者文摘文章(java爬虫入门实战练习)
2019-07-27 22:50:38java爬虫入门练习实战 代码仅用于学习研究 代码直接可以运行(需要Jsoup包),需要在E盘下面创建一个FileTest文件夹存储文件或修改代码中的文件路径。 import java.io.File; import java.io.FileOutputStream; ... -
Java爬虫从入门到精通
2021-06-13 06:26:54本课程是java大数据系列课程的数据采集部分,通过java爬虫技术从互联网进行在线数据采集,存储。对于本课程学习要求具有一定的java编程基础。通过本课的学习,能够掌握爬虫技术原理,数据采集的原则,数据采集的方式... -
java 简单爬虫入门maven项目
2020-10-05 18:14:08java 简单爬虫入门maven项目 -
Java爬虫入门(三)——正则表达式
2018-04-25 21:40:41Java爬虫入门(一)——项目介绍 Java爬虫入门(二)——HttpClient请求 Java爬虫入门(三)——正则表达式 Java爬虫入门(四)——线程池和连接池 Java爬虫入门(五)——缓冲流写入 GitHub地址: ... -
Java爬虫入门实例
2016-10-20 13:23:53想copy个爬虫玩玩,结果提到用的jar包是apache的http客户端开源项目---HttpClient 就下载了一个版本4.3 HttpClient httpclient = new HttpClient(); 结果遇到这句就给跪了 提示Cannot instantiate the type ... -
java爬虫入门篇
2018-04-14 16:12:39Java爬虫入门篇(Spider Begin) 说到爬虫,在做这个项目之前我也是一头雾水,不知道到底这是个什么鬼,就是感觉很牛逼的一个东西(听起来很高大上),但是自己上手之后才明白,所有的项目基本上都差不多,只要你... -
Java爬虫入门篇(三)使用 cdp4j 抓取需要渲染的网页
2021-04-22 07:43:48场景描述:一些网站的 response 中拿不到我们想要的数据,这些数据是在浏览器渲染后才显示在页面上的解决方案:上一篇中我介绍了使用 cdp4j 直接在Java端调用 chrome 浏览器,返回浏览器渲染后的html,简单粗暴,... -
java爬虫系列(一)——爬虫入门
2017-12-31 14:09:32爬虫框架介绍 Heritrix 优势 劣势 简单demo地址 crawler4j 优势 劣势 简单demo地址 WebMagic 优势 劣势 简单demo地址 ...快速入门 ...java爬虫框架非常多,比如较早的有Heritrix,轻量级的crawler4j... -
Java爬虫入门简介(二) —— Jsoup解析HTML页面
2017-08-25 22:05:51Java爬虫入门简介(一) —— HttpClient请求(本文) Java爬虫入门简介(二) —— Jsoup解析HTML页面(本文) 上一篇博客 我们已经介绍了如何使用HttpClient模拟客户端请求页面了。这一篇博客我们将描述... -
java小爬虫入门案例
2018-09-28 19:30:27java小的爬虫入门,使用jsoup入门案例,可以参考看看,免费看 -
JAVA爬虫入门实例(详细)
2019-04-02 17:06:01JAVA爬虫入门实例(详细)前言一、创建连接功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...