总结:不会写代码怎么爬取恒大楼盘?你可以试试这个
优采云 发布时间: 2022-12-17 07:30总结:不会写代码怎么爬取恒大楼盘?你可以试试这个
大家好,我是楠楠的第四马甲,好好生活楠楠
前几天看到群友的推文,爬取恒大楼盘进行空间映射。
文章 很好,但我在这里有一个更简单的方法,这很好。所以这次我要介绍一个专门用来获取这类信息的工具【优采云采集器】
下载链接
这个案例和我之前发的教学视频很像,大家可以借鉴一下
数据采集
复制恒大首页【】
打开优采云采集器,粘贴链接,聪明的采集就可以了
软件自动识别分页符和字段
不过这个好像识别不了,没关系,我们可以手动点击
刚开始 采集
这是data采集运行界面
Oak,采集结束了,一共580条数据
然后就可以导出到excel了
数据在excel中显示如下
地址到经纬度
我有两种方法。一种是调用本博主写的百度地图api。我以前讲过。
第二种方法也是我之前讲过的,使用网站【】
两种方法结果相似,但要注意去异常值和坐标转换
关于数据分析,我推荐tableau来进行分析和可视化。说到这里,我会抱怨的。mmp破解版2020无法显示图表,2019破解版无法显示地图。
一堆博主说完美破解,搞了半天,能打开软件就是完美破解了。我会在找到好用的破解版后更新这方面的教程。我去,怎么又给自己挖坑了?
福利:算法打卡 Day22 跳表 skipList
今天学习了一种全新的数据结构,skip table。
可以有效提高链表索引的时间,时间复杂度从O(n)降低到O(logn)。
具体方法:下面链接有详细解释,
借用这个文章的一张图可以有效的说明这个数据结构。
在原链表上,建立一级索引,访问原链表的节点1、3、5、7……,跳过一位,在一级索引的基础上建立二级索引——级索引,访问一级索引的节点1、3、5、7相当于原链表的节点1、5、9……当需要找原链表的一个元素时链表,直接从高级索引链表到Indexing有点像二分查找,时间可以O(logn)。C++代码链接如下:
github中的代码在我的环境下编译不正确,我在本地稍作修改后的版本如下:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/**
* 跳表的一种实现方法。
* 跳表中存储的是正整数,并且存储的是不重复的。
*
* 跳表的C++版本.
* 翻译JAVA版本 原作者 Author:ZHENG
*
* Author:puhuaqiang
*
* 跳表结构:
*
* 第K级 1 9
* 第K-1级 1 5 9
* 第K-2级 1 3 5 7 9
* ... ....
* 第0级(原始链表) 1 2 3 4 5 6 7 8 9
*/
const int MAX_LEVEL = 16;
/**
* @brief 节点
*/
class CNode
{
public:
CNode();
~CNode();
std::string toString();
/**
* @brief 获取索引链表
*/
CNode** GetIdxList();
/**
* @brief 设置数据
*/
void SetData(int v);
/**
* @brief 获取数据
*/
int GetData();
/**
* @brief 设置最大索引级别
*/
void SetLevel(int l);
private:
/**当前节点的值*/
int m_data;
/**
* 当前节点的每个等级的下一个节点.
* 第2级 N1 N2
* 第1级 N1 N2
* 如果N1是本节点,则 m_lpForwards[x] 保存的是N2
*
* [0] 就是原始链表.
*/
CNode* m_lpForwards[MAX_LEVEL];
/**当前节点的所在的最大索引级别*/
int m_iMaxLevel;
};
/**
* @brief 跳表
*/
class CSkipList
{
public:
CSkipList();
~CSkipList();
/**
* @brief 查找指定的值的节点
* @param v 正整数
*/
CNode* Find(int v);
/**
* @brief 插入指定的值
* @param v 正整数
*/
void Insert(int v);
/**
* @brief 删除指定的值的节点
* @param v 正整数
*/
int Delete(int v);
void PrintAll();
/**
* @brief 打印跳表结构
* @param l 等于-1时打印所有级别的结构 >=0时打印指定级别的结构
*/
void PrintAll(int l);
/**
* @brief 插入节点时,得到插入K级的随机函数
* @return K
*/
int RandomLevel();
private:
int levelCount;
/**
* 链表
* 带头/哨所(节点)
*/
CNode* m_lpHead;
};
int main()
<p>
{
CSkipList skipList;
/// 插入原始值
for (int i = 1; i GetData() GetIdxList()[i];
}
lpUpdateNode[i] = lpFind;
}
/**
* lpFind 是小于v的节点, lpFind的下一个节点就等于或大于v的节点
*/
if ((NULL != lpFind->GetIdxList()[0]) && (lpFind->GetIdxList()[0]->GetData() == v)) {
for (int i = levelCount - 1; i >= 0; --i) {
if ((NULL != lpUpdateNode[i]->GetIdxList()[i]) && (v == lpUpdateNode[i]->GetIdxList()[i]->GetData())) {
lpUpdateNode[i]->GetIdxList()[i] = lpUpdateNode[i]->GetIdxList()[i]->GetIdxList()[i];
ret = 0;
}
}
}
return ret;
}
void CSkipList::PrintAll()
{
CNode* lpNode = m_lpHead;
while (NULL != lpNode->GetIdxList()[0]) {
std::cout toString().data() = 0; --i) {
CNode* lpNode = m_lpHead;
std::cout