java爬虫框架(java项目开发实例)

目标 爬取全景网图片,并下载到本地 收获 通过本文,你将复习到: IDEA创建工程IDEA导入jar包爬虫的基本原理Jsoup的基本使用File的基本使用FileOutputStream的基本使用ArrayList的基本使用foreach的基本使用 说明 爬虫所用的HTM解析器为Jsoup。Jsoup可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及…

目标

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

收获

通过本文,你将复习到:

  • 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下载一张图片试试效果。

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

// 获取response
Connection.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.Document
html文档:Document
元素操作:Element
节点操作:Node

官方API:https://jsoup.org/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(\"http://example.com\")
    .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\", \"http://example.com/\");  

五、使用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(\"https://www.quanjing.com/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();
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月9日 下午7:09
下一篇 2022年5月9日 下午7:11

相关推荐

  • 淘宝怎么做直播卖货,淘宝开直播详细流程

    1、直播发布权限:淘宝直播的基础权限,开通后可使用淘宝直播进行直播,并可在微淘或自有淘宝集市店铺首页/天猫店铺首页展示。 2、直播浮现权限:拥有此权限,可在手机淘宝-【淘宝直播】频道内展示。 3、如何查询自己的账号直播权限:登陆中控台-右上角“我的权限” 权限申请流程: 第一步:淘宝主播APP“ 第二步:无线端申请路径: 途径一:直接无线端点此打开链接登陆商家账号申请 途径二:打开淘宝直播APP,…

    2022年7月31日
    520
  • wps文档怎么加密,wps文档设置密码保护步骤

    昨晚,WPS君本来想早点睡觉,没想到手机就持续发出微信提醒的声音。 我拿起一看,才发现我的老友又遇到了棘手的麻烦:文档加密,却忘记了密码。 尝试记忆解密无效之后,WPS君也陆续为他推荐了几款知名的加密破解软件。 可结果要么显示破解失败,要么就是破解后文档打开完全乱码!! 破解无望,WPS君也只能安慰老友后面再根据记忆尝试解锁,并向他推荐了更为科学的文档加密方式,WPS独家功能——账号加密。 01 …

    2022年6月26日
    1000
  • 写字楼租赁推广方案怎么做,浅析纯租赁式写字楼招商前期推广策略

    住宅出租比较容易,但写字楼就不是了,可能需要加入更多的宣传工作。那么,写字楼如何出租呢?下面,PChouse为大家介绍一下。 1、价格。出售之前,先考察市场,确定您的理想价位,如果着急出售,可以在心理接受的范围内适当降价。 2、传播,多渠道发布消息。 (1)传统渠道。委托传统中介;在报纸、杂志上发布出售信息、做户外广告、做电视、广播广告。 (2)新渠道。通过网络平台发布出租信息;通过新媒体渠道——…

    2022年5月27日
    720
  • 创业思路和方向有哪些,大学生创新创业300个点子

    300个创业金点子,当你没有创业思路时可以看看这些创意,达玛网络,创业小项目介绍,2020年创业项目介绍 第一部分保健行业 一、开按摩院,赚健康钱 二、保健花卉盆景有商机 三、开茶浴馆洗出健康 四、大学生开溜冰培训班赚大钱 五、开家老年陪护中小 六、钓鱼俱乐部休闲又赚钱 七、开心理诊所,前景无限 八、快乐女子沙龙会所 九、开家私人健康顾问馆 十、夏季减肥市场好 第二部分餐饮行业 一、开家零售店,赚…

    2022年8月27日
    540
  • 微信封号原因查询,微信封号封多久才能恢复

    微信被封号的原因有很多,打开微信-我-设置-关于微信,界面底部有《微信软件许可及服务协议》,这里就列出了很多被封号的理由。 但是有些用户自认为并没有违反微信协议,结果无缘无故被封了,为什么?其中一个原因可能是用户安装了一些可以在后台偷偷操控微信的应用程序。 今天很多人讨论的“应用控制器“就是这样一款程序,有开发者发现“应用控制器“竟然会在后台偷偷地打开微信公众号的指定文章,在用户不知情的情况下,给…

    2022年7月15日
    1730
  • 淘宝店可以转让吗,淘宝店铺协议变更店主注意事项

    为了增强店铺自身竞争实力,不少人选择了淘宝店铺转让,即直接通过第三方平台转让一个现成的淘宝店铺来经营。 不过,根据淘宝店铺转让流程,买卖双方在店铺交接时会或者签订淘宝网店转让合同时,都会涉及到店铺或者买卖双方的身份信息。 进行淘宝店铺转让时,需要准备什么资料? 主要有这类两点: 第一,在店铺交接时。 买家需要提前分别准备好一个未曾绑定淘宝和支付宝的手机号和邮箱。 而卖家需要交付买家资料:淘宝会员名…

    2022年6月8日
    780
  • 小区里摆地摊卖什么好,适合在小区长期摆摊生意

    很多人都想赚钱,其实摆地摊就是不错的选择,投资不大,只需要你有叫卖的勇气和销售的智慧,就能创造财富的奇迹,那么,摆地摊卖什么最赚钱呢?请看详细介绍。 摆地摊卖什么最火最好卖利润大? 自动播放机在小区或者公园,老年人多的放,卖自动播放机,生意那是杠杠的好,这种机器进价随便在网上一看就知道不会很高,但是售价都是最少七八十,100多的,老年人都很喜欢买一台这种机器放歌曲和戏剧。老花镜这种简直无敌了,进价…

    2022年8月18日
    980
  • 怎么样网络推广品牌,网络推广的方式与技巧

    如今,网络营销的方式多种多样。您可以采取多种方位、多连接的方式进行推广。那么如何做网络推广,哪些是有效的呢?下面的编辑为你解释几种常见的推广(yiqihang.cn)方法: 网络推广1.SEM(搜索引擎营销)搜索引擎营销:英文搜索引擎营销,我们通常简称为“SEM”。它是利用用户的机会,根据用户使用搜索引擎的方式检索信息,将营销信息尽可能多地传递给目标用户。 网络推广2.信息流广告feed广告是指在…

    2022年6月16日
    570
  • 万兴数据恢复怎么样,真正免费的账号专家使用教程

    上半年公布的社交平台分布数据,微信仍然是当之无愧的国民级应用,月活用户达到9.9亿。有超过5成的用户表示对微信比较依赖或非常依赖;超过1成用户好友人数多于500人,超过2成用户微信好友人数在200人到500人之间。实际上有超过6成的用户,每周交流的人数不超过20人。因此就有不少人会删除一些长期没有互动的好友。但是这些删除的好友里,又会存在误删的情况,一旦误删,所有的聊天记录、照片、文件等全部被删除…

    2022年6月10日
    1060
  • 品牌建材加盟代理排行榜(建材平台十大网站)

    互联网趋势下,平台搭建已经是在各行各业中留下非常深刻的印象。购物、餐饮、交通出行等等平台已经融入我们生活方方面面了,平台建设方便了生活,也起到产业集聚,行业发展的优势。 我们在生活中能经常看见,很多客户都喜欢在网上选购自己需要的原料、建材、产品等。对于传统的家居、建材行业,也紧跟时代发展推出线上平台,各种补贴优惠,进一步拉动消费者的需求,推动产品的销售。 那这些家居建材线上平台你们有知道多少呢? …

    2022年5月2日
    1500

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信