> 技术文档 > 使用Python + selenium批量爬取经纬度 并用tableau制成订单位置分布图_如何利用python 实现数据抓取并画成tableau

使用Python + selenium批量爬取经纬度 并用tableau制成订单位置分布图_如何利用python 实现数据抓取并画成tableau


使用Python + selenium批量爬取经纬度 并用tableau制成订单位置分布图

  • 前期准备
    • 下载所需的第三方库
    • 确定爬取的目标网址和网页元素所在的位置
    • 下载谷歌浏览器的驱动ChromeDriver
  • 一、代码编写
    • 编写过程
    • 完整代码
  • 二、tableau可视化
    • 分布图效果

前期准备

下载所需的第三方库

首先安装所需的库,selenium用于模拟用户操作和数据抓取,pandas用于读取excel表和保存excel表,numpy用于进行列表转化数组和数组合并。

  • 1.selenium
pip install selenium
  • 2.pandas
pip install pandas
  • 3.numpy
pip install numpy

确定爬取的目标网址和网页元素所在的位置

这里以拾取坐标系统(https://api.map.baidu.com/lbsapi/getpoint/index.html)为例,按下F12,对输入框右键检查,可以看到地址输入框的id=“localvalue”,我们右键复制XPath得到\"//*[@id=“localvalue”]\"
在这里插入图片描述

同样的,对搜索按钮右键检查,可以看到搜索按钮的id=“localsearch”,我们右键复制XPath得到\"//*[@id=“localsearch”]\"

在输入框输入任意文字然后查询,右边的会出现多个结果,对第一个结果进行同样操作,得到得到’//*[@id=“no_0”]/p’在这里插入图片描述

下载谷歌浏览器的驱动ChromeDriver

接下来要下载谷歌浏览器的驱动ChromeDriver(https://googlechromelabs.github.io/chrome-for-testing/)提示:ChromeDriver驱动要与下载的谷歌浏览器版本一致,可以在谷歌浏览器输入chrome://settings/help查看当前版本
准备数据,以我使用的数据为例(https://pan.quark.cn/s/b0eb85b76eb1#/list/share)在这里插入图片描述
提示:以下是本篇文章正文内容,下面案例可供参考

一、代码编写

编写过程

这里我使用的是vscode进行代码编写,
首先引入库,以及读取数据集(取100个数据进行测试)

from selenium import webdriverfrom selenium.webdriver.common.by import Byimport pandas as pdimport numpy as npimport timeimport re#读取Excel表df = pd.read_excel(\'E:\\\\vscode\\\\数据集.xlsx\',nrows=100)#将Excel表的内容转化为数组yi = df.to_numpy()

此时print(yi)得到在这里插入图片描述
接着进行初始化和进行地址与城市合并

#初始化xun = webdriver.Chrome()#确定目标网址xun.get(\'https://api.map.baidu.com/lbsapi/getpoint/index.html\')xu = np.empty((0, 6))#创建空数组(列数与最终数据匹配) for i in yi: jia = i[1]+i[2]#将数据集中的地址融合

此时print(jia)得到
在这里插入图片描述
调用selenium库,利用准备工作时得到的3个Xpath,进行搜索框输入、点击搜索按钮、保存搜索的第一个结果操作

for i in yi: jia = i[1]+i[2]#将数据集中的地址融合 #确定输入框位置并输入 hao = xun.find_element(By.XPATH,\'//*[@id=\"localvalue\"]\') hao.clear()#清除输入框内容 hao.send_keys(jia) #确定搜索按钮位置并点击 xing = xun.find_element(By.XPATH,\'//*[@id=\"localsearch\"]\') xing.click() time.sleep(1)#等待一秒使网页加载完全 #确定经纬度位置并保存(获取第一个结果信息) kai = xun.find_element(By.XPATH,\'//*[@id=\"no_0\"]/p[1]\')

此时print(kai.text)会得到在这里插入图片描述
但我们只需要坐标后面的经纬度即可,所以引入re库,利用查找浮点数功能获取我们所需要的坐标

luo = re.findall(r\'\\d+\\.\\d+\',kai.text)#以浮点数为目标查找经纬度并将其保存

print(lou)得到在这里插入图片描述
由于刚刚输出时发现lou是列表形式,而我们通过\"yi = df.to_numpy()\"将读取到的excel表是以数组方式储存的,所以要利用numpy进行数组的转化和合并

wei = np.array(luo)#将经纬度转化为数组形式 fang = np.append(i,wei)#将经纬度添加进去 xu = np.vstack([xu,fang])#将融合的数组保存至一个新的数组

print(xu)得到
在这里插入图片描述

最后将二维数组xu转化为DataFrame并保存为Excel文件

#转化为DataFrame并保存 fw = pd.DataFrame(xu)#保存为Excel文件fw.to_excel(\'数据集_1.xlsx\',index=False,header=False)

完整代码

完整代码如下:

from selenium import webdriverfrom selenium.webdriver.common.by import Byimport pandas as pdimport numpy as npimport timeimport re#读取Excel表df = pd.read_excel(\'C:\\\\Users\\\\fang wei\\\\Desktop\\\\大学文件\\\\数据集.xlsx\',nrows=100)#将Excel表的内容转化为数组yi = df.to_numpy()#初始化xun = webdriver.Chrome()#确定目标网址xun.get(\'https://api.map.baidu.com/lbsapi/getpoint/index.html\')xu = np.empty((0, 6))#创建空数组(列数与最终数据匹配) for i in yi: jia = i[1]+i[2]#将数据集中的地址融合 #确定输入框位置并输入 hao = xun.find_element(By.XPATH,\'//*[@id=\"localvalue\"]\') hao.clear()#清除输入框内容 hao.send_keys(jia) #确定搜索按钮位置并点击 xing = xun.find_element(By.XPATH,\'//*[@id=\"localsearch\"]\') xing.click() time.sleep(1)#等待一秒使网页加载完全 #确定经纬度位置并保存(获取第一个结果信息) kai = xun.find_element(By.XPATH,\'//*[@id=\"no_0\"]/p[1]\') luo = re.findall(r\'\\d+\\.\\d+\',kai.text)#以浮点数为目标查找经纬度并将其保存  wei = np.array(luo)#将经纬度转化为数组形式 fang = np.append(i,wei)#将经纬度添加进去 xu = np.vstack([xu,fang])#将融合的数组保存至一个新的数组#转化为DataFrame并保存 fw = pd.DataFrame(xu)#保存为Excel文件fw.to_excel(\'数据集_1.xlsx\',index=False,header=False)

二、tableau可视化

打开保存的’数据集_1’,在第一行插入新的行分别输入‘用户ID’、‘城市’、‘地址’、‘实付金额’、‘经度’、‘纬度’,并保存。在这里插入图片描述
打开tableau,
用tableau打开保存的’数据集_1’,点击下方的工作表1,进入工作表,
右键纬度选择更改数据类型->小数,对经度同样操作。
在这里插入图片描述

然后右键纬度将地理角色改为纬度,经度的地理角色改为经度。在这里插入图片描述
按照图中方向进行拖动,在这里插入图片描述
在进行调整最后得到一张订单分布图,鼠标悬停在点上时显示用户ID和实付金额。(由于只爬取了100个数据所以数量并不多)

分布图效果

在这里插入图片描述