Java-POI大数据分析 -实体店选址POI数据分析-5天,多网站爬虫数据融合处理

news/2024/5/20 15:47:50/文章来源:https://blog.csdn.net/weixin_49139876/article/details/115214690

实体店选址大数据分析-保定地区-POI数据-powermap-爬虫获取真实数据

讲一下项目的思路
预期通过获得poi数据进行分析,以为实体店选址进行决策

数据源
58同城店铺转让数据
安居客小区详细信息数据
安居客小区平均房价数据

上爬虫代码

package wubaSpider;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.downloader.selenium.SeleniumDownloader;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import wubaSpider.pojo.AnjukePojo;
import Util.AnjukeDataUtil;
import Util.AnjukeDataUtil2;
import bossSpider.Blibli_Selemium;public class Anjuke_spider3 implements PageProcessor{List<String> list=new ArrayList<String>();List<String> list2=new ArrayList<String>();int z=0;private Site site = Site.me().setRetryTimes(1).setSleepTime(20000);public Site getSite() {return site;}public void process(Page page) {page.putField("author", page.getUrl().toString());if (page.getResultItems().get("name") == null) {page.setSkip(true);}z++;String a=page.getHtml().css("h1").toString();String a0=page.getHtml().getDocument().getElementsByClass("basic-infos-box").toString();if (a!=null||a0!=null) {String str=a+a0+"/001";list2.add(str);System.out.println(str);}else {list2.add(list.get(z-1)+"/001");}IOwriteData("G:五八爬虫数据", "list10Demo223333.txt", "utf-8", removeDuplicate(list2));System.out.println("已经进行第"+z+"次爬取");HashSet<String>set=new HashSet<String>();String path="G:\\五八爬虫数据\\房地产\\demo";try {AnjukeDataUtil.getCollectionsData(path, set);list.addAll(set);} catch (Exception e) {e.printStackTrace();}page.addTargetRequests(removeDuplicate(list));}	public static void main(String[] args) throws IOException {//创建爬虫实体类Anjuke_spider3 selemium=new Anjuke_spider3();//设置selemium浏览器配置驱动SeleniumDownloader seleniumDownloader=new SeleniumDownloader("G:\\爬虫\\drive\\chromedriver.exe");//配置当前浏览器配置System.setProperty("selenuim_config", "G:\\workspace\\Git\\webmagic\\config.ini");	//request类型配置,使用responsebody配置请求头,调用method方法选择post/get请求Request request=new Request();//设置被爬取页面String st="https://baoding.anjuke.com/community/view/1019536";//爬虫入口Spider.create(selemium).addUrl(st).setDownloader(seleniumDownloader).thread(1)//启动n个线程(此语句表示启动3个线程).run();//启动爬虫,会阻塞当前线程执行(及n个线程不是同时执行的)
//	seleniumDownloader.close();
}private static void IOwriteData(String dataPath,String fileName,String charset,List<String> list){String str;FileOutputStream fos = null;OutputStreamWriter writer = null;try {fos=new FileOutputStream(dataPath+fileName, true);writer = new OutputStreamWriter(fos,charset);for (String string : list) {str = string;writer.append(str);}} catch (Exception e) {e.printStackTrace();} finally {try {writer.close();fos.close();} catch (IOException e) {e.printStackTrace();}}
}
public static List removeDuplicate(List list) {   HashSet h = new HashSet(list);   list.clear();   list.addAll(h);   return list;   
} 
}

在这里插入图片描述
因为都差不多,所以不一个一个放了
值得说的是58的发爬虫跟安居客比起来还差点意思.
爬虫使用selenium+webmagic写的,数据量不大图省事
不过即使图省事,安居客还是在封我ip,大家可以多试几次找到不被封的接口就搞定啦
然后是数据处理
这里用dom4j方便一点,我自己试着用正则和split写了下麻烦的要死

