java 抓取拍拍贷网站数据

 
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实现浏览器内核引擎,模拟用户操作,自动完成鼠标点击,表单提交,下载文件等。。。朋友们自由发挥哈,发挥你们的想象

拍拍微服务rpc框架源码.zip # 拍拍微服务体系 拍拍微服务体系是拍拍基础框架部总结内部微服务多年实践,参考、吸收大量业内解决方案形成的适合中型互联网公司的微服务解决方案。 拍拍微服务体系主要组成部分: - Raptor rpc框架。 - Radar服务注册中心。 - Kong网关。 微服务实例启动之后,会自动注册到radar服务注册中心,实例启动正常后,kong网关周期性的将实例信息同步到kong的插件配置。微服务之间的调用、zuul网关调用微服务,都是通过域名进行调用,域名解析到kong网关。Kong网关根据域名和微服务的对应关系,对微服务实例进行负载均衡运算后,得到一个实例,最终进行调用。 拍拍微服务体系主要架构考虑: - 由Kong网关形成的集中式服务治理。降低由于客户端服务治理bugfix等引起的升级成本。 - 采用HTTP 1.1作为底层传输协议,从外部到内部无需进行协议转换。 - 采用HTTP 1.1 作为底层传输协议,不会引起原有基于HTTP协议的已有设施失效。 # Raptor微服务rpc组件 Raptor微服务rpc组件是拍拍基础框架部参考、借鉴了大量已有rpc框架、rpc组件的设计,研发的一款基于google protobuf的轻量级,可扩展的rpc组件。 **Raptor设计理念:** - 微内核。Raptor核心实现raptor rpc必须的服务定义、protobuf序列化/反序列化、扩展接口和最小化实现。 - 可扩展。Raptor核心预留了Client、Endpoint等可扩展接口,提供相应的实现即可替换掉默认的实现。 - 模块化。Raptor核心不提供组装能力,raptor核心提供了rpc框架所需的核心组件,由外部框架进行组装。例如,raptor默认实现提供了基于spring-boot的组装方式。 **Raptor的价值:** - 契约驱动开发模式,以protobuf为契约,帮助企业规模化生产。 - JAVA语言开发,工程性好,保护原有技术投资。 - 预留兼容性,以protobuf为契约,符合社区技术趋势,为后续以protobuf为基础做技术升级留下兼容性。例如,引入grpc,业务契约无需改变。 - 灵活性,可采用集中治理,也可以采用客户端治理;可使用protobuf binary over HTTP也可以使用protobuf json over HTTP,服务提供方根据HTTP头自适应;为架构师留下灵活的选择余地。
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值