java 抓取拍拍贷网站数据

原创 2015年07月06日 16:41:46
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * 抓取拍拍贷网站(http://invest.ppdai.com/loan/list_riskhigh?monthgroup=&rate=0&didibid=)数据
 * @author yesf
 *
 */
public class Main {
	private final static String[] headerTitles = new String[]{"用户", "借入信用", "借出信用", "性别年龄", "目前身份", "次数", "借款金额", "年利率", "期限", "还款方式", "投标人数", "状态"};
	private final static String FILE_PATH = "./正常数据_高风险收益区.csv";
	private final static WebClient CLIENT = new WebClient(BrowserVersion.CHROME);
	
    /**    
       
     * main(这里用一句话描述这个方法的作用)    
     * @param   name    
     * @param  @return    设定文件    
     * @return String    DOM对象    
     * @Exception 异常对象     
     */
    public static void main(String[] args) {
        CLIENT.getOptions().setJavaScriptEnabled(false);
        CLIENT.getOptions().setCssEnabled(false);
        HtmlPage page = null; 
        try {
        	// http://invest.ppdai.com/loan/list_safe_s0_p1?Rate=0
        	// http://invest.ppdai.com/loan/list_riskmiddle?monthgroup=&rate=0&didibid=
            page = CLIENT.getPage("http://invest.ppdai.com/loan/list_riskhigh?monthgroup=&rate=0&didibid=");
            for(;;) {
                parseContent(page);
                HtmlAnchor anchor = (HtmlAnchor)page.getByXPath("//a[@class='nextpage']").get(0);
                if(anchor.getAttribute("href").equals("javascript:void(0)")) {
                    break; 
                }
//                page = anchor.click(); 
                page = CLIENT.getPage("http://invest.ppdai.com" + anchor.getHrefAttribute());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        CLIENT.close();
    }

    private static void parseContent(HtmlPage page) throws IOException {
        List<HtmlElement> elements = (List<HtmlElement>)page.getByXPath("//p[@class='userInfo clearfix']");
        for(HtmlElement element : elements) {
        	HtmlAnchor anchor = (HtmlAnchor) element.getFirstElementChild();
        	String userName = anchor.asText();
//        	HtmlPage userPage = anchor.click();
        	HtmlPage userPage = CLIENT.getPage(anchor.getHrefAttribute());
        	
        	String honorLi = ((HtmlElement)(userPage.getByXPath("//li[@class='honor_li']").get(0))).asText().replaceAll("\r", "").replaceAll("\n", "");
            String userLi = ((HtmlElement)(userPage.getByXPath("//li[@class='user_li']").get(0))).asText().replaceAll("\r", "").replaceAll("\n", "");
           
            List<HtmlDivision> divList = (List<HtmlDivision>) userPage.getByXPath("//div[@class='borrowlist_tit']");
            List<HtmlDivision> divList1 = (List<HtmlDivision>) userPage.getByXPath("//div[@class='borrow_list']");
            for(int i=0; i<divList.size(); i++) {
            	HtmlDivision div = divList.get(i);
            	HtmlDivision div1 = divList1.get(i);
            	String text = div1.asText().replace(",", "").replaceAll("\r", "").replaceAll("\n", "");
            	int start = text.indexOf("状态:");
            	int end = text.indexOf("借入信用:");
            	String status = "";
            	if (start != -1 && end != -1) {
            		status = text.substring(start, end);
            	}
//            	System.out.println(text);
            	
//            	 HtmlPage userDetailPage = ((HtmlAnchor)(div.getFirstElementChild())).click();
            	 HtmlPage userDetailPage = CLIENT.getPage("http://www.ppdai.com" + ((HtmlAnchor)div.getFirstElementChild()).getHrefAttribute());
                 String successCnt = ((HtmlElement)(userDetailPage.getByXPath("//span[@class='bidinfo']").get(0))).asText();
                 String detail = ((HtmlDivision)userDetailPage.getByXPath("//div[@class='newLendDetailMoneyLeft']").get(0)).asText().replaceAll(",", "");
                 String payWay = ((HtmlDivision)userDetailPage.getByXPath("//div[@class='item w260']").get(0)).asText();
                 String biaoCnt = ((HtmlDivision)userDetailPage.getByXPath("//div[@class='item w164']").get(0)).asText();
                 
//                 String moneyAll = userDetailPage.getElementById("listRestMoney").asText().replace(",", "");
                 
                 String sourceData = "用户: " + userName + " " + honorLi + " 性别年龄: " + userLi + " 次数: " + successCnt + " " + detail + " " + payWay + biaoCnt + status;//+ " 金额: " + moneyAll;
//                 System.out.println(sourceData);
                 String data = formatData(sourceData);
//                 System.out.println(data);
                 writeToCsv(FILE_PATH, data);
            }
        }
    }
    
    private static String formatData(String data) {
    	data = data.replaceAll(":", ",").replaceAll(":", ",");
    	for(String headerTitle : headerTitles) {
    		data = data.replace(headerTitle, "");
    	}
    	return data;
    }
    
    private static void writeToCsv(String filePath, String data) {
    	File file = new File(filePath);
    	BufferedWriter writer = null;
    	boolean first = false;
    	try {
	    	if(!file.exists()) {
	    		file.getParentFile().mkdirs();
	    		file.createNewFile();
	    		first = true;
	    	}
	    	writer = new BufferedWriter(new FileWriter(file, true));
	    	if(first) {
	    		StringBuilder sb = new StringBuilder("");
	    		for(String header : headerTitles) {
	    			sb.append(",").append(header);
	    		}
	    		writer.write(sb + "\r\n");
	    	}
	    	writer.write(data + "\r\n");
    	} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}				
			}
		}
    }

}

