Java爬取简单的网页内容和图片

根据java网络编程相关的内容,使用jdk提供的相关类可以得到url对应网页的html页面代码。

针对得到的html代码,通过使用正则表达式即可得到我们想要的内容。

比如,我们如果想得到一个网页上所有包括“java”关键字的文本内容,就可以逐行对网页代码进行正则表达式的匹配。最后达到去除html标签和不相关的内容,只得到包括“java”这个关键字的内容的效果。

从网页上爬取图片的流程和爬取内容的流程基本相同,但是爬取图片的步骤会多一步。

需要先用img标签的正则表达式匹配获取到img标签,再用src属性的正则表达式获取这个img标签中的src属性的图片url,然后再通过缓冲输入流对象读取到这个图片url的图片信息,配合文件输出流将读到的图片信息写入到本地即可。

爬虫除这两种玩法外,还有着许多的应用,比如还可以爬取一个网页上所有的邮箱、电话号码等等。

运行效果:

这些内容是我从csdn首页中根据“你”这一个关键字得到的。

这些是我从一些网站得到的图片

问题:

在看似没有问题的爬取代码背后其实还是存在着许多问题的,该程序只是对爬虫最初级的应用。比如我发现部分内容的html在浏览器的“检查”功能中明明存在,但是在网页源代码中就没有了相关的内容。还有文本匹配的正则表达式部分也存在问题。

