Java实现网络爬虫

昨晚用自己写的网络爬虫程序从某网站了下载了三万多张图片,很是爽快,今天跟大家分享几点内容。

一、内容摘要

1:Java也可以实现网络爬虫

2:Jsoup.jar包的简单使用

3:可以爬某网站的图片,动图以及压缩包

4:可以考虑用多线程加快下载速度

二、准备工作

1:安装Java JDK

2:下载Jsoup.jar

3:安装Eclipse或其他编程环境

4:新建一个Java项目,导入Jsoup.jar

三、步骤

1:用Java.net包联上某个网址获得网页源代码

2:用Jsoup包解析和迭代源代码获得自己想要的最终图片网址

3:自己写一个下载的方法根据图片网址来下载图片至本地

四、程序实现及效果

例如针对下面的网页,我们可以所主区域中第一页到最后一页的所有高清图片都下载下来。

效果图:

程序实现:

package com.kendy.spider;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class mySpider {

	/**
	 * 联网,获取网页源代码,解析源代码
	 */
	public static String getHtmlFromUrl(String url,String encoding){
		StringBuffer html = new StringBuffer();
		InputStreamReader isr=null;
		BufferedReader buf=null;
		String str = null;
		try {
			URL urlObj = new URL(url);
			URLConnection con = urlObj.openConnection();
			isr = new InputStreamReader(con.getInputStream(),encoding);
			buf = new BufferedReader(isr);
			while((str=buf.readLine()) != null){
				html.append(str+"\n");
			}
			//sop(html.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(isr != null){
				try {
					buf.close();
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return html.toString();
	}
	public static void download(String url,String path){
		File file= null;
		FileOutputStream fos=null;
		String downloadName= url.substring(url.lastIndexOf("/")+1);
		HttpURLConnection httpCon = null;
		URLConnection  con = null;
		URL urlObj=null;
		InputStream in =null;
		byte[] size = new byte[1024];
		int num=0;
		try {
			file = new File(path+downloadName);
//			if(!file.exists()){
//				file.mkdir();
//			}
			fos = new FileOutputStream(file);
			if(url.startsWith("http")){
				//下面这两句话有问题
				urlObj = new URL(url);
				con = urlObj.openConnection();
				httpCon =(HttpURLConnection) con;
				in = httpCon.getInputStream();
				while((num=in.read(size)) != -1){
					for(int i=0;i<num;i++)
					   fos.write(size[i]);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			try {
				in.close();
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	public static void sop(Object obj){
		System.out.println(obj);
	}
	public static void seperate(char c){
		for(int x=0;x<100;x++){
			System.out.print(c);
		}
		sop("");
	}
	/**
	 * @author kendy
	 * @version 1.0
	 */
	public static void main(String[] args) throws Exception{
		int i=0;
		String picUrl=null;
		List<String> list = new ArrayList<>();

		for(int x=11;x<=16;x++){

			String url = "http://so.sccnn.com/search/%D6%D0%B9%FA%C3%CE/" +x+".html";
			String encoding = "utf-8";
			String html = getHtmlFromUrl(url,encoding);

			Document doc = Jsoup.parse(html);
			Elements elements = doc.select("table tbody tr td table tbody tr td table tbody tr td div[valign] a[href]"); //带有href属性的a元素
			//Elements pngs = doc.select("img[src$=.png]");//扩展名为.png的图片

			for(Element element : elements){
				picUrl = element.attr("href");
				if(picUrl.startsWith("http") && picUrl.endsWith("html")){
					i++;
					list.add(picUrl);
					sop("网址"+i+":  "+picUrl);
					Document document = Jsoup.connect(picUrl).get();
					Elements els = document.select("div.PhotoDiv div font img");
					for(Element el : els){
						String pictureUrl = el.attr("src");
						System.out.println("------"+pictureUrl);
						download(pictureUrl,"E:\\myDownload\\");
					}
				}
			}
			seperate('*');
		}
		sop(list.size());

	}

	/*	public static void main(String[] args) {
		int i=0;
		String picUrl=null;
		String url = "http://so.sccnn.com/";
		String encoding = "utf-8";
		String html = getHtmlFromUrl(url,encoding);
		Document doc = Jsoup.parse(html);
		Elements elements = doc.getElementsByTag("img");
		for(Element element : elements){
			picUrl = element.attr("src");
			if(picUrl.startsWith("http") && picUrl.endsWith("jpg")){
				i++;
				sop("图片"+i+" -------------"+picUrl);
				download(picUrl,"E:\\myDownload\\");
			}
		}
		sop("结束。。。");

	}*/
}

备注说明:

1:自定义的getHtmlFromUrl()方法和Jsoup.pars()方法其实可以用Jsoup.connect(url).get()方法代替

2:访问http和https请求不同,可以对自定义的getHtmlFromUrl和download方法进行优化

3:可以考虑用多线程加快下载速度,即本类去实现Runnable接口,并重写run方法,在构造函数里面把起始页和结束页作为参数初始化本类。

时间: 2024-10-04 17:28:30

Java实现网络爬虫的相关文章

Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1

Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1 一.简介 版本匹配: WebCollector2.12 + selenium2.44.0 + phantomjs 2.1.1 动态网页爬取: WebCollector + selenium + phantomjs 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test">

JAVA多线程网络爬虫的代码实现

因为项目需要,做了一个网络爬虫的小DEMO. 为实现高性能的网络爬虫,首先考虑采用APACE的HttpClient进行页面的采集和解析,HttpClient可以很方便的通过URL获得远程内容,例如一个小程序:     CloseableHttpClienthttp client = HttpClients.createDefault();     HttpGet httpget = newHttpGet("http://localhost/");     CloseableHttpRe

基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平台. 目录 网络爬虫框架 网络爬虫的逻辑顺序 网络爬虫实例教学 model main util parse db 再看main方法 爬虫效果展示 网络爬虫框架 写网络爬虫,一个要有一个逻辑顺序.本文主要讲解我自己经常使用的一个顺序,并且本人经常使用这个框架来写一些简单的爬虫,复杂的爬虫,也是在这个基

使用Java实现网络爬虫

网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫.网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取 网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止.如果把整 个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上

Java版网络爬虫基础(转)

网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广度优先,概括的说来如下: 2个数组,一个记录已访问的网页(Al),一个记录未访问的网页(Un).假设网页A为爬取的起始点,分析A中的所有的超链接B,C,D,将B,C,D加入到Un,分析B中的所有的超链接E,F,将E,F加入到Un末尾,将B从Un除去并加入到AL.依次分析Un中的超链接并加入到Un中就

Java版网络爬虫基础

网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广度优先,概括的说来如下: 2个数组,一个记录已访问的网页(Al),一个记录未访问的网页(Un).假设网页A为爬取的起始点,分析A中的所有的超链接B,C,D,将B,C,D加入到Un,分析B中的所有的超链接E,F,将E,F加入到Un末尾,将B从Un除去并加入到AL.依次分析Un中的超链接并加入到Un中就

Java编写网络爬虫笔记(第三部分:Jsoup的强大)

基于httpclient下载的页面,接着就是应该提取url了,最开始我用的是htmlpraser,过几天后,我就发现了还有jsoup这个包,非常的好用,接着我就直接用jsoup来抓取页面和提取出里面的url了,在这里跟大家分享一下代码. import java.io.IOException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.jsoup.Jsoup; impo

JAVA平台上的网络爬虫脚本语言 CrawlScript

网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个简单 的操作.鉴于这个问题,我们开发了CrawlScript这种脚本语言,程序员只需要写2-3行简单的代码,就可以制作一个强大的网络爬虫.同 时,CrawlScript由JAVA编写,可以在其他JAVA程序中被简单调用. CrawlScript是一种具有爬虫功能的javascript CrawlScript是在ECMA标准的基础上设计的语言,是一种java

IT忍者神龟之Java网络爬虫回顾

Java的网络爬虫技术,发现网络爬虫技术首先分为以下几个步骤: 1.打开网页链接 2.把网页代码用一个BufferedReader存放 以下是我做的一个代码实例: 在学习网络爬虫的过程中首先要导入两个包:htmllexer.jar,htmlparser.jar public static void main(String[] args) { try { URL url = new URL("http://www.baidu.com"); HttpURLConnection httpur