干货 | Python爬虫实战:两点间的真实行车时间与路况分析(二)

简介: 干货 | Python爬虫实战:两点间的真实行车时间与路况分析

制作excel表格

为了方便我们对数据进行处理,我们选择将数据存入到excel表格之中。

微信图片_20220423102417.jpg

相应时间的获取

坐标获取好了之后,我们还需要回到开发文档,再选取Web服务API,进入后再选择批量算路服务。通过这一项服务,我们可以获得目标路段当前时刻下的指定交通方式所花费的时间。

微信图片_20220423102420.jpg

进入了以后,就可以看到这一项服务明确的要求了要使用IP白名单检验,这也就是为什么我们在创建应用的时候设置IP白名单检验。

微信图片_20220423102422.png

在简介中也给出了我们能够通过坐标获取两点之间的距离,行车,步行以及骑行所需要的时间,这个是实时的,会结合实时的交通状况。

微信图片_20220423102425.png

在服务指南中,详细地给出了我们想要获得目标内容的方法。

微信图片_20220423102428.png

在这里简单的解释一下为什么无论起点坐标还是终点坐标都是两个坐标。其实很好理解。

微信图片_20220423102431.png

因为在正常情况下一个地点他不会是一个点,而是一块,而两个点刚好就可以构成一个矩形了。

但是在我们这里为了简化操作,地点就简单地认为只有一点,这是一种简化哈,大家在实际复现的时候建议弄两个点。所以我们这次的爬取URL的模式如下。


URL=http://api.map.baidu.com/routematrix/v2/交通方式?output=json&origins=起点坐标(先纬度再经度)&destinations=终点坐标&ak=你的AK值。

我们现在可以把我们搜索到的点的坐标按照上述样式改一下URL,然后进入这个网页,看看成不成功。如果出现了下面的画面就说明成功了。

微信图片_20220423102433.png

开始我们的工作

做好了前期的准备工作,我们现在正式进入主题。

进入目标网页

在这个部分,我们会用到一些模块,在这里先拿出来,介绍一下相应的作用。


import requests

第一个模块顾名思义,就是请求的意思,那么对于我们来说有什么用呢?别急,我们来分析分析,我们进入一个网页的过程。

我们打开浏览器,然后输入网址,然后看到我们需要的内容是吧?

微信图片_20220423102436.jpg

那么你有没有想过我们为什么需要通过浏览器去访问我们的网页呢?

原因很简单,其实就是我们需要浏览器代表我们发送一个请求给我们的URL,然后从URL的服务器再把我们想要的内容反馈给我们,然后我们才能看到。

在这个过程中,服务器还给我们一个header,简单的来说就是一个身份证,说明我们是通过合法途径的进入你的网页的,并不是通过非法的途径。

微信图片_20220423102438.jpg

分析到这里,小伙伴一定有疑惑,那我们通过requests的时候,怎么证明我们是合法途径呢?

那当然是加上一个headers啦。在自己的浏览器中输入about:version。会出现如图所示的画面。

微信图片_20220423102440.jpg

我们就可以发现headers就在这里。下面我们尝试着通过request来进行一下自动进入网页。


url=xxxx
header=xxxx
html=requests.get(url,headers=header).text

这段代码的主要内容在之前已经说了,这里讲解一下为什么要加入.text

其实就是获取网页中的除了标签以外的内容,因为有可能网站里面还有其他的标签一样的东西,这是构造这个网页是加入的,但是我们并不需要。

大家可以尝试,运行这段代码并输出html,可以看到下面的东西:

微信图片_20220423102442.png

到这里为止,我们已经成功地利用程序进入了目标网页。

爬取目标内容


import pandas as pd
import re

解释一下我们当前添加的模块。

pandas是一种数组,在这里,我们为什么不使用内置的数组呢?简单的理解就是pandas数组比内置的数组运行速度更快,而且方便我们对文件进行读取。

re是一种切割文本的工具,在这里其实如果了解正则表达式的伙伴们应该认识,这个其实就是正则表达式的记号。

现在让我们再分析一下,我们从网页中获得的东西,是一长串字符串吧?我们需要什么?只需要里面的极少数的字符吧?其他的我们都不想要。那么我们应该怎么做?

是不是应该对字符串进行切割,对的,在这里我们就可以用re模块进行切割。这个函数的基本形式是re.split([分隔符],分割的字符串)

微信图片_20220423102445.png

通过对我们所获得的字符串进行观察,找出应该分割的地方的分隔符号,就可以对字符串进行分割。最终结果如下图。

微信图片_20220423102455.png

容易看出,我们需要的内容所在的下标为19,33。在这里位置为止,我们的工作看似已经完成了,但是我们只是把当前这一段路程的路程和时间记录下来了,还有别的呢?这个时候,我们的pandas数组就出现了。

微信图片_20220423102458.jpg

在刚开始的时候,我们就已经把坐标和地址都存到了一个excel文件当中去大家应该都还记得吧。

那么我们现在的重点就是围绕这个excel文件展开的。既然我们需要这个excel文件中的东西,那么首先我们需要读取这个excel文件。如何读取呢?这里先放出代码。


path_data=pd.read_excel(r'F:\my python\数据\waypath.xlsx')
head=path_data['head']
tail=path_data['tail']
position=path_data['position']

如上图所示,上面就是pandas读取文件的操作。容易看出,第一段代码就是读取csv文件并存储起来。

括号里存放的是我们文件所在的地址,记住一定要在后面加上文件自身的属性,即加上xlsx,这是为了避免在这个地址下存在两个同名但属性不同的文件的矛盾问题。

