使用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个数据所以数量并不多)