Jsoup简介

Jsoup是用于解析HTML,就类似XML解析器用于解析XML。 Jsoup它解析HTML成为真实世界的HTML。

能用Jsoup实现什么?

●从URL,文件或字符串中刮取并解析HTML

●查找和提取数据,使用DOM遍历或CSS选择器

●操纵HTML元素,属性和文本

●根据安全的白名单清理用户提交的内容,以防止XSS攻击

●输出整洁的HTML

安装

org.jsoup

jsoup

1.12.1

Htmluiit简介

htmlunit 是一款开源的java 页面分析工具,优点就是得到js执行后的值。用于抓取动态页面。

安装

net.sourceforge.htmlunit

htmlunit

2.35.0

使用Jsoup+Htmlunit

public String getHtmlPageResponse(String url) throws Exception {

//请求超时时间,默认20秒

int timeout = 20000;

//等待异步JS执行时间,默认20秒

int waitForBackgroundJavaScript = 20000;

String result = "";

final WebClient webClient = new WebClient(BrowserVersion.CHROME);

webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常

webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常

webClient.getOptions().setActiveXNative(false);

webClient.getOptions().setCssEnabled(false);//是否启用CSS

webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS

webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX

webClient.getOptions().setTimeout(timeout);//设置“浏览器”的请求超时时间

webClient.setJavaScriptTimeout(timeout);//设置JS执行的超时时间

HtmlPage page;

try {

page = webClient.getPage(url);

} catch (Exception e) {

webClient.close();

throw e;

}

webClient.waitForBackgroundJavaScript(waitForBackgroundJavaScript);//该方法阻塞线程

result = page.asXml();

webClient.close();

return result;

}

下载网页中我们想要的图片

public void getHtmlContent(String url){

// 发起请求

String content = null;

try {

content = getHtmlPageResponse(url);

} catch (Exception e) {

e.printStackTrace();

}

// 解析网页 得到文档对象

Document doc = Jsoup.parse(content);

// 获取指定的

Elements elements = doc.select("img[src$=.png]");

List picList = new ArrayList<>();

for (Element element :elements){

// 获取 的 src

String imageUrl = element.attr("src");

// 取到我们想要的图片

if (imageUrl.contains(WEATHER_PIC_BASE_URL)) {

picList.add(imageUrl);

}

}

// 获取文件夹下所有文件名

List fileNameList = getFileList(savePath);

for(String imgUrl:picList){

String fileName = getFileNameWihtUrl(imgUrl);

// 图片是否存在

boolean isPic = fileNameList.contains(fileName);

if (!isPic) {

// 下载图片

}

}

}

保存图片到本地

public void downloadImages(String url, String fileName,String savePath,String imageFormat,Integer headerType) {

// 创建httpclient实例

CloseableHttpClient httpclient = HttpClients.createDefault();

// Http请求

try {

HttpGet httpGet = new HttpGet(url);

CloseableHttpResponse pictureResponse = httpclient.execute(httpGet);

HttpEntity pictureEntity = pictureResponse.getEntity();

InputStream inputStream = pictureEntity.getContent();

// 使用 common-io 下载图片到本地,注意图片名不能重复

FileUtils.copyToFile(inputStream, new File( savePath+ fileName + imageFormat));

pictureResponse.close(); // pictureResponse关闭

} catch (IOException e) {

e.printStackTrace();

}

}

下载图片安装commons-io

commons-io

commons-io

2.6

对于一般的网站来说。到这里能够爬取数据了,但是今天遇到一个问题,我获取了网页上所有JS执行后的动态图片链接,但是下载到本地图片损坏打不开。调试,把抓取的图片地址复制到浏览器中显示链接无效。what??

打开网页调试工具,

屏幕快照 2019-07-11 15.27.18.png

复制Request URL重新打开一个页面一样的显示链接无效。

猜想

网页调试工具Network调试,抓取的图片双击无数次都有显示图片,但是把 Request URL复制到一个新页面就显示无效。猜想应该是访问页面的时候返回了Cookie,下载图片的时候也要把Cookie带回去验证。

解决

修改HttptClient doGet方法,addHeader尽量模拟网页的请求

public static String doGetExpansion(String url, String charset) {

CloseableHttpClient httpClient = HttpClients.createDefault();

HttpGet httpGet = null;

String result = null;

try {

httpGet = new HttpGet(url);

// 设置通用的请求属性

httpGet.addHeader("Cache-Control", "no-cache");

httpGet.addHeader("Pragma", "no-cache");

httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");

httpGet.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");

httpGet.addHeader("Accept-Encoding", "gzip, deflate");

httpGet.addHeader("accept-secret", "");

httpGet.addHeader("Accept-Language", "zh-CN,zh;q=0.9");

httpGet.addHeader("Upgrade-Insecure-Requests", "1");

httpGet.addHeader("Connection", "keep-alive");

for (int i = 0; i < cookies.size(); i++) {

httpGet.addHeader("Cookie", cookies.get(i));

}

HttpResponse response = httpClient.execute(httpGet);

if (response != null) {

for (Header header : response.getAllHeaders()) {

if (header.getName().equalsIgnoreCase("Set-Cookie")) {

cookies.add(header.getValue());

}

}

HttpEntity resEntity = response.getEntity();

if (resEntity != null) {

result = EntityUtils.toString(resEntity, charset);

httpGet.releaseConnection();

}

}

} catch (Exception ex) {

ex.printStackTrace();

httpGet.releaseConnection();

}

return result;

}

