2024年Python最全爬取城市公交站点数据的一篇保姆级教程

手把手教学,正式开始!

正文

今天爬取数据的链接是:https://www.8684.cn/

这个是8684网站的网址,上面有各种公交站点、地铁站点、违章、资讯等等数据,小功能做的相当不错。

页面长这样:

8b68c8c23590bad5d79929cde337bcef.png

对应的我们点击热门公交中的某个城市,例如:深圳公交,注意看点击的时候网址栏发生的变化

此时的网址变成了:https://shenzhen.8684.cn/

以此类推,其他城市对应的访问链接想必你会很容易构造出来

点进去之后的页面是这样的:

87860bb8ec7c56c3bc114499be88d3b8.png

从我的经验来判断,我们想要的数据一定在红框里面。

而且从这几种网站的分类类型来看,绿框框出来的一定是最靠谱最有用的分类,而且在后期的分析过程中一定会最有用。

直接打开F12,进行源码分析(或者在某个超链接上点击右键->检查)内容一目了然:

e240a5f556b46c15748304e67897399d.png

处理思路如下:定位到 bus-layer depth w120 的这个 div,然后定位到它的第三个 class为‘pl10’ 的子div,这个就是我们我们需要的线路分类

对应上面的网页显示内容,源码都展开之后是这样的:

8201a50f896fb304ae7fed4b75573b68.png

其中有两种标签:class=“kt” 的span标签,对应的是分类的标题;class=‘list’ 的div标签,子标签对应的是每一个分类的链接 href 和名称 wbfspan 标签。有用的是第二个标签

正常点击网页上的某一种分类线路,例如:常规线路,注意看点击的时候网址栏发生的变化

此时的网址变成了:https://shenzhen.8684.cn/line1,也就是在之前链接的结尾加上上面的 href 内容

再回到我们的网页上,可以看到显示的公交路线,同样分析源码,内容如下:

5a9fa76181e871eaabb07c7ade8734c3.png

处理思路如下:定位到 list clearfix 的这个div,它下面的每一个子标签(a标签)对应的都是一条公交线路,href 同样为该公交线路的链接,wbfspan 同样为名称

随便点开某一条公交线路,例如:8号线,注意看点击的时候网址栏发生的变化

此时的网址变成了:https://shenzhen.8684.cn/x_3dfcd0fb,也就是将之前的 href 内容换成了最新的 href 内容

再回到我们的网页上,这个就是我们需要爬取数据的终极目标网页:

7e296a750046e1a0ed9f0d04377d941c.png

上半部分的公交详细信息:运行时间、票价、公司、更新时间等

下半部分的公交详细站点,以及每个站点的经纬度等


ok,来整理一下总体思路:

  • 通过城市名称构造第一类访问 url

  • 访问第一类 url

  • 解析该城市的公交分类,获取到想要的分类类型,构造第二类访问 url

  • 访问第二类 url

  • 解析分类类型的每一个公交线路,构造第三类访问 url

  • 访问第三类 url

  • 解析该公交路线的上、下两部分数据

  • 循环第二类 -> 第三类的过程,直到爬完所有数据

解析城市的公交分类,构造第二类访问 url 的核心代码如下:

url = ‘https://shenzhen.8684.cn/’

response = requests.get(url=url, headers={‘User-Agent’: get_ua()}, timeout=10)

“”“获取数据并解析”“”

soup = BeautifulSoup(response.text, ‘lxml’)

soup_buslayer = soup.find(‘div’, class_=‘bus-layer depth w120’)

# 解析分类数据

dic_result = {}

soup_buslist = soup_buslayer.find_all(‘div’, class_=‘pl10’)

for soup_bus in soup_buslist:

name = soup_bus.find(‘span’, class_=‘kt’).get_text()

if ‘线路分类’ in name:

soup_a_list = soup_bus.find(‘div’, class_=‘list’)

for soup_a in soup_a_list.find_all(‘a’):

text = soup_a.get_text()

href = soup_a.get(‘href’)

dic_result[text] = “https://shenzhen.8684.cn” + href

print(dic_result)

上面的 dic_result 中存储的就是每一个分类的名称 text 和访问 href

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值