手把手教你从零开始开办公司,怎么写java爬虫


本文将手把手地教大家从零开始用Java写一个简单地爬虫!

手把手教你从零开始用Java写爬虫

目标

爬取全景网图片,并下载到本地

收获

通过本文,你将复习到:

  • IDEA创建工程
  • IDEA导入jar包
  • 爬虫的基本原理
  • Jsoup的基本使用
  • File的基本使用
  • FileOutputStream的基本使用
  • ArrayList的基本使用
  • foreach的基本使用

说明

爬虫所用的HTM解析器为Jsoup。Jsoup可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup相关API整理见文末附录一。

开始

一、前端分析

1、使用Chrome或其他浏览器,打开全景网,按F12进入调试模式,分析网页结构。(这里选的是“创意”=>“优山美地”)

手把手教你从零开始用Java写爬虫

2、找规律,看图片对应的结构是什么。可以发现,每个图片的结构都如下图红框所示。

手把手教你从零开始用Java写爬虫

3、找到结构后再找图片链接。进一步分析后发现,图片链接可以是下图红框部分。

手把手教你从零开始用Java写爬虫

4、复制到浏览器打开看看验证下。(好吧,访问这个URL直接给我下载了…)

手把手教你从零开始用Java写爬虫手把手教你从零开始用Java写爬虫

5、前端部分分析完毕,接下来就可以用Java编码了!

二、爬取思路

通过Java向全景网发送GET请求,以获取HTML文件。Jsoup解析后寻找class=item lazy的a标签,他的child节点(即<img>)就是我们要找的目标节点了,搜索到的应当是一个ArrayList。然后遍历集合,从中搜寻图片的URL,并下载到本地保存。(更深一步,可以下载完一页后,继续下载后一页,直至全部下完。本文直讲下载第一页。提示一下,链接后面的topic/1其实就是当前页数)

三、Java编码

1、先下载Jsoup jar包,并导入到IDEA工程中。

手把手教你从零开始用Java写爬虫手把手教你从零开始用Java写爬虫

2、新建Java工程。

手把手教你从零开始用Java写爬虫手把手教你从零开始用Java写爬虫手把手教你从零开始用Java写爬虫

3、简单测试下get请求,若请求成功,则进入下一步;若报错,检查URL是否带了中文。

注意:链接没给,否则文章审核不过,注意自己添加!!!