在img src属性中,有部分图片的url是不带协议的(如:https://),还有部分图片的url是不带图片后缀(jpg、png、gif...)的。前者导致程序无法解析这个url,后者导致无法给下载的图片统一采用原命名。

有时匹配到的img src值还会出现非图片url的情况。还有时从页面上获取到的内容是unicode编码值。以及部分网站做了反爬虫处理等...

以上问题因为我对java知识、web知识、网络知识还有正则的知识了解的很少,所以我目前都无法解决。

这些问题就导致最后真正从网页上爬下来的内容,只是原网页很少的一部分。

我相信在以后这些问题都是会被逐个解决的。

另外我在程序中使用了多线程的功能,以达到可以在多个网页“同时”爬取的效果。

下面给出该程序的源代码。

编译环境:

windows jdk 9 idea

代码:

//Main.java 主类

package pers.baijiaming.download.main;//主类
public class Main
{public static void main(String[] args){createImageDownloadThread ("https://www.bilibili.com/", "downloadImg/b站/");createImageDownloadThread("https://cn.bing.com/images/search?q=%E7%A6%8F%E5%88%A9&qs=n&form=QBIR&sp=-1&pq=%E7%A6%8F%E5%88%A9&sc=3-2&cvid=2AF12F93CAB34E8FBF902905B185583C&first=1&scenario=ImageBasicHover", "downloadImg/福利/");createTextDownloadThread("https://www.csdn.net/", "你", "Text/", "testText.txt");}//创建并执行线程,获取图片private static void createImageDownloadThread(String url, String path){new Thread(new DownloadPictures(url, path)).start();}//获取文本内容private static void createTextDownloadThread(String urlStr, String findText, String downloadPath, String fileName){new Thread(new GetText(urlStr, findText, downloadPath, fileName)).start();}
}

//DownloadPictures.java 爬取图片类

package pers.baijiaming.download.main;import java.io.*;           //io包
import java.util.regex.*;   //正则包
import java.net.*;          //网络包/*
* 下载图片类
* */
public final class DownloadPictures implements Runnable
{private URL url = null;     //URLprivate URLConnection urlConn =  null;  //url连接private BufferedReader bufIn = null;    //缓冲读取器,读取网页信息private static final String IMG_REG = "<img.*srcs*=s*(.*?)[^>]*?>";    //img标签正则private static final String IMG_SRC_REG = "srcs*=s*"?(.*?)("|>|s+)";    //img src属性正则private String downloadPath = null;     //保存路径//构造,参数:想要下载图片的网址、下载到的图片存放的文件路径public DownloadPictures(String urlStr, String downloadPath){createFolder(downloadPath);     //创建文件夹try {url = new URL(urlStr);urlConn = url.openConnection();//设置请求属性,有部分网站不加这句话会抛出IOException: Server returned HTTP response code: 403 for URL异常//如:b站urlConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");bufIn = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));}catch (Exception e) {e.printStackTrace();}this.downloadPath = downloadPath;}//检测路径是否存在,不存在则创建private void createFolder(String path){File myPath = new File(path);if (!myPath.exists())   //不存在则创建文件夹myPath.mkdirs();}//下载函数public void Download(){final int N = 20;    //每一次处理的文本行数,这个数越小越容易遗漏图片链接,越大效率越低 (理论上)String line = "";String text = "";while (line != null)            //网页内容被读完时结束循环{for(int i = 0; i < N; i++)  //读取N行网页信息存入到text当中,因为src内容可能分为多行,所以使用这种方法try {line = bufIn.readLine();    //从网页信息中获取一行文本if(line != null)            //判断防止把null也累加到text中text += line;}catch (IOException e) {e.printStackTrace();}//将img标签正则封装对象再调用matcher方法获取一个Matcher对象final Matcher imgM = Pattern.compile(IMG_REG).matcher(text);if(!imgM.find())    //如果在当前text中没有找到img标签则结束本次循环continue;//将img src正则封装对象再调用matcher方法获取一个Matcher对象//用于匹配的文本为找到的整个img标签final Matcher imgSrcM = Pattern.compile(IMG_SRC_REG).matcher(imgM.group());while (imgSrcM.find())      //从img标签中查找src内容{String imageLink = imgSrcM.group(1);    //从正则中的第一个组中得到图片链接print(imageLink);       //打印一遍链接//如果得到的src内容没有写协议,则添加上
//                if(!imageLink.matches("https://[sS]*"))       //这里有问题
//                    imageLink = "https://" + imageLink;print(imageLink);       //打印一遍链接try{//缓冲输入流对象,用于读取图片链接的图片数据//在链接的图片不存在时会抛出未找到文件异常final BufferedInputStream in = new BufferedInputStream(new URL(imageLink).openStream());//文件输出流对象用于将从url中读取到的图片数据写入到本地//保存的路径为downloadPath,保存的图片名为时间戳+".png"final FileOutputStream file = new FileOutputStream(new File(downloadPath + System.currentTimeMillis() + ".png"));int temp;   //用于保存in从图片连接中获取到的数据while ((temp = in.read()) != -1)file.write(temp);   //将数据写入到本地路径中//关闭流file.close();in.close();//下载完一张图片后休息一会try {Thread.sleep(800);}catch (InterruptedException e) {e.printStackTrace();}}catch (Exception e){e.printStackTrace();}}//将text中的文本清空text = "";}}//run@Overridepublic void run(){Download(); //下载函数}//打印语句public void print(Object obj){System.out.println(obj);}
}

//GetTest.java 爬取文本内容类

package pers.baijiaming.download.main;import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public final class GetText implements Runnable
{private URL url = null;     //URLprivate URLConnection urlConn =  null;  //url连接private BufferedReader bufIn = null;    //缓冲读取器,读取网页信息//    private static final String TEXT_REG = "([[[^x00-xff]|w]&&[^u003E]])+";    //文本内容正则private static final String TEXT_REG = "[[sS]&&[^<>n ]]*";    //文本内容正则,这里有些问题,试了很久,无法排除一个空格的情况
//    <[a-zA-Z]+.*?>([sS]*?)</[a-zA-Z]*?>private String findText = null;         //要查找的内容private String downloadPath = null;     //保存路径private String fileName = null;         //文件名//构造,参数:url、要查找的文本、保存路径,文件名public GetText(String urlStr, String findText, String downloadPath, String fileName){createFolder(downloadPath);     //创建文件夹try {url = new URL(urlStr);urlConn = url.openConnection();//设置请求属性,有部分网站不加这句话会抛出IOException: Server returned HTTP response code: 403 for URL异常//如:b站urlConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");bufIn = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));}catch (Exception e) {e.printStackTrace();}this.downloadPath = downloadPath;this.fileName = fileName;this.findText = findText;}//检测路径是否存在,不存在则创建private void createFolder(String path){File myPath = new File(path);if (!myPath.exists())   //不存在则创建文件夹myPath.mkdirs();}//下载函数private void Download(){final int N = 10;String line = "";String textStr = "";while (line != null){for(int i = 0; i < N; i++)      //将N行内容追加到textStr字符串中try {line = bufIn.readLine();if(line != null)textStr += line;}catch (IOException e) {e.printStackTrace();}try{//将img标签正则封装对象再调用matcher方法获取一个Matcher对象final Matcher textMatcher = Pattern.compile(TEXT_REG + findText + TEXT_REG).matcher(textStr);final FileWriter fw = new FileWriter(downloadPath + fileName, true);   //文件编写,续写文件while (textMatcher.find())          //查找匹配文本{fw.write(textMatcher.group() + "n");  //写入到文件中print(textMatcher.group());     //打印一遍}//                print(textStr);fw.close();textStr = "";}catch (Exception e){e.printStackTrace();}}}//run@Overridepublic void run(){Download();}//打印语句private void print(Object obj){System.out.println(obj);}
}

----

程序中还存在着许多问题,还请多多包涵。

循环爬取图片_Java爬取简单的网页内容和图片相关推荐

  1. img src 本地图片_Java爬取简单的网页内容和图片

    Java爬取简单的网页内容和图片 根据java网络编程相关的内容,使用jdk提供的相关类可以得到url对应网页的html页面代码. 针对得到的html代码,通过使用正则表达式即可得到我们想要的内容. ...

  2. python 爬取图片_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  3. python爬漫画(1)—— 如何爬取简单静态网页的图片

    之前写了一个python爬虫爬漫画视频的小程序,在此以一个系列的方式对其中用到的技术进行一个记录 系列一.简单的静态网页爬取 这里取的是kuku漫画网,http://comic.kukudm.com ...

  4. python爬取图片-Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 本地下载 我们这里以sogou作为爬取的对象. 首先 ...

  5. Python爬取图片2——爬取多个网页图片

    网页 image.png 效果 image.png 代码 import re from urllib.request import urlopen, urlretrieve# 下载HTMLdef ge ...

  6. java抓取图片_java 抓取网页的图片

    //只能抓取一部分图片,像折800有些子路径的一行图片代码有好多个img,而且排列不规律,我的能力根本就没法截取下来 package test; import java.io.BufferedOutp ...

  7. python爬虫怎么爬取图片_怎么用python爬取网站Jpg图片

    用python爬取网站图片,通过引用requests库就可完成.下面,小编将以爬取百度图片为例 工具/原料 python环境,网络 安装requests库 1 cmd打开命令行界面,输入pip ins ...

  8. Python爬取图片、视频以及将数据写入excel的方法小摘要

    Python爬取图片.视频以及将数据写入excel的方法小摘要 1.爬取图片 2.爬取视频 3.将获取的数据存入excel 4.备注 1.爬取图片 import requests #导入request ...

  9. 小白爬虫3,爬取图片

    今天来爬一爬图片 学习链接来自于 https://www.jqhtml.com/13393.html 爬的图片 http://i.jandan.net/ooxx 中的1-33页 现在看1-33页的表达 ...

最新文章

  1. JAVA-基础(Class对象及反射)
  2. 纠错--跟我学Java第44页
  3. python 点计算角度
  4. (4)pyspark---dataframe清理
  5. 自建Yum源并与科大开源镜像站进行同步
  6. python图片显示中文
  7. C++复数运算 重载
  8. Kafka安装及部署
  9. Android开发笔记(十三)视图绘制的几个方法
  10. Java并发 stop()、resume()和suspend()
  11. WORDNET与HOWNET之比较
  12. No serializer found for class JSONNull and no properties discovered to create BeanSerializer
  13. 第一章 Activity的生命周期和启动模式
  14. practice是什么意思_practice是什么意思 还有practice的用法
  15. 动作捕捉,系数转换,IK 等整理总结
  16. matlab如何写不等于号,不等于号(不等于号可以往右写么)
  17. 通过调用接口查询ISBN的图书信息
  18. 如何切换Linux用户(penguin)
  19. java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...
  20. mini2440 的 leds的驱动程序

热门文章

  1. GPU上创建目标检测Pipeline管道
  2. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)
  3. Python 2x 中list 里面的中文打印效果乱码
  4. Taylayout 底部的滑动线高度设置
  5. java设计模式----装饰器模式
  6. bootstap 表格自动换行 截取超长数据
  7. python操作mysql(二)
  8. 【C#公共帮助类】10年代码,最全的系统帮助类
  9. 简单实现ConfigurationManager.AppSettings[]效果存储系统变量
  10. ASP.NET 2.0 ajax中gridView的刷新问题!