package Util;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;import wubaSpider.pojo.AnjukePojo;
import wubaSpider.pojo.AnjukePojo2;
import wubaSpider.pojo.pojo;public class AnjukeDataUtil3 {public static void main(String[] args) throws Exception {// G://五八爬虫数据HashSet<String>set=new HashSet<String>();String path="G:\\五八爬虫数据\\安居客爬虫数据\\详细数据";getCollectionsData(path, set);List<AnjukePojo2> list =getData(set);for (AnjukePojo2 anjukePojo2 : list) {System.out.println(anjukePojo2);}}public static List<AnjukePojo2> getData(HashSet<String>set) throws Exception{List<AnjukePojo2> list=new ArrayList<AnjukePojo2>();for (String string : set) {AnjukePojo2 obj=new AnjukePojo2();final String startStr = "<?xml version=\"1.0\" encoding=\"utf-8\" ?> <root>";final String endStr = "</root>";String str=string.replace("&nbsp", "&#160");Document doc =DocumentHelper.parseText(startStr+str+endStr);Element rootElt = doc.getRootElement(); // 获取根节点Element name = (Element) rootElt.selectSingleNode("h1");Element addr = (Element) rootElt.selectSingleNode("//span[@class='sub-hd']");Element price = (Element) rootElt.selectSingleNode("//span[@class='average']");try {if (name.getText().isEmpty()||name.getText()==null) {System.out.println(string);}else {obj.setName(name.getText().trim());}obj.setAddr(addr.getText().trim());obj.setPrice(Integer.parseInt(price.getText().trim()));} catch (Exception e) {e.printStackTrace();}List<Element> listMessage =  rootElt.selectNodes("//dd");for (int j = 0; j < listMessage.size(); j++) {obj.setRopertyType(listMessage.get(0).getText().trim());obj.setRopertyCost(listMessage.get(1).getText().trim());obj.setArea(listMessage.get(2).getText().trim());if (listMessage.get(3).getText().trim().equalsIgnoreCase("暂无数据")!=true) {int a=Integer.parseInt(listMessage.get(3).getText().trim().replace("户", ""));obj.setUv(a);}if (listMessage.get(4).getText().trim().equalsIgnoreCase("暂无数据")!=true) {int year=Integer.parseInt(listMessage.get(4).getText().trim().replace("年", ""));obj.setYear(year);}if (listMessage.get(5).getText().trim().equalsIgnoreCase("暂无数据")!=true) {int park=Integer.parseInt(listMessage.get(5).getText().trim());obj.setParkings(park);}obj.setPotRatio(listMessage.get(6).getText().trim());obj.setGreeningRate(listMessage.get(7).getText().trim());obj.setDeveloper(listMessage.get(8).getText().trim());obj.setPropertyAgent(listMessage.get(9).getText().trim());obj.setBusinessDistrict(listMessage.get(10).getText().trim());}System.out.println(obj+"------");list.add(obj);}return list;}public static HashSet<String> getCollectionsData(String path,HashSet<String> set) throws Exception{List<String> list =new ArrayList<String>();List<String> list2 =new ArrayList<String>();getFiles(path, list);list2=readFileFromFilePath(list);int i=0;for (String string : list2) {String[] arr=string.split("/001");for (String string2 : arr) {if (string2.trim().isEmpty()!=true) {i++;set.add(string2);}}}System.out.println(set.size());//去重后577***去重前7298return set;}/*** 边缘校验*/public static void checkFilePath(String path) {if (path.trim().length() == 0 || path == null) {throw new IllegalArgumentException("路径不合法");}}public static void getFiles(String path, List<String> list) {checkFilePath(path);File file = new File(path);if (file.isDirectory()) {File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {if (files[i].isDirectory()) {getFiles(files[i].getPath(), list);} else {list.add(files[i].getPath());}}} else {list.add(file.getPath());}}public static List<String> readFileFromFilePath(List<String> list)throws IOException {FileInputStream fil;BufferedReader bfr = null;StringBuffer sbf = new StringBuffer();List<String> stringData = new ArrayList<String>();for (String string : list) {checkFilePath(string);File file = new File(string);try {bfr = new BufferedReader(new java.io.FileReader(file));String tempStr;while ((tempStr = bfr.readLine()) != null) {sbf.append(tempStr + "\n");}bfr.close();stringData.add(sbf.toString());} catch (FileNotFoundException e) {e.printStackTrace();}}return stringData;}
}

这个看看

package Util;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import wubaSpider.pojo.pojo;public class wubaDataDemo {public static void main(String[] args) throws Exception {// G://五八爬虫数据HashSet<String>set=new HashSet<String>();set=getCollectionsData("G://五八爬虫数据");System.out.println(set.size());HashSet<pojo>set2=getTheData(set);for (pojo pojo : set2) {System.out.println(pojo);}System.out.println(set2.size());}public static HashSet<pojo> getTheData(HashSet<String> set){HashSet<pojo>set2=new HashSet<pojo>();for (String string : set) {pojo obj=new pojo();//名称String str=string.trim().split("</span> </h2>")[0];String[] arr=str.trim().split("<h2 class=\"title\"> <span class=\"title_des\">");for (int i = 0; i < arr.length; i++) {String st=arr[i];if (i>0) {if (st.length()<20) {obj.setName(st);
//					System.out.println(st+"----------------");}else {String str2=string.trim().split("</span> <i class=\"icon icon-j-x\" title=")[0];String[] arr2=str.trim().split("<h2 class=\"title\"> <span class=\"title_des\">");obj.setName(arr2[i]);}}}//地区解析							String baseinfo=string.trim().split("</span> <i class=\"split\"></i> <span class=\"withI\">")[0];
//			System.out.println(baseinfo+"------------");String[] baseinfo2=baseinfo.trim().split("<p class=\"baseinfo\"> <span class=\"withI\">");for (int i = 0; i < baseinfo2.length; i++) {if (i>0) {if (baseinfo2[i].trim().length()>10) {obj.setRegion(baseinfo2[i].split("</span> <i class=\"split\"></i>")[0]);}else {obj.setRegion(baseinfo2[i]);}}}//position位置String position=string.trim().split("</span> <i class=\"split\"></i> <span>")[0];String[] pos2=position.trim().split("</span> <i class=\"split\"></i> <span class=\"withI\">");for (int i = 0; i < pos2.length; i++) {if (i>0) {obj.setPosition(pos2[i]);}}//stateString[] state=string.trim().split("</span> <i class=\"split\"></i> <span>");for (int i = 0; i < state.length; i++) {if (i>0) {obj.setState(state[i].split("</span> </p> ")[0]);}}//agentString agent=string.trim().split("</span><span class=\"managerCompany\">")[0];String[] agent2=agent.trim().split("<i class=\"managerIcon\"></i><span class=\"manager\">");for (int i = 0; i < agent2.length; i++) {if (i>0) {obj.setAgent(agent2[i]);}else {obj.setAgent("暂无");}}//managerCompanyString[] managerCompany=string.trim().split("<span class=\"managerCompany\">");for (int i = 0; i < managerCompany.length; i++) {if (i>0) {String manager2=managerCompany[i].trim().split("</span> </p>")[0];if (manager2.trim().equals("")||manager2.trim().isEmpty()) {obj.setManagerCompany("暂无");}else {obj.setManagerCompany(manager2);}}else {obj.setManagerCompany("暂无");}}//priceString[] price=string.trim().split("<span class=\"num\">");double pr;String numebr = "0";for (int i = 0; i < price.length; i++) {if (i>0) {numebr=price[i].split("</span> <span class")[0].trim();String[] price2=price[i].split("<span class=\"unit\">");if (numebr.equalsIgnoreCase("面议")) {numebr="0";}if (numebr.indexOf(".")==-1 && numebr.length()!=1) {
// 						System.out.println(numebr);pr=Double.parseDouble(numebr.trim());obj.setPrice(pr);}else {if (numebr.split("\\.")[0].length()<=2) {pr=Double.parseDouble(numebr.trim())*10000;obj.setPrice(pr);}}}}//areString are =string.trim().split("</span> <span class=\"unit\">㎡")[0];String[] are2=are.trim().split("  <p class=\"num\"> <span>");for (int i = 0; i < are2.length; i++) {if (i>0) {obj.setArea(Double.parseDouble(are2[i]));}}//informationString information=string.trim().split("<div class=\"pic\">")[0];String[] src=information.trim().split("a href=");for (int i = 0; i < src.length; i++) {if (i>0) {obj.setInformation(src[i].replace("\"", "").replace(">", ""));}}//tag_wrapString tag=string.trim().split("<!-- 标签处理end -->")[0];String[] tag2=tag.trim().split("<!-- 标签处理start -->");String tagStr = null;for (int i = 0; i < tag2.length; i++) {if (i>0) {String[] s=tag2[1].trim().split("<span class=\"tag-item\" style=\"background:");for (int j = 0; j < s.length; j++) {if (j>0) {String ss=s[j].split("</span>")[0];String sss=ss.split(">")[1];tagStr=sss;}}}}obj.setTag_wrap(tagStr);set2.add(obj);}return set2;	}public static HashSet<String> getCollectionsData(String path){List<String>list=new ArrayList<String>();List<String>list2=new ArrayList<String>();HashSet<String> set=new HashSet<String>();HashSet<String> set2=new HashSet<String>();getFiles(path, list);try {list2=readFileFromFilePath(list);} catch (IOException e) {e.printStackTrace();}for (String string : list2) {String[] arr=string.split("<ul id=\"house-list-wrap\" class=\"list-main-style\"> ");for (String string2 : arr) {String str=string2.replace("</ul>","");set.add(str);}}System.out.println("set总数"+set.size());int number=0;//店铺出租总数for (String string : set) {String[] arr=string.split("<li");number=arr.length+number;for (String string2 : arr) {String str=string2.replace("logr=", "<li logr=");set2.add(str);}}
//		System.out.println(number);
//		System.out.println(set2.size());/*** set总数118* 去重前6311* 去重后3894店铺总数*/return set2;}/*** 边缘校验*/public static void checkFilePath(String path) {if (path.trim().length() == 0 || path == null) {throw new IllegalArgumentException("路径不合法");}}public static void getFiles(String path, List<String> list) {checkFilePath(path);File file = new File(path);if (file.isDirectory()) {File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {if (files[i].isDirectory()) {getFiles(files[i].getPath(), list);} else {list.add(files[i].getPath());}}} else {list.add(file.getPath());}}public static List<String> readFileFromFilePath(List<String> list)throws IOException {FileInputStream fil;BufferedReader bfr = null;StringBuffer sbf = new StringBuffer();List<String> stringData = new ArrayList<String>();for (String string : list) {checkFilePath(string);File file = new File(string);try {bfr = new BufferedReader(new java.io.FileReader(file));String tempStr;while ((tempStr = bfr.readLine()) != null) {sbf.append(tempStr + "\n");}bfr.close();stringData.add(sbf.toString());} catch (FileNotFoundException e) {e.printStackTrace();}}return stringData;}
}

自己解析不仅不优雅还高耦合…恶心
做出来的数据用springboot直接导入mysql了,没用@test 这个junit直接写入,成品舒服
在这里插入图片描述
总之免不了的麻烦
数据库如图
在这里插入图片描述
其实只要保定的顺带把北京石家庄的数据一起趴了

一共6个表吧

用sql清洗下没洗干净的数据就行了
这里没有用百度或者高德开源的api或者前端框架,直接用execle专业版的powermap做的可视化
确实好使,比敲代码来说好多了
用脑子想想ajax响应返回七八个图层的json数据还是麻烦hhhhh溜了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_846524.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站漏洞扫描工具AWVS相关问题——Access Denied for your user role. Contact your Administrator.

在AWVS登录用户后&#xff0c;在选择自己要使用的功能时会出现“Access Denied for your user role. Contact your Administrator.”问题&#xff0c;即“拒绝访问您的用户角色。请与管理员联系。” 此问题的出现是由于在软件处于未激活状态所致。 解决方案&#xff1a; 1、AW…

AWVS启动后显示“无法访问此网站”的解决方法

当双击桌面的“Acunetix图标”&#xff0c;自动打开浏览器跳转页面&#xff0c;结果页面显示“无法访问此网站” 按WindowsR键输入services.msc打开服务界面查看Acunetix服务是否开启&#xff0c;一般是两个服务 右键选择服务&#xff0c;选择启动&#xff0c;将两个服务全部启…

网站漏洞扫描工具AWVS_v13下载和安装

Acunetix Web Vulnerability Scanner&#xff08;简称AWVS&#xff09;是一款知名的网络漏洞扫描工具&#xff0c;它能够测试你的网站安全&#xff0c;检测网站的安全漏洞&#xff0c;如sql 注入&#xff0c;交叉站点脚本等等。 AWVS_v13软件的下载 1、AWVS漏洞扫描工具是一款…

技术分享,如何使用图数据库构建网站后台数据库?

在数据库设计开发之初&#xff0c;开发人员都会面临一个重要的选择&#xff1a;用哪个数据库呢&#xff1f;用什么数据库技术来实现呢&#xff1f;在本文中&#xff0c;笔者将以构建一套文档系统为例&#xff0c;具体阐述用Ultipa Graph如何将开发需求转化成图数据库的存储结构…

招聘网站代码模板 mysql_招聘网站爬虫模板

招聘网站爬虫模板项目的创建项目的设置中间件的理解与使用selenium的基本使用爬虫项目的创建&#xff1a;scrapy startproject spiderNamecd spiderNamescrapy genspider name www.xxx.com项目的设置&#xff1a;settings的基础设置&#xff1a;USER_AGENTMozilla/5.0 (Windows…

【Flask】nginx+uwsgi+flask部署个人网站

部署flask前提 针对nginx和uwsgi已经安装完毕&#xff0c;并且已经正确配置 第一步&#xff0c;安装项目必要的库 因为我自己是用的centos7自带的python2.7环境&#xff0c;所以直接先在服务器上pip安装flask&#xff0c;如果项目需要其他的库&#xff0c;也需要提前安装 p…

【Django】总结用Django框架搭建表白网站

前言 2020.2.14是情人节&#xff0c;2020.2.13花了整整一晚搭表白网站&#xff0c;由于第一次用Django框架&#xff0c;遇到很多坑&#xff0c;在此记录 搭建Django框架的网站需要哪些东西 一台云服务器&#xff08;如阿里云&#xff09; 云服务器上安装好配置环境&#xff…

【建站】wordpress搭建网站

在centos7上安装apache https://blog.csdn.net/shj_php/article/details/79495861 如果你的服务器上已经安装了nginx&#xff0c;可能在开启apache服务service的时候会失败&#xff0c;因为Apache和nginx都占用了80端口&#xff0c;Job for httpd.service failed because the…

大型高负载的网站的体系结构和web2.0时代的网站高负载

大型高负载的网站的体系结构和web2.0时代的网站高负载 (2010-03-28 16:26:29) 转载▼标签&#xff1a; it 分类&#xff1a; 架构与开发 从事发布系统(web publish system)的研究和开发快两年了&#xff0c;从小型应用到中型应用&#xff0c;基本上没有参与大型应用(千万pv/…

解决看Html5网站或论坛时字体模糊问题

两个步骤&#xff1a; 第一步&#xff1a;修改window外观设置。 XP用户请先执行如下操作&#xff1a;桌面单击右键-属性-外观-效果-勾选“使用下列方式使屏幕字体的边缘平滑”并选择“清晰”&#xff0c;然后点击确定。 WIN7用户请请执行如下操作&#xff1a;打开控制面板-所有…

nginx网站架构优化

1&#xff09;网站架构优化体系说明&#xff08;面试&#xff09; 面试时怎么说&#xff1a; 先说体系&#xff0c;再说具体 2&#xff09;网站架构的优化具体操作部分&#xff08;nginx&#xff09; 网站安全的维度 网站性能的维度 网站管理有关的维度 用户体验的维度 3&#…

从单机至亿级流量大型网站系统架构

阶段一、单机构建网站 网站的初期&#xff0c;我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器&#xff0c;如tomcat、jetty、jboos&#xff0c;然后直接使用JSP/servlet技术&#xff0c;或者使用一些开源的框架如mavenspringstructhibernate、mavenspringspr…

HttpClient调用JSONObject.parseObject(EntityUtils.toString(response.getEntity()))报JSONException异常解决方案

[TOC](HttpClient调用JSONObject.parseObject(EntityUtils.toString(response.getEntity()))报com.alibaba.fastjson.JSONException: syntax error, pos 1, line 1, column异常解决方案) 问题背景 在使用httpClient调用url的时候&#xff0c;返回值我进行了json解析&#xff…

IE单击以激活控件网站代码解决法

IE"单击以激活控件"网站代码解决法 由于微软输了专利官司&#xff0c;所以从2006年开始&#xff0c;IE6补丁和IE7里面的flash&#xff0c;quick time,Java及其他控件都需要点击才能激活。经常看到flash外面包含了个虚框&#xff0c;鼠标移上去后提示&#xff1a;“c…

改善VS2005发布网站问题

使用了AJAX控件的网站在发布在服务器上会出错,要解决改问题只需在Bin目录下添加&#xff1a;System.Web.Extensions.dll&#xff0c;该文件在AJax控件的安装目录下可以找到 1.允许更新此预编辑站点 选中这一项后&#xff0c;编译出来的包括aspx文件和dll&#xff0c;与2003下…

修改MOSS网站的URL访问地址

前几天公司的一个客户要试用一下公司在SharePoint平台上面做的一个应用系统&#xff0c;公司有一个安装好的虚拟机&#xff0c;但是域名是一个虚拟的&#xff0c;客户说要把URL改成他们的名称。上网搜索了一个&#xff0c;结合自己做了一个小实验&#xff0c;通过两步可以很好的…

Web2.0设计师工具箱,国外的一些网站制作资源,css,javascript,ajax,设计素材等

http://hi.baidu.com/sw%5Fws/blog/item/32b4237e63bbf13b0cd7da83.html Web2.0工具箱 The Web Designers Tool Kit原文地址&#xff1a; http://www.dezinerfolio.com/2007 ... designers-tool-kit/分类一、DHTML AJAX Javascript 【Ajax脚本库】1. RO Scripts - Growing Coll…

网站开发技巧参考大全 event js

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.y 窗…

SharePoint 2010 Visual Web Part Demo--展示网站中的List.

SharePoint 2010 beta 2发布了&#xff0c;伴随着Visual Studio 2010的发布&#xff0c;SP的开发似乎变的简单了起来。 心血来潮&#xff0c;用Visual Studio 2010 做了个Visual web part的小例子。 运行环境&#xff1a;WINDOWS 2008 R2SP 2010 beta 2 VS2010 beta 2. 1. 以…

我是如何对网站CSS进行架构的

by zhangxinxu from http://www.zhangxinxu.com 本文地址&#xff1a;http://www.zhangxinxu.com/wordpress/?p944 一、写在前面的 都是自己积累形成的一些东西&#xff0c;可能带有明显的个人印记。不是专业内容&#xff0c;不是权威指南&#xff0c;只是展示一点自己的观点&…