leaflet+jpa+webmagic在线爬取租房信息(一)

最终实现 一个城市 租房信息在线爬取 并可是化到地图上

想法:

  • 1 webmagic实现爬取一个城市的租房信息到数据库
  • 2从数据库中读取爬取到的信息展示到前端地图上
  • 3 先做2个简单的一步步来
最终想要的效果图()

模仿

java webmagic 爬取长沙贝壳租房信息

可以参考前面写的webmagic爬取工作的信息

目标网站

后台主要结构
因为主要拿前面那个例子做初步的修改 所有数据库没有变 基本机构差不多 主要发一下修改的部分
贝壳的翻页我还没有做出来 所以目前只有第一页的内容~~~~ 大家可以换个网站爬取
在这里插入图片描述
通过分析主要想获取房源名称、房价、地址、朝向、租赁方式、户型、大小

   private  Long id;
    private String houseName;
    private  String housePrice;
    private  String houseLatlng;
    private  String houseLayout;
    private String houseSize;
    private  String houseDirec;
    private String leasingMethod;
    private  String Url;

数据库表设计
在这里插入图片描述

jobProcessor
public class JobProcessor implements PageProcessor {

    public static    String url="https://cs.zu.ke.com/zufang";
    @Override
    public void process(Page page) {
            // 解析页面获取住房信息详情的url地址
        List<Selectable> list = page.getHtml().css("div#content div.content__list div.content__list--item").nodes();
        // 判断获取到的集合是否为空
        if (list.size() == 0){
            //如果为空表示住房详细页 解析页面 获取住房详情信息保存数据
            this.saveJobInfo(page);
        }else {
            //不为空 解析url放到任务中
            for (Selectable selectable:list){
                //url
              String jobInfourl = selectable.links().toString();
              //把获取到的url放到任务列表中
                page.addTargetRequest(jobInfourl);
            }
            //获取小区的地址

            //获取下一页的url  不好获取
//            String bkUrl = page.getHtml().css("div#content ul").nodes().get(1).regex("/zufang/pg2/#contentList").all().toString();
           //将下一页的url放到任务队列中
//            page.addTargetRequest(bkUrl);
        }
        String html = page.getHtml().toString();


    }
    //解析获取住房详情信息保存数据
    private void saveJobInfo(Page page) {
        //创建住房详情对象
        JobInfo jobInfo = new JobInfo();

        //解析页面
        Html html = page.getHtml();

        //获取数据,封装到对象中
        jobInfo.setLeasingMethod(Jsoup.parse(html.css("div#aside p.content__article__table span").nodes().get(0).toString()).text() );//租赁方式
        jobInfo.setHouseDirec(Jsoup.parse(html.css("div#aside p.content__article__table span").nodes().get(3).toString()).text() );//房子朝向\
        jobInfo.setHouseLatlng(Jsoup.parse(html.css("div#aside p.content__article__table span").nodes().get(1).toString()).text() );//房型
     //   jobInfo.setHouseLatlng(html.css("div.content__map div.map__cur","dataCoord").toString());
       // jobInfo.setHouseLatlng(Jsoup.parse(html.css("div.content__map div.map__cur").nodes().toString()).text() );//房经纬度
        jobInfo.setHouseLayout(Jsoup.parse(html.css("div#aside p.content__article__table span").nodes().get(1).toString()).text() );//房型
        jobInfo.setHouseName(Jsoup.parse(html.css("p.content__title").toString()).text() );//房源名称
        jobInfo.setHousePrice(Jsoup.parse(html.css("div#aside p.content__aside--title span").nodes().get(0).toString()).text() );//房价
        jobInfo.setHouseSize(Jsoup.parse(html.css("div#aside p.content__article__table span").nodes().get(2).toString()).text() );//房子大小
        String addr =Jsoup.parse(html.css(" div.bread__nav p a").nodes().toString()).text();
        String add =Jsoup.parse(html.css(" div.bread__nav h1 a").nodes().get(0).toString()).text();
        String regEx= "[租房|贝壳网|\\[|\\]|\\,]";
        String reStr= "";
        Pattern pattern   =   Pattern.compile(regEx);
        Matcher matcher   =   pattern.matcher(addr);
        reStr = matcher.replaceAll("").trim();
        add= add.replace("租房","");
        String address = reStr + add ;//拼接成房子地址
        //将房子地址放在高德地图中进行地理编码获取经纬度
        jobInfo.setHouseLatlng(address);
        jobInfo.setUrl(page.getUrl().toString());
        //获取发布时间 需要用到正则
//          String time= Jsoup.parse(html.css("div.cn p.ltype").toString()).text();
//          jobInfo.setTime(time.substring(0,time.length()-2));
          //结果保存
        page.putField("jobInfo",jobInfo);
//        jobInfo.setId();
//        jobInfo.setTime();



    }

    private Site site = Site.me()
            .setCharset("utf-8")
            .setTimeOut(10000)//设置超时时间 单位是ms毫秒
            .setRetrySleepTime(30000) //设置重试的间隔时间 1000为默认值
            .setRetrySleepTime(3)
            ;
    @Override
    public Site getSite() {
        return site;
    }
init 启动
	@Override  
	public void run(String... args) throws Exception {  
		//app初始化操作
		
		System.out.println("初始化");

		
	}
controller·
package cn.itcast.job.controller;


import cn.itcast.job.pojo.JobInfo;
import cn.itcast.job.service.JobInfoService;
import cn.itcast.job.task.JobProcessor;
import cn.itcast.job.task.SpringDataPipeline;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;

import java.util.List;

@RequestMapping(value= {"/house"})
@Controller
public class houseController {


    @Autowired
    private SpringDataPipeline springDataPipeline;
    @Autowired
    private JobInfoService jobInfoService;

    //@ResponseBody
    @RequestMapping(value= {"/action"})
    public void action() {
        Spider.create(new JobProcessor())
                .addUrl(JobProcessor.url)
                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(100000)))
                .thread(10)
                .addPipeline(springDataPipeline)
                .runAsync();//异步启动   run()是同步
    }
	//查询数据库信息
    @ResponseBody
    @RequestMapping(value= {"/search"})
    public List<JobInfo> search() {
        return jobInfoService.house();
    }

}
查询出来的结果

在这里插入图片描述

读取数据库信息 jobinfoservice
    public  List<JobInfo> house ();
}
JobInfoServiceImpl
 /**
     *
     * 查找数据库所有数据
     * @return·
     */
    @Override
    public List<JobInfo> house() {

        //执行查询
        List list=this.jobInfoDao.findAll();
        return list;
    }
查询结果图

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

gis_KG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值