怎样抓取网页数据( 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