package com.sxf;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;public class Main { public static void main(String[] args) { try { Document doc = Jsoup.connect("").get(); //这里加链接 System.out.println(doc); }catch (Exception e){ e.printStackTrace(); } }}

手把手教你从零开始用Java写爬虫

4、寻找class为item lazy的元素,找到他的child节点,返回ArrayList。并将图片的URL单独提取出来。

注意:链接没给,否则文章审核不过,注意自己添加!!!

注意:链接没给,否则文章审核不过,注意自己添加!!!

手把手教你从零开始用Java写爬虫

5、我们先尝试用Jsoup下载一张图片试试效果。

注意:链接没给,否则文章审核不过,注意自己添加!!!

// 获取responseConnection.Response imgRes = Jsoup.connect(URLS.get(0)).ignoreContentType(true).execute();FileOutputStream out = (new FileOutputStream(new java.io.File("demo.jpg")));// imgRes.body() 就是图片数据out.write(imgRes.bodyAsBytes());out.close();

可以看到在当前工程路径下,生成了demo.jpg图片,并且显示正常!

手把手教你从零开始用Java写爬虫

6、接下来,我们要创建一个文件夹,用来专门存放图片。

File相关API整理见文末附录二。

//当前路径下创建Pics文件夹File file = new File("Pics");file.mkdir();System.out.println(file.getAbsolutePath());

手把手教你从零开始用Java写爬虫

7、接下来开始遍历图片并下载。由于图片较多,为了简单起见,我们保存图片时候的名称,就从1开始依次增吧。

// 遍历图片并下载int cnt = 1;for (String str : URLS) { System.out.println(">> 正在下载:"+str); // 获取response Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute(); FileOutputStream out = (new FileOutputStream(new java.io.File(file, cnt+".jpg"))); // imgRes.body() 就是图片数据 out.write(imgRes.bodyAsBytes()); out.close(); cnt ++;}

运行结果

手把手教你从零开始用Java写爬虫

到此编码部分也结束了,完整代码见文末附件三!

附录一

Jsoup(HTML解析器)

继承关系:Document继承Element继承Node。TextNode继承Node。->java.lang.Object ->org.jsoup.nodes.Node ->org.jsoup.nodes.Element ->org.jsoup.nodes.Documenthtml文档:Document元素操作:Element节点操作:Node官方API:***/apidocs/org/jsoup/nodes/Document.html 一、解析HTML并取其内容 Document doc = Jsoup.parse(html);二、解析一个body片断 Document doc = Jsoup.parseBodyFragment(html); Element body = doc.body();三、从一个URL加载一个Document Document doc = Jsoup.connect("***") .data("query", "Java") .userAgent("Mozilla") .COOKIE("auth", "token") .timeout(3000) .post(); String title = doc.title();四、从一个文件加载一个文档 File input = new File("/tmp/input.html"); // baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串 Document doc = Jsoup.parse(input, "UTF-8", "***/"); 五、使用DOM方法来遍历一个文档 1、查找元素 getElementById(String id) getElementsByTag(String tag) getElementsByClass(String className) getElementsByAttribute(String key) // 和相关方法 // 元素同级 siblingElements() firstElementSibling() lastElementSibling() nextElementSibling() previousElementSibling() // 关系 parent() children() child(int index) 2、元素数据 // 获取属性attr(String key, String value)设置属性 attr(String key) // 获取所有属性 attributes() id() className() classNames() // 获取文本内容text(String value) 设置文本内容 text() // 获取元素内HTMLhtml(String value)设置元素内的HTML内容 html() // 获取元素外HTML内容 outerHtml() // 获取数据内容(例如:script和style标签) data() tag() tagName() 3、操作HTML和文本 append(String html) prepend(String html) appendText(String text) prependText(String text) appendElement(String tagName) prependElement(String tagName) html(String value) 六、使用选择器语法来查找元素(类似于CSS或jquery的选择器语法) //带有href属性的a元素 Elements links = doc.select("a[href]"); //扩展名为.png的图片 Elements pngs = doc.select("img[src$=.png]"); //class等于masthead的div标签 Element masthead = doc.select("div.masthead").first(); //在h3元素之后的a元素 Elements resultLinks = doc.select("h3.r > a"); 七、从元素抽取属性、文本和HTML 1、要取得一个属性的值,可以使用Node.attr(String key) 方法 2、对于一个元素中的文本,可以使用Element.text()方法 3、对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法 4、其他: Element.id() Element.tagName() Element.className() Element.hasClass(String className)

附录二

File类

*java.io.File类用于表示文件或目录。*创建File对象:// 文件/文件夹路径对象File file = new File("E:/...");// 父目录绝对路径 + 子目录名称File file = new File("..." ,"");// 父目录File对象 + 子目录名称 File file = new File("...","...");file.exists():判断文件/文件夹是否存在file.delete():删除文件/文件夹file.isDirectory():判读是否为目录file.isFile():判读是否为文件夹file.mkdir():创建文件夹(仅限一级目录)file.mkdirs():创建多及目录文件夹(包括但不限一级目录)file.createNewFile():创建文件file.getAbsolutePath():得到文件/文件夹的绝对路径file.getName():得到文件/文件夹的名字file.String():同样是得到文件/文件夹的绝对路径等于file.getAbsolutePath()file.getParent():得到父目录的绝对路径

附录三

完整代码

package com.sxf;​import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.File;import java.io.FileOutputStream;import java.util.ArrayList;​public class Main { public static void main(String[] args) { try { Document doc = Jsoup.connect("***/creative/topic/1").get(); // 寻找class为item lazy的元素,返回ArrayList。 Elements items = doc.getElementsByClass("item lazy"); ArrayList<String> URLS = new ArrayList<>(); // 将图片的URL单独提取出来。 for (Element i : items) { URLS.add(i.child(0).attr("src")); } // 当前路径下创建Pics文件夹 File file = new File("Pics"); file.mkdir(); String rootPath = file.getAbsolutePath(); System.out.println(">> 当前路径:"+rootPath); // 遍历图片并下载 int cnt = 1; for (String str : URLS) { System.out.println(">> 正在下载:"+str); // 获取response Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute(); FileOutputStream out = (new FileOutputStream(new java.io.File(file, cnt+".jpg"))); // imgRes.body() 就是图片数据 out.write(imgRes.bodyAsBytes()); out.close(); cnt ++; } }catch (Exception e){ e.printStackTrace(); } }}

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 8月 29日 上午8:59
下一篇 2023年 8月 29日 上午9:09

相关推荐

  • 搜狗地图正式下线 官网已经变成腾讯地图了

    5月15日23点,搜狗地图正式下线,并从多家应用商店下架。停运前夕,搜狗地图推荐用户下载腾讯地图,向东家做最后的引流。 公开信息显示,搜狗地图成立于1999年,原名图行天下,是中国…

    2023年 3月 25日
  • 各大平台账户注销方法!总有一个是你想注销的账户

    近日工信部要求电信业务经营者、互联网信息服务提供者在用户终止使用电信服务或者互联网信息服务后,应当停止对用户个人信息的收集和使用,并为用户提供注销号码或账号的服务。 一时间手机 A…

    2023年 5月 19日
  • 潇洒霸气的个性签名,唯美精致,触动人心的句子

    一 * 心有多远,你就能走多远,做一个温暖的人,浅浅笑,轻轻爱。 二 * 挤不进的世界就别挤了,何必为难了别人作贱了自己。 三 * 别在意那些在你背后说三道四的人,那只不过说明你走…

    2023年 6月 2日
  • 关于酷狗音乐(关于酷狗音乐的昵称)

    酷狗音乐是中国使用人数较多的音乐播放器之一[1]。酷狗主要提供在线文件交互传输服务和互联网通讯,采用了先进的构架设计研发,具有网络文件交互功能。 为用户设计了高传输效果的文件下载功…

    2023年 1月 6日
  • 微信就可以快速查询手机话费流量

    微信悄悄更新功能,一键快速查询话费流量账单真实网速,很多人都不知道。 大家好,我是秦韵莞香,现在可能还有很多朋友都是通过APP或者短信的形式查询查话费和流量的。以后就不用这么麻烦了…

    2023年 3月 16日
  • 支付宝集福讲解(第一年支付宝集福多少钱)

    010204 敬业福去哪儿啦!2017.1.25敬业福去哪了?01支付宝集福又开始刷屏啦!!!许多小伙伴开始紧锣密鼓开始舔屏啦!1扫福,毫无疑问成为这两年迅速崛起的一股潮流支付宝大…

    2023年 1月 29日
  • 新媒体人如何在b站实现精准引流推广

    哔哩哔哩 – ( ゜- ゜)つロ 干杯~ 新媒体行业,内容平台的风口大概就是6、7年前的微博,3、4年前的公众号,过去两年的抖音、快手、小红书,还有——2020年的B站…

    2023年 3月 9日
  • 破镜不能重圆

    高三那年,江淮和贺楠约定好了一起去B大,两个人也互相爱慕,也就约定好了要是都考上了B大就在一起。 然而录取通知书下来的那天,江淮在去找贺楠的路上出了车祸。 索幸没有生命危险,但是却…

    互联网 2023年 9月 7日
  • 什么狗能骑,狗带,wuli、法骑的区别

    文:某小刀 你的朋友圈一定是被黄子韬在伦敦时装周迟到入场结果提着裤头跟模特一起走天桥入场找座位对的动图刷爆了吧? 还有提裤头这张图,堪称天朝明星征战各大时装周的年度最佳照片。 你是…

    2023年 1月 17日
  • 叮嗒共享单车退押金要多久到账,叮嗒出行交过押金后能免费骑车吗

    信网6月15日讯(记者 李鑫邦)随着共享经济的发展,各种共享产品层出不穷,共享自行车更是给市民带来了方便,但同时,各类问题也是接踵而来,而押金难退便是被投诉最多的一类。近期,市民吴…

    互联网 2023年 8月 24日