最近闲的无聊,就想学一下爬虫玩玩,因为python还没有学过,索性先找一下Java的爬虫,百度之后发现还是Jsoup用的多一点,而且更简单一点。

因为我比较喜欢古风,所以这次的目标就是古风吧,爬里面的图片。

https://tieba.baidu.com/f/good?kw=%E5%8F%A4%E9%A3%8E&ie=utf-8&cid=3

然后就是分析一下他的网页结构

发现他的a标签是有class名字的,那么接下来的话可以:

Elements a = doc.select("a.j_th_tit");

来获取里面的a标签

public void all(String url, String index) {try {Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)").timeout(3000).get();Elements a = doc.select("a.j_th_tit");for (Element n : a) {HomePage(n.attr("abs:href"), index);}} catch (Exception e) {e.printStackTrace();}}

这样来获取这个页面所有的a标签。

这里有一个细节就是在获取链接的时候伪装成浏览器去访问,如果你直接

Document doc = Jsoup.connect(url).get();这样去写的话,是获取不到的!

要注意!

然后就是第一个页面

然后打开查看他的图片

这就很舒服,他也有class名,不会和其他图片搞混了

那么接下来就是获取这个页面所有图片的链接了

 private void WriteThis(String url, String index) {try {Document doc = Jsoup.connect(url).get();Elements pics = doc.select("img[class=BDE_Image]");for (Element pic : pics) {savePic(pic.attr("src"), index);}} catch (Exception e) {e.printStackTrace();}}

这样就可以轻松获取第一页所有的图片链接,

但是不是每个帖子都只有一页,所还要获取下一页的链接

这样的标签是比较烦的,不过他还是有文字的,我们可以通过获取他的文字去判断是不是下一页的链接

private String getNext(String url) {try {Document doc = Jsoup.connect(url).get();Elements next = doc.getElementsByTag("a");for (Element a : next) {if (a.text().equals("下一页")) {return a.attr("abs:href");}}} catch (Exception e) {e.printStackTrace();}return "";}

abs:href是获取它的绝对链接的方式,因为有些时候他是相对链接,为了避免重复检查,所以直接去获取绝对链接,然后返回他的url。

这样每页每个帖子每个图片的链接就都可以获取到了,那么接下来就是如何通过图片的链接吧图片存储到本地了。

private void savePic(String src, String index) {try {String filename = "Reptile" + String.valueOf(((new Date()).getTime()) % 1000000) + ".jpg";String FinalIndex = index + "\\" + filename;Connection.Response res = Jsoup.connect(src).ignoreContentType(true).execute();byte[] img = res.bodyAsBytes();BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(FinalIndex)));bos.write(img);bos.close();} catch (Exception e) {e.printStackTrace();}}

这个呢也是百度的一种方法,比较简单的一种,应该很容看懂。

然后就需要创建文件夹了,我是比较有强迫症的那种,喜欢每个帖子的图片放到专门的文件夹里面去

private String CreateFile(String url, String index) {try {Document doc = Jsoup.connect(url).get();Elements h3 = doc.select("h3");System.out.println(h3.text());File file = new File(index + "\\" + h3.text());if (!file.exists()) {file.mkdir();}return file.getPath();} catch (Exception e) {e.printStackTrace();}return "";}

这样就可以根据你想要放的地方自动创建文件夹,然后返回文件夹的路径了。