生成的目标文件如下:


功能实现核心技术采用htmlunit开源框架,纯java实现浏览器内核引擎,模拟用户操作,自动完成鼠标点击,表单提交,下载文件等。。。朋友们自由发挥哈,发挥你们的想象

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

切换全半角

对于微软拼音(Windows10自带) 使用 Shift + Space 就可以切换全角半角半角:abcdefg 全角:abcdefg...
  • YYecust
  • YYecust
  • 2016年06月13日 11:32
  • 163

关于Anaconda下载慢的解决方法

相信大家不能忍受Anaconda官网蜗牛一样的下载速度,而且还很容易短。本人在知乎上找到持续更新的资源,链接如下。感谢~(有用点个赞吧) Anaconda资源...

java抓取网站数据

  • 2012年05月08日 09:29
  • 101KB
  • 下载

java 抓取网站数据

假设你需要获取51job 人才网上java 人才的需求数量,首先你需要分析51job 网站的搜索这 一块是怎么运作的,通过解析网页的源代码,我们发现了以下一些信息: 1. 搜索时页面请求的UR...

Java抓取网站数据

一直在用kettle做数据处理的工作,最近有个项目组需求,用kettle好像没法直接达到目的,遂自己写代码来实现。需求如下:从这个网站http://ztb.whx.gov.cn/SortHtml/1/...

使用java 爬虫 抓取youtube,youku,facebook 等视频网站的视频数据(请求规则的分析)

最近 使用java爬虫  抓取了公司放在一些视频网站上的视频的指定数据,记录一下抓取规则 腾讯视频:http://c.v.qq.com/vchannelinfo?otype=json...

java 开发用到网络爬虫,抓取某某网站数据经历

经历了两个礼拜的折腾,某某知名网站的数据终于到手了。犯罪没被发现这种心情感觉很爽。 说一下我的犯罪经历,之前公司总是抓取某某网站数据,可能是被发现了。某某网站改变了策略。通过各种技术终止了我们的行为,...

java对xml进行的DOM 解析以及如何对网站数据进行加密

第九讲   使用jaxp对xml文档进行DOM解析 像xml文档中添加文档:34 book.xml              DocumentBuilderFactory...

大型网站系统与Java中间件实践 第5章 数据访问层

数据库水平/垂直拆分的困难给数据库减压 优化应用 缓存、搜索引擎 数据库拆分...
  • enzoy
  • enzoy
  • 2016年09月01日 13:19
  • 282

P2P小贷网站业务数据流程分享

P2P小贷网站业务数据流程 引言 这是去年年底开发的一个项目,完成后和用户的衔接没有很好的做起来,所以项目就搁浅了。 9月以来,看各路P2P风声水起,很是热闹; 这里分享下我的设计文档,算是抛...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 抓取拍拍贷网站数据
举报原因:
原因补充:

(最多只允许输入30个字)