下载图片如果也需要验证按照上面的方法修改即可下载图片。

html如何让图片不能抓取,Jsoup+Htmlunit抓取图片遇到坑相关推荐

  1. 20個網頁抓取工具快速抓取網站

    網絡爬行(也稱為網絡抓取,屏幕抓取)已廣泛應用於當今的許多領域. 在網絡爬蟲工具進入公眾之前,對於沒有編程技能的普通人來說,這是一個神奇的詞. 它的高門檻阻礙了大數據門外的人們. 網絡抓取工具是自動爬 ...

  2. java jsoup爬动态网页_使用Jsoup+HtmlUnit抓取动态网页数据

    最后更新日期为2018.1.3 只为自己留个记录 待添加功能: 1.获取历史全部消息 2.爬取大于10条数据 3.自定义抓取公众号信息 package cc.buckler.test; import ...

  3. python爬取网页上的特定链接_python3下scrapy爬虫(第三卷:初步抓取网页内容之抓取网页里的指定数据)...

    上一卷中我们抓取了网页的所有内容,现在我们抓取下网页的图片名称以及连接 现在我再新建个爬虫文件,名称设置为crawler2 做爬虫的朋友应该知道,网页里的数据都是用文本或者块级标签包裹着的,scrap ...

  4. 网页抓取数据-网页抓取数据的软件免费

    在互联网络的时代,信息如同大海般没有边际.甚至我们获取信息的方法已经发生改变:从传统的翻书查字典,继而变成通过搜索引擎进行检索.我们从信息匮乏的时代一下子走到了信息极大丰富今天. 随着互联网的发展及普 ...

  5. phantomjs 抓取html,phantomjs抓取完整网页

    phantomjs:我的理解就是它是一个无显示的浏览器,也就是说除了不能显示页面内容以外,浏览器能干的活儿它基本上都能干.so,最近由于实验需要,要从某电商爬一点图片,但是它又是AJAX生成的,单纯的 ...

  6. WebMagic实现分布式抓取以及断点抓取

    访问我的博客 前言 从去年到今年,笔者主要负责的是与合作方的内容对接,新增的合作商不是很多的情况下,在我自从去年引入了 WebMagic 这个爬虫框架之后,基本很少需要去关注维护爬虫,做的最多的是新接 ...

  7. php屏幕抓取,关于屏幕抓取:如何在PHP中实现Web scraper?

    哪些内置的PHP函数对Web抓取有用?有什么好的资源(web或print)可以提高PHP的web抓取速度? 我想推荐我最近遇到的这门课.简单HTML DOM分析器 对于这一点,PHP是一种特别糟糕的语 ...

  8. python360百科_python抓取360百科踩过的坑!

    学习python一周,学着写了一个爬虫,用来抓取360百科的词条,在这个过程中.因为一个小小的修改,程序出现一些问题,又花了几天时间研究,问了各路高手,都没解决,终于还是自己攻克了,事实上就是对lis ...

  9. [知识图谱实战篇] 一.数据抓取之Python3抓取JSON格式的电影实体

    前面作者讲解了很多知识图谱相关的原理知识,包括知识图谱相关技术.Neo4j绘制关系图谱等,但还是缺少一个系统全面的实例.为了加深自己对知识图谱构建的认识,为后续创建贵州旅游知识图谱打下基础,作者学习了 ...

最新文章

  1. Feature Selection: A Data Perspective --阅读笔记1 特征选择的概述
  2. MySQL主从延时这么长,要怎么优化
  3. Linux中TFTP使用详解
  4. shareSDK 微信分享的时候只能分享jpg格式的图片大于32k时为什么分享不出去?
  5. h5+js视频播放器控件
  6. duilib入门问题集
  7. 火爆全网MySQL路线笔记!linuxmysql允许远程连接
  8. cocos2d-x 是男人就下100层 附源码
  9. chattr使用解释
  10. jdk配置环境变量的方法
  11. Android计算器 (课程设计项目)
  12. 触摸屏与单片机通讯C语言程序,讲述如何实现单片机与触摸屏的通信
  13. Verilog初学者小圣经
  14. 用python画蜡笔小新_用python画的蜡笔小新
  15. 数论—乘法逆元—费马小定理
  16. linux os版本 32或64位查看
  17. 华为IT“智”存高远,普“慧”于民
  18. 头文件里应该写些什么
  19. 云宏与英特尔携手发布了基于英特尔®至强®可扩展平台全面升级
  20. 洛谷P4233 射命丸文的笔记 【多项式求逆】

热门文章

  1. 全国(不包括港澳台)行政区划代码爬取
  2. ui动效 unity_Unity中实现仿主机游戏的UI动画效果
  3. 【5】使用结巴分词对分类语料库分词
  4. 当问别人贵姓的时候,有两个姓不用说“免贵”
  5. 章鱼网络进展月报 | 2022.9.1-9.30
  6. 世界数字图书馆开通中文浏览
  7. 2020 国内互联网公司的薪酬排名
  8. 利用pyecharts绘制分级地图的案例
  9. 显卡优化软件测试面试,世界顶级优化软件测试及结果!
  10. 排序算法的详解和分析对比(详细讲解)