怎样抓取网页数据( img属性中有部分图片的url是不带协议的(图))

优采云 发布时间: 2022-02-14 11:18

  怎样抓取网页数据(

img属性中有部分图片的url是不带协议的(图))

  Java 抓取简单的 Web 内容和图像

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

  对于得到的html代码,我们可以通过正则表达式得到我们想要的。

  例如,如果我们想获取网页上收录“java”关键字的所有文本内容,我们可以对网页代码逐行进行正则表达式匹配。最终达到去除html标签和无关内容的效果,只得到收录关键字“java”的内容。

  从网页爬取图片的过程与爬取内容的过程基本相同,只是爬取图片的步骤会多一步。

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

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

  运行结果:

  这些内容是根据关键字“you”从csdn主页获取的。

  

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

  

  问题:

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

  在img src属性中,有些图片的url不带协议(如:),有些图片的url不带图片后缀(jpg、png、gif...)。前者使程序无法解析url,后者使下载的图片无法统一使用原名。

  有时匹配的 img src 值也会显示为非图像 url。有时从页面获取的内容是一个 unicode 编码的值。还有一些网站做过反爬虫处理等等……

  由于本人对java知识、web知识、网络知识和正则知识知之甚少,目前无法解决以上问题。

  这些问题导致最终从网页上爬下来的内容只是原创网页的一小部分。

  相信未来这些问题都会一一得到解决。

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

  该程序的源代码如下所示。

  编译环境:

  windows jdk 9 的想法

  代码:

  //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 爬取图片类

<p>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; //URL

private URLConnection urlConn = null; //url连接

private BufferedReader bufIn = null; //缓冲读取器,读取网页信息

private static final String IMG_REG = "]*?>"; //img标签正则

private static final String IMG_SRC_REG = "src\\s*=\\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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线