java简易爬虫Crawler


小型简易爬虫源码(java版)



一,介绍:
          >这是我的第一个爬虫,比较简单,没有队列,广度优先算法等,用list集合代替了队列。
       >而且只爬取一个网址上面的图片,并不是将网址中的链接<href>加入队列,然后下载一个网址一个网址下载其中的图片。
       >不过,这是前期的,处于摸索阶段,后期学完队列和广算后,在涉及一点多线程,肯定会比想象中的更实用。

二,代码:

Start_Crawler类:
package com.xhs.crawler;

import java.util.Scanner;

/**
 * @author XHS_12302
 * @version  1.0
 * @date  2017_07_11
 * 
 * 
 * @description 这是我的第一个爬虫,比较简单,没有队列,广度优先算法等,用list集合代替了队列。
 *              而且只爬取一个网址上面的图片,并不是将网址中的链接<href>加入队列,然后下载一个网址一个网址下载其中的图片。
 *              不过,这是前期的,处于摸索阶段,后期学完队列和广算后,在涉及一点多线程,肯定会比想象中的更实用
 */
public class Start_Crawler {
	public static void main(String[] args) {
		System.out.println("请输入网址:");
		
		//获取用户要爬取的网址
		Scanner in=new Scanner(System.in);
		String url=in.next();
		
		//通过用户的输入建立一个Get_Html的一个g对象
		Get_Html g=new Get_Html(url);
		//调用g中的get()方法模拟请求网站服务器,返回回应的字符串
		String htmlstr=g.get();
		
		//建立一个Html_analyze对象ha用来分析服务器返回来的字符串
		Html_analyze ha=new Html_analyze(htmlstr);
		
		/*for (String href :ha.analyzeHtmlHref()) {
			System.out.println(href);
		}*/
		
		//调用ha.analyzeHtmlImage()方法将分析出来的图片地址放进list里面,传回来一个图片地址集合,
		//然后新建下载。
		new Download_pic().Download(ha.analyzeHtmlImage());
		
		System.out.println("program has done!");
		in.close();
	}
}

Get_Html类:

