java爬虫抓取网页数据(java实现了一个简单的网页数据)
优采云 发布时间: 2021-12-08 04:18java爬虫抓取网页数据(java实现了一个简单的网页数据)
最近用java实现了一个简单的网页数据抓取。下面是实现原理和实现代码:
原理:使用如下URL对象获取链接,下载目标网页的源码,使用jsoup解析源码中的数据,得到想要的内容
1.首先根据网址下载源码:
/**
* 根据网址和编码下载源代码
* @param url 目标网址
* @param encoding 编码
* @return
*/
public static String getHtmlResourceByURL(String url,String encoding){
//存储源代码容器
StringBuffer buffer = new StringBuffer();
URL urlObj = null;
URLConnection uc = null;
InputStreamReader isr = null;
BufferedReader br =null;
try {
//建立网络连接
urlObj = new URL(url);
//打开网络连接
uc = urlObj.openConnection();
//建立文件输入流
isr = new InputStreamReader(uc.getInputStream(),encoding);
InputStream is = uc.getInputStream();
//建立文件缓冲写入流
br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream("F:\\java-study\\downImg\\index.txt");
//建立临时变量
String temp = null;
while((temp = br.readLine()) != null){
buffer.append(temp + "\n");
}
// fos.write(buffer.toString().getBytes());
// fos.close();
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("网络不给力,请检查网络设置。。。。");
}catch (IOException e){
e.printStackTrace();
System.out.println("你的网络连接打开失败,请稍后重新尝试!");
}finally {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return buffer.toString();
}
2.根据下载的源码分析数据得到你想要的内容,这里我拿图,你也可以在贴吧中得到邮箱、电话等
/**
* 获取图片路劲
* @param url 网络路径
* @param encoding 编码
*/
public static void downImg(String url,String encoding){
String resourceByURL = getHtmlResourceByURL(url, encoding);
//2.解析源代码,根据网络图像地址,下载到服务器
Document document = Jsoup.parse(resourceByURL);
//获取页面中所有的图片标签
Elements elements = document.getElementsByTag("img");
for(Element element:elements){
//获取图像地址
String src = element.attr("src");
//包含http开头
if (src.startsWith("http") && src.indexOf("jpg") != -1) {
getImg(src, "F:\\java-study\\downImg");
}
}
}
3. 根据获取到的图片路径下载图片,这里我下载的是携程网的内容
/**
* 下载图片
* @param imgUrl 图片地址
* @param filePath 存储路劲
*
*/
public static void getImg(String imgUrl,String filePath){
String fileName = imgUrl.substring(imgUrl.lastIndexOf("/"));
try {
//创建目录
File files = new File(filePath);
if (!files.exists()) {
files.mkdirs();
}
//获取地址
URL url = new URL(imgUrl);
//打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//获取输入流
InputStream is = connection.getInputStream();
File file = new File(filePath + fileName);
//建立问价输入流
FileOutputStream fos = new FileOutputStream(file);
int temp = 0;
while((temp = is.read()) != -1){
fos.write(temp);
}
is.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
最后是调用过程
public static void main(String[] args) {
//1.根据网址和页面编码集获取网页源代码
String encoding = "gbk";
String url = "http://vacations.ctrip.com/";
//2.解析源代码,根据网络图像地址,下载到服务器
downImg(url, encoding);
}
总结:根据上面实现的简单数据爬取,存在一些问题。我爬的旅游页面有很多图片。根据img属性,我在src里面拿到了下载图片的地址,但是页面图片很多。结果但是我只能爬到一小部分,如下图:
我把下载的源代码写成文件,和原来的网页对比。基本上,没有页面浏览的图片,也没有在源代码中。不知道为什么,求网友解答。