接下来就是拼接然后运行了,上面的代码都是我没有添加注释的,下面会给出带有注释全部代码:


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.*;
import java.util.Date;public class PICget {//图片写入本地private void savePic(String src, String index) {try {//给图片起个不同的名字,免得重复了(如果想要png,可以吧后面的jpg换成png)String filename = "Reptile" + String.valueOf(((new Date()).getTime()) % 1000000) + ".jpg";//整理出图片的路径String FinalIndex = index + "\\" + filename;//获取图片的数据Connection.Response res = Jsoup.connect(src).ignoreContentType(true).execute();byte[] img = res.bodyAsBytes();//写入文件,因为这个流如果没有文件会帮你自动创建,所以不需要我们去单独先去创建那个文件BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(FinalIndex)));bos.write(img);bos.close();} catch (Exception e) {e.printStackTrace();}}//获取所有图片urlprivate void WriteThis(String url, String index) {try {//获取本页的链接Document doc = Jsoup.connect(url).get();//获取所有图片的链接Elements pics = doc.select("img[class=BDE_Image]");//调用方法把那些全部都保存到本地for (Element pic : pics) {savePic(pic.attr("src"), index);}} catch (Exception e) {e.printStackTrace();}}//获取下一页的链接private String getNext(String url) {try {//获取第一页的链接Document doc = Jsoup.connect(url).get();//尝试获取下一页的练级Elements next = doc.getElementsByTag("a");for (Element a : next) {//判断是否有下一页的链接if (a.text().equals("下一页")) {//有的话返回链接return a.attr("abs:href");}}//没有返回无return "";} catch (Exception e) {e.printStackTrace();}return "";}//创建目标文件夹private String CreateFile(String url, String index) {try {Document doc = Jsoup.connect(url).get();//获取它的标题Elements h3 = doc.select("h3");System.out.println(h3.text());File file = new File(index + "\\" + h3.text());if (!file.exists()) {//创建标题文件夹file.mkdir();}//返回文件路径return file.getPath();} catch (Exception e) {e.printStackTrace();}return "";}//合成,把一个页面所有的图片全部爬完public void HomePage(String url, String index) {try {//1.获取目标文件夹路径String str = CreateFile(url, index);//2.爬取首页图片WriteThis(url, str);String next = url;while (true) {//3.获取下一页的链接next = getNext(next);//4.判断下一页是否为空if (!next.equals("")) {//4.1为空,已经是最后一页了,可以结束了break;} else {//4.2不为空,那么继续爬取图片WriteThis(next, str);}}} catch (Exception e) {e.printStackTrace();}}public void all(String url, String index) {try {//伪装成浏览器访问Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)").timeout(3000).get();//获取本页所有帖子的链接Elements a = doc.select("a.j_th_tit");for (Element n : a) {//调用函数爬取每个帖子的图片HomePage(n.attr("abs:href"), index);}} catch (Exception e) {e.printStackTrace();}}
}
public class demo {public static void main(String[] args) {new PICget().all("https://tieba.baidu.com/f?kw=%E5%8F%A4%E9%A3%8E&ie=utf-8&tab=good&cid=3","E:\\img");}
}

下面是结果

不过我写的有点问题,就是有可能会获取到别人发出来的图片,不喜欢的话,可以详细一点,一步一步去获取某个人发出来的图片。

我爬了大概1个多小时接近2个小时,还好没有去获取所有精品区的东西,效率确实挺低下的,不过本人能力有限,目前并不知道如何改善。而且因为爬虫时间太长,可能会出现一些bug注意不到,无法处理。

有任何有问题,欢迎指出,留言,评论。

