Java爬虫入门笔记

今天一天都在想怎么爬到我需要的数据,然后用Java代码实现了一下。以前只是知道正则表达式很强大,但是看起来头晕,所以也懒得去看。
然后突然要爬数据,看到别人写的例子,一大堆的正则表达式,所以硬着头皮也去入了一个门。
附上参考网站,很给力的正则学习,30分钟真能入门。

正则表达式30分钟入门教程

1 需求:比如要从这样一个网页上抓取数据
http://map.baidu.com/detail?qt=ninf&from=housezt&detail=house&uid=5ef5edbdc64c1bb49e9d6899
这里写图片描述
这个请求最后面的uid其实是百度地图上查到该点的uid(也就是5ef5edbdc64c1bb49e9d6899),我的数据库里面已经获取了武汉的房地产的uid,现在要通过uid获取详细信息。
先从一个着手,再多的数据也是循环抓取了。

2 发送请求到网页 ,用到HttpURLConnection类
这里用别人写好的一个

package connection;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ConnectionUtil {
   
    public static String Connect(String address){
        HttpURLConnection conn = null;
        URL url = null;
        InputStream in = null;
        BufferedReader reader = null;
        StringBuffer stringBuffer = null;
        try {
            url = new URL(address);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setDoInput(true);
            conn.connect();
            in = conn.getInputStream();
            reader = new BufferedReader(new      InputStreamReader(in));
            stringBuffer = new StringBuffer();
            String line = null;
            while((line = reader.readLine()) != null){
                stringBuffer.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            conn.disconnect();
            try {
                in.close();
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return stringBuffer.toString();
    }
}

3 接收服务器返回的页面html数据
返回了html字符串之后,首先要明确需要抓取的数据是哪些,分析网页的特点。
比如我现在要抓取的数据有:
这里写图片描述

        图片url
        价格
        房屋类型
        建筑类型
        建筑年代
        容积率
        物业费
        物业公司
        开发商

然后分析它的html结构:
这里写图片描述

分析好结构之后就好写正则表达式了,用来匹配获取。

4 进行解析

package main;

import connection.ConnectionUtil;

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

public class Analyze {
   

    //使用时调用此方法,传入uid,如 5ef5edbdc64c1bb49e9d6899,返回的是一个字符串,可以打印出来看一下
    public String regexMain(String uid) {
        String url="http://map.baidu.com/detail?qt=ninf&from=housezt&detail=house&uid="+uid;
        String result = ConnectionUtil.Connect(url);
        return getHouseInfo(result);
    }

    private String getHouseInfo(String targetStr) {

        StringBuilder lastInfo=new StringBuilder();
        //提取图片url
        Pattern imgpattern=Pattern.compile("<img class=\"img-large\".*\" />");
        Matcher imgmatcher=imgpattern.matcher(targetStr);
        while (imgmatcher.find()){
            String imgString=imgmatcher.group();
            int n=imgString.lastIndexOf("=\"");
            String imgUrl=imgString.substring(n+2,imgString.length()-3);
//System.out.println("imgRul:"+imgUrl);
            lastInfo.append("图片url:"+imgUrl+"\n");
        }
        //首先提取出包含房产信息的html片段,再分别处理
        Pattern pattern1 = Pattern
                .compile(
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带着天使反上帝 - Kaybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值