11
回答
如何下手学习java的爬虫?
【腾讯云】学生服务器套餐10元/月 >>>   

最近想自己学习下爬虫技术。

可是又不知道如何下手。

java爬虫技术该如何下手?有哪些框架?或是哪些书或者是资料什么的?

希望大家能给出点建议。

谢谢!

举报
凯哥java
发帖于2年前 11回/1K+阅
共有11个答案 最后回答: 1年前
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 

/** 
 * @author  
 * @comment todo说明
 * @date 创建时间:2016年6月12日 下午3:07:31 
 * @version 1.0 
 * @since   
 */
public class RosterDownload {
	private static int start = 1;
    private static int begin = start+1;
    private static int end = 1000;
	private static ArrayBlockingQueue<String[]> bodys = new ArrayBlockingQueue<String[]>(500);

	static File file = new File("E:\\gzb-roster"+end+".txt");
	static HttpClient client = new HttpClient();
	static AtomicBoolean shutdown = new AtomicBoolean(false);
	public static void main(String[] args) throws Exception {
		String httpUrl = "http://door.cggc.cn/portal/html/portlets/searchPerson/search.jsp?keyword=&pageNum=";
		new Thread(new DataWriterThread()).start();
		for(int i=start;i<=end;i++){
			getResult(httpUrl, i+"");
		}
		Thread.sleep(10000);
		shutdown.set(true);
	}

	public static List<String> deal(String body) {
		Document doc = Jsoup.parse(body);
		Element table =doc.select("form").first().select("table").first().select("tbody").select("table").first();
		Elements rows = table.select("tr");
		List<String> list = new ArrayList<String>();
		for(Element row:rows){
			if(row.hasAttr("bgcolor")){
				continue;
			}
			Elements cols = row.select("td");
			StringBuffer sb = new StringBuffer();
			for(Element td:cols){
				sb.append(td.text()).append("|");
			}
			list.add(sb.toString());
		}
		return list;
	}


	public static void getResult(String url, String param) {
		
		url += param;
		GetMethod method = new GetMethod(url);

		method.addRequestHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36");
		method.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
		method.addRequestHeader("Cookie", "ASPSESSIONIDAATBRDCT=OBJKHMHAJAOIBKAGHGDAHFDN");
		method.addRequestHeader("Connection", "keep-alive");
		 
		try {
			int status = client.executeMethod(method);
			System.out.println("******************" + status+":"+param);
			if (status != 200) {
				return;
			}
			String result = new String(method.getResponseBody(), "gbk");
			bodys.put(new String[] { param,  result});

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			method.releaseConnection();
		}

	}

	static class DataWriterThread implements Runnable {

		@Override
		public void run() {
			FileWriter fr = null;
			BufferedWriter br = null;
			try {
				fr = new FileWriter(file, true);
				br = new BufferedWriter(fr);
				while (!shutdown.get()) {
					try {
						String[] data = bodys.take();
						String id = data[0];
						String body = data[1];
						List<String> list = deal(body);
						for(String row:list){
							br.write(row);
							br.newLine();	
						}
						br.flush();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} finally {
				try {
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}



--- 共有 1 条评论 ---
凯哥java嗯嗯 。好的 谢谢您!可以加你好友吗? 2年前 回复
第一步,入门就是用java自带的HttpURLConnection获取源码,然后用正则匹配就是一个简单的爬虫。python爬虫也是不错的选择:http://edu.51cto.com/course/course_id-581.html
第二步,你会发现很多网站并不能爬到想要的数据,你需要鸟枪换大炮,使用Apache的Httpclient来进行爬,慢慢了解cookie,或者是一些http请求头,ua等等。源码解析使用Jsoup,非常方便。
第三步,httpclient使用熟练后,一个非常适合初学者的框架webmagic,先会用,然后研究源码,看看真正的爬虫是怎样的。另外,你需要对http协议非常了解。

--- 共有 1 条评论 ---
凯哥java你好,java的demo吗? 2年前 回复

httpClient + Jsoup +多线程足以

第一步 通过用httpClient根据url将网页下载下来

第二步 用jsoup提取网页中你需要的信息 

第三步如果url是有规律的 直接多线程或循环去获取下个url的功能,如果是从第一个url中页面分析提取的url 则将提取的url放到队列中

--- 共有 1 条评论 ---
凯哥java你好,对这方面一点都不了解。如何下手? 2年前 回复

我上传了一个爬虫小工具,自己下载,玩玩,改改,然后你就会了,就是这么简单,需要一点耐心。

简单点说,爬虫小工具,就是模拟浏览器访问某个网站,然后获取到整个页面,转成字符串,利用字符串截取,截取你需要的内容,这就需要你分析整个页面的源码,然后找到规律。

--- 共有 1 条评论 ---
凯哥java嗯嗯 。好的!谢谢您。 2年前 回复

首先,你要会看网页源码,知道基本的get和post请求,也就是说了解一些http协议的东西;其次,你要会一点css选择器语法;之后呢,看一下Jsoup的语法,很简单的;当然了,接下来就是借助楼上几位所说的HttpClient工具进行模拟浏览器请求了,然后用Jsoup进行解析,然后入库,就是这样

--- 共有 1 条评论 ---
凯哥java知道基本的get和post请求,也就是说了解一些http协议的东西;其次,你要会一点css选择器语法。这些会一些,因为做java开发有两年了。jsoup,好的 谢谢! 2年前 回复
去觉得你应该从HTTP协议开始学,我发现熟悉HTTP协议后,其他都不是问题,别的语言也可以实现。
刚开始别用爬虫框架,要知道爬虫的大概流程就可以开发了。 例如: 1. 获取某URL的Html源码 2. 然后用正则表达式获取这个源码中你想要的内容。 3. 然后再把这些内容保存(文件或者数据库)中 这就是最最最简单的爬虫了 然后就可以考虑使用更简单的方式来从源码中获取数据。比如jsoup之类的 再之后你还得考虑定时任务,配置完爬虫让它自己按时爬取了。。。 一步步来…
顶部