Jsoup 爬虫之百度贴吧相关推荐

  1. 利用java的JSoup爬虫技术爬取网页信息

    简单讲解java的Jsoup爬虫技术来爬取网页的数据,简单来讲就是解释网页,一般学过xml的人都很容易理解. 第一步:我们要爬取网页的静态内容必须要了解网页的源码,也就是div之类的标签,因为我们是靠 ...

  2. jsoup爬虫教程技巧_Jsoup V的幕后秘密:优化的技巧和窍门

    jsoup爬虫教程技巧 我们已经把事情做好了,现在是时候加快工作速度了. 我们会牢记Donald Knuth的警告:"大约97%的时间我们应该忘记效率低下:过早的优化是万恶之源". ...

  3. python百度翻译爬虫_Python爬虫教程-05-python爬虫实现百度翻译

    使用python爬虫实现百度翻译功能 python爬虫实现百度翻译: python解释器[模拟浏览器],发送[post请求],传入待[翻译的内容]作为参数,获取[百度翻译的结果] 通过开发者工具,获取 ...

  4. jsoup爬虫技术精通_精通业务的同时保持技术的3种方法

    jsoup爬虫技术精通 上周,我很幸运地参加了2017年红帽峰会 . 我们与客户,分析师和记者举行了无数次会议和情况介绍会. 在会议之间走动时,我开始思考一个挑战,这对许多技术人员来说是一个挑战,因为 ...

  5. jsoup爬虫,爬取全站代码

    最近使用jsoup扒了几个网站,感觉bug改的差不多了,于是写出来与大家分享. 首先我会把爬虫基础的爬取思路与部分重要方法展示出来,最后我会把全部代码贴出来.并且我会写一个Main类,里面就是爬虫的模 ...

  6. jsoup爬虫简书首页数据做个小Demo

    代码地址如下: http://www.demodashi.com/demo/11643.html 昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固 ...

  7. python爬虫接口_python爬虫之百度API调用方法

    调用百度API获取经纬度信息. import requests import json address = input('请输入地点:') par = {'address': address, 'ke ...

  8. python爬虫案例——百度贴吧数据采集

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python爬虫案例--百度贴吧数据采集 通过python实现百度贴吧页面的内容采集是相对来说比较容易的,因为百度贴吧不需要登陆,不需要coo ...

  9. java使用jsoup爬虫入门

    一.maven项目里pom添加jsoup依赖 <dependency><groupId>org.jsoup</groupId><artifactId>j ...

  10. 利用jsoup爬取百度网盘资源分享连接(多线程)(2)

    之前的博客 利用jsoup爬取百度网盘资源分享连接(多线程) 已经说明了怎么抓取数据,抓取完数据就是共享这些资源了,说白了就是搭建一个百度网盘资源搜索网站,我是利用WAMP搭建的. 主页面index. ...

最新文章

  1. 开发日记-20190430 关键词 apt,aspectj,javassist
  2. android 开发工具篇之android studio(二)使用篇
  3. linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上
  4. 【转载】Linux截图工具
  5. python对Excel数据进行读写操作
  6. javascript async await
  7. deeply understanding Binary tree--二叉树
  8. windows10彻底杀死卡死的顽固进程
  9. Ubuntu 11.10 系统启动默认进入终端
  10. 同样一个网址,用电信网络和中国移动的手机网络,下载速度相差巨大
  11. 马尔可夫链 (Markov Chains)
  12. 狗头人与地下世界冒险模式通关记录 [20171224]
  13. 【cpu如何超频及cpu超频作用】
  14. 网站优化相关理论概述
  15. 清华计算机专业作业,微计算机技术(清华)配套练习题及答案 作业2(答案)END
  16. 【开发】开源的网络攻防黑客游戏d0x3d
  17. 前端VS后端Web开发
  18. ssh突然无法登录,报错failed to start openssh daemon
  19. GPU 编程 CPU 异同点_分析师:英特尔(INTC.US)GPU不会构成威胁
  20. vue生命周期方法(钩子函数)初始化数据一般写在哪里

热门文章

  1. 在线json解析工具 在线js解析加密混合工具
  2. 搞全闪存阵列的各执一词 宏杉说别吵了,就用我哒
  3. DS3231时钟模块使用,IIC协议实践。(基于STM32)
  4. 唐宇迪opencv-背景建模
  5. js中的dataset的使用
  6. oauth样例项目【01】之 使用auth-code进行认证授权
  7. python3编写方程计算器_python算法——方程计算器小工具
  8. Oracle 常用SQL语句大全(精)
  9. mysql数据库常用sql语句
  10. nlp 停用词处理java_NLP入门:文本预处理(一)停用词