最终实现 一个城市 租房信息在线爬取 并可是化到地图上
想法:
- 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;
}