package com.xhs.crawler;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class Get_Html {
	private String url_path;
	private String htmlstr;
	StringBuffer contentBuffer = new StringBuffer();
	Get_Html(String url){
		this.url_path=url;
	}

	public String get(){
		   FileWriter fw=null;
		try {
			fw=new FileWriter("C:\\Users\\Administrator\\Desktop\\crawler.txt");
			URL url=new URL(url_path);
			URLConnection hc=url.openConnection();
			hc.setConnectTimeout(5000);
			hc.setDoInput(true);
			((HttpURLConnection) hc).setRequestMethod("GET");
			int returnCode=((HttpURLConnection) hc).getResponseCode();
			if(returnCode==200){
				InputStream input=hc.getInputStream();
				
				 InputStreamReader istreamReader = new InputStreamReader(input, "utf-8");  
		         BufferedReader buffStr = new BufferedReader(istreamReader);  
		  
		        String str = null;  
		       while ((str = buffStr.readLine()) != null) 
		          contentBuffer.append(str);
		          htmlstr=contentBuffer.toString();
                  fw.write(htmlstr);
			   input.close();
			   istreamReader.close();
			   buffStr.close();
			   fw.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return htmlstr;
		
	}
	
	
}

Html_analyze类:
package com.xhs.crawler;


import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Html_analyze {
	private String src;
	Html_analyze(String src){
		this.src=src;
	}
	public List<String> analyzeHtmlImage(){
		String regex="http[s]{0,1}://[^\\s]*\\.(jpg|bmp|png)";
		//String sr="http://img5.imgtn.bdimg.com/it/u=1380084653,2448555822&fm=26&gp=0.jpg";
		List<String> listImgUrl=new ArrayList<>();
		Pattern p=Pattern.compile(regex);
		Matcher m=p.matcher(src);
		while(m.find()){
			System.out.println(m.group());
			listImgUrl.add(m.group());
		}
		System.out.println("\n\n总共找到记录:"+listImgUrl.size()+"\n");
		return listImgUrl;
	}
	public List<String>  analyzeHtmlHref(){
		//分析href标签   并且加入listHref
		String regex="<a.*?href=\"(.*?)\">";
		List<String> listHref=new ArrayList<>();
		Pattern p=Pattern.compile(regex);
		Matcher m=p.matcher(src);
		while(m.find()){
			listHref.add(m.group());
		}
		return listHref;
	}
}

Download_pic类:
package com.xhs.crawler;

import java.io.File;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import java.util.List;

public class Download_pic {
	public void Download(List<String> listImgSrc) {
		int count = 1;
		for (String url_path : listImgSrc) {
			InputStream in = null;
			FileOutputStream fo = null;
			String imageName = url_path.substring(
					url_path.lastIndexOf("/") + 1, url_path.length());
			try {
				byte[] data = new byte[500];// 1024
				File f = new File(
						"C:\\Users\\Administrator\\Desktop\\crawler\\");
				if (!f.exists()) {
					f.mkdir();
				}
				fo = new FileOutputStream(new File(f.getAbsolutePath() + "\\"
						+ imageName));
				URL url = new URL(url_path);
				HttpURLConnection con = (HttpURLConnection) url
						.openConnection();
				con.setConnectTimeout(5000);
				con.setDoInput(true);
				con.setRequestMethod("GET");
				// con.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
				// 设置代理
				int numCode = con.getResponseCode();
				in = con.getInputStream();// int length
				int lengthZ = 0;
				if (numCode == 200) {
					while ((lengthZ = in.read(data)) != -1) {
						fo.write(data, 0, lengthZ); // write(data,0,length);
						fo.flush();
					}
					System.out.println("下载成功:\t" + imageName + "\t剩余:\t"
							+ (listImgSrc.size() - count));
				} else {
					System.out.println("访问失败,返回码不是200");
				}

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println(imageName + "下载失败");
			} finally {
				try {
					if (in != null)
						in.close();
					if (fo != null)
						fo.close();
					count++;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					// e.printStackTrace();
					System.out.println("关闭流出现点问题··");
				}
			}

		}
	}

}

三:截图




这个只是简易的小东西,不过感觉挺好玩的。
       感兴趣的朋友可以自己试试,如果不能满足你要求,
               这儿给你提供一种想法,你可以利用这种特性爬
                      取csdn博客文章访问量。^_^



联系邮箱:xhsgg12302@outlook.com

                                                                                                                                                                                                                                                                                                                                                                2017_07_11
  • 117
    点赞
  • 329
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
SeimiCrawler(Java 爬虫框架)更新 支持在Request对象中,通过header(map)来自定义本次请求的header,以及支持通过seimiCookies来自定义cookies,自定义cookies会直接进入cookiesStore,对同域下第二次请求依然有效 优化默认启动方式,改造cn.wanghaomiao.seimi.boot.Run支持CommandLineParser,可以使用 -c 和-p来传参,其中-c用来指定crawlernames,多个用','分隔,-p指定一个端口,可以选择性的启动一个内嵌的http服务,并开启使用内嵌http接口 maven-compiler-plugin打包插件升级为1.3.0,完善Linux下的脚本,并增加启动配置文件,可以到maven-compiler-plugin主页详细查看 默认下载器改为Apache Httpclient,备用为下载器OkHttp3实现 优化部分代码 demo日志默认全部输出至控制台 SeimiCrawler(Java 爬虫框架)简介 SeimiCrawler是一个敏捷的,独立部署的,支持分布式的Java爬虫框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人只需关心去写抓取的业务逻辑就够了,其余的Seimi帮你搞定。设计思想上SeimiCrawler受Python的爬虫框架Scrapy启发,同时融合了Java语言本身特点与Spring的特性,并希望在国内更方便且普遍的使用更有效率的XPath解析HTML,所以SeimiCrawler默认的HTML解析器是JsoupXpath(独立扩展项目,非jsoup自带),默认解析提取HTML数据工作均使用XPath来完成(当然,数据处理亦可以自行选择其他解析器)。并结合SeimiAgent彻底完美解决复杂动态页面渲染抓取问题。 SeimiCrawler(Java 爬虫框架)展示   相关阅读 同类推荐:站长常用源码
您好!对于使用Java编写网络爬虫,我们可以使用Jsoup库来进行HTML解析和数据抓取。 首先,您需要在项目中引入Jsoup库。您可以在Maven或Gradle构建工具中添加以下依赖项: Maven: ```xml <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency> ``` Gradle: ```groovy implementation 'org.jsoup:jsoup:1.13.1' ``` 接下来,您可以使用Jsoup来获取和解析网页内容。以下是一个简单的示例代码,演示如何使用Jsoup来爬取网页并提取所需的数据: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class WebCrawler { public static void main(String[] args) { try { // 使用Jsoup连接到目标网页 Document document = Jsoup.connect("http://example.com").get(); // 使用CSS选择器提取所需的元素 Elements links = document.select("a[href]"); // 遍历并打印提取到的元素 for (Element link : links) { System.out.println("Link: " + link.attr("href")); System.out.println("Text: " + link.text()); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们使用`Jsoup.connect()`方法连接到目标网页,并使用`document.select()`方法使用CSS选择器提取所有带有`href`属性的链接元素。然后,我们遍历这些链接元素,并打印出链接的URL和文本。 您可以根据自己的需求进一步扩展和修改代码来满足特定的爬虫需求。请注意,在编写爬虫时,请遵守相关网站的使用条款和政策,以避免违反规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值