由于python的强大,读取csv文件是按照字典形式存储,后面的head,tail,position就是相应的索引。要注意!前面的r是不可以省略的,因为它是说明在这一行里面出现的\都不是转义符号。

在这里我们已经完成了存储操作,伙伴们可以print一下path_data,看看里面的内容。

微信图片_20220423102500.png

在这里我们可以发现,python中存储数据也是从index为0开始。现在我们已经完成了所有地点和坐标的存储,下面就是循环进行内容的获取和存储的过程了。

在这里我们的数据的最后一个下标是27,那么就意味着我们需要循环的次数为28,那么怎么进行这个循环呢?Python中给出了一个非常简单的方式,如下。


for i in range(28):

这个位置的意思是,依次生成0-27的整数,然后赋给i,这样i在每次循环中对应的值都是相应的次数,基于这个,我们就可以知道后面的循环函数怎么写了。


for i in range(28):    
  url='http://api.map.baidu.com/routematrix/v2/driving?output=json&origins={}&destinations={}&ak=S0LC4C1KdAOVGPLcbzlBGL7bLfGz5G1c'.format(str(head[i]),str(tail[i]))   
  html=requests.get(url,headers=header).text    
  html=re.split('[:",}]',html)    
  if i==0:       
    dict_data={'position':[position[i]],'distance':[html[19]],'time':[html[33]]}   
    data=pd.DataFrame(dict_data,columns=['position','distance','time'])   
  else:       
    dict_data =pd.DataFrame({'position': [position[i]], 'distance': [html[19]], 'time': [html[33]]})      
    data=data.append(dict_data,ignore_index=True)
data.to_csv('path_data.csv')

看到这个代码,一定很蒙,这都写了些啥啊,咋看不懂?不急,我们一步一步分析。首先是我们对于url的改写,我们把原来存放起点坐标和终点坐标的位置改为了{},后面加上了


.format(str(head[i]),str(tail[i]))

这是为什么呢?其实大家从上面读到这里看到代码一定知道这个是为了什么,对,就是为了更新每一次的地址,使她成为excel文件中相应的地址,那么这里{}就和后面的format中的内容进行对应。

format具体的用法在这里就不多说了。看客老爷们如果感兴趣可以去查一查,在这里,大家只需要了解是替换相应位置内容就可以了。

微信图片_20220423102503.png

那么后面我为什么要用if做判断呢?这其实是为了区分当前这个循环是建立一个类似excel一样的变量还是给这个变量里面进行元素添加。I=0时,当然是建立这个变量,I>0时就是添加元素。

在这里呢,重点讲解一下下面这一行。pd.DataFrame其实是一个强制转换类型的函数,把刚开始的dict_data转换成DataFrame类型的,为什么要转换呢?转换了有什么用呢?我们转换了其实是为了使用DataFrame类型所特有的一个函数,to_csv,生成csv文件的函数。

那么后面的.append()函数大家肯定就明白了,columns是做什么的呢?仔细一看可以发现这个其实和我们DataFrame最开始设的几个索引值是一样的,是的。

我们之所以在后面写这个是为了给dataframe进行一个排序,这样在输出这个data的时候她输出的顺序就是colunms里的顺序。

在最后一行,意思已经很清楚了,是生成这个csv文件,然后前面patn_data是文件的名字,.csv是文件的属性。


data=pd.DataFrame(dict_data,columns=['position','distance','time'])

定时操作

到这个位置,其实现在我们已经很好地完成了这一次的爬取任务,回到我们的文件夹中,你就可以看到生成的最终csv文件了。但是呢,作为一次数据分析,那么仅仅统计当前这一次的数据肯定是不够的。

微信图片_20220423102505.png

我们还需要统计很多次来求取平均值。但是我们又不可能看着一个时间就去点一下运行程序,这肯定是不聪明的做法。那么什么是聪明的做法呢?当然是用python自带的函数来做了。这个时候需要添加一个模块。


from threading import Timer

这个模块就是计时器,为了我们定时运行程序所用的。


t = Timer(10, search)t.start()

这个函数的具体用法就是Timer(1,2),在1的位置,你需要填写的是你想程序在多久后运行,2的位置为相应的程序,即函数。

t.start()就是计时器开始运行。那么如果我们想要程序规定次数定时的多次运行,我们可以在在相应的函数中放置一个这个Timer函数,进行多次运行。

小小的总结

好了,本次推文中,着重给大家介绍了如何获取数据,做成csv文件的相关操作。在最后Timer的位置没有详细的讲解,希望大家通过代码进一步了解!

在下篇推文中,我们会着重讲述如何建立可视化的曲线。让我们下次再见!

微信图片_20220423102507.png

相关文章
|
6天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
41 6
|
6天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
79 44
|
5天前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
26 7
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
8 1
|
2天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
9 1
|
5天前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
本文介绍了 Python 在跨平台开发中的强大能力,通过实际例子展示了如何使用 `os` 和 `pathlib` 模块处理文件系统操作,`subprocess` 模块执行外部命令,以及 `tkinter` 创建跨平台的图形用户界面。这些工具和模块帮助开发者轻松应对不同操作系统间的差异,专注于业务逻辑。
18 2
|
4天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
5天前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
|
3天前
|
开发者 Python
探索Python中的装饰器:从入门到实战
【10月更文挑战第30天】本文将深入浅出地介绍Python中一个强大而有趣的特性——装饰器。我们将通过实际代码示例,一步步揭示装饰器如何简化代码、增强函数功能并保持代码的可读性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往更高效编程的大门。
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
161 4