爬虫实战:基于urllib和mysql爬取苏州公交线路信息

news2024/9/24 7:22:52

文章目录

  • 写在前面
    • 实验环境
    • 实验描述
    • 实验目标
    • 实验内容
      • 1. 确定并分析目标网页结构
      • 2. 编写urllib代码爬取公交信息
      • 3. 保存公交数据到csv文件中
      • 4. 保存公交数据到mysql数据库中
  • 写在后面

写在前面

本文将基于python的urllib模块,爬取北京公交线路的信息,最后将数据保存在csv文件和mysql数据库中。

实验环境

  • anaconda丨pycharm
  • python3.11.4
  • mysql
  • urllib

实验描述

  1. 学习网络爬虫相关技术,熟悉爬虫基本库urllib的使用。
  2. 熟悉网络爬虫相关基础知识。
  3. 使用urllib基本库获取苏州公交线路信息的HTML源代码。
  4. 使用BeautifulSoup解析库完成苏州公交线路相关信息的获取。

实验目标

  1. 知道urllib基本库和BeautifulSoup解析库的使用方法
  2. 学会使用urllib基本库和BeautifulSoup解析库进行苏州公交线路相关信息的爬取。

实验内容

1. 确定并分析目标网页结构

(1)进入 https://suzhou.8684.cn/ 网页,即进入苏州公交查询界面

1

(2)单击“以数字开头”中的各数字,观察URL的变化,不难看出网页URL的变化规律为:https://suzhou.8684.cn/list + 数字。

2
3

(3)单击数字 “1” 进入 https://suzhou.8684.cn/list1 界面,按下键盘上的“F12”进入检查页面。

4

(4)使用快捷键“Ctrl+Shift+C”, 单击公交车链接,可以查看该标签的HTML代码。

5

(5)单击a标签中的href属性,进入详细信息页面。

6
此时观察URL的变化,我们发现详细信息页面的URL变化规律为 https://suzhou.8684.cn/ + a标签中的href属性。

(6)综上,在构建URL时,我们需要获取对应a标签的href属性的内容。

2. 编写urllib代码爬取公交信息

(1)构造一个URL,获取所有一级页面的URL。

import urllib.request
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
import csv
import pymysql

url = 'http://suzhou.8684.cn'
url_list = url + '/list%d'
for i in range(1, 10):
    urls = url_list % i
    print(urls)
http://suzhou.8684.cn/list1
http://suzhou.8684.cn/list2
http://suzhou.8684.cn/list3
http://suzhou.8684.cn/list4
http://suzhou.8684.cn/list5
http://suzhou.8684.cn/list6
http://suzhou.8684.cn/list7
http://suzhou.8684.cn/list8
http://suzhou.8684.cn/list9

该脚本的功能是爬取苏州公交网站(http://suzhou.8684.cn/)中的公交线路信息。首先,通过导入urllib.request、BeautifulSoup和urllib.parse等库,实现对网页的解析和数据的提取。 然后,通过循环获取公交线路信息的分页,拼接成完整的url列表。最后,打印出所有的url列表。

(2)创建一个get_page_url的方法,获取拥有公交信息网页的URL。

def get_page_url(url):
    html = urllib.request.urlopen(url)
    soup = bs(html.read(), 'html.parser')
    lu = soup.find('div', class_ = 'list clearfix')
    hrefs = lu.find_all('a')
    url_list = []
    for i in hrefs:
        url_list.append(urljoin(urls, i['href']))
    return url_list

该函数的功能是获取公交线路信息页中所有公交线路的url。首先,通过urllib库中的urlopen()方法和BeautifulSoup库中的find()方法,解析出公交线路信息页中指定的HTML标签。然后,通过循环遍历所有公交线路的a标签,使用urljoin()方法将相对路径转换为完整的URL,并将转换后的URL添加到列表url_list中,最后返回url_list。

(3)创建一个get_page_info的方法,获取公交的详细信息。

def get_page_info(url):
    html = urllib.request.urlopen(url)
    soup = bs(html.read(), 'html.parser')
    bus_name = soup.select('div[class="bus-lzinfo service-area mb20"]>div[class="info"]>h1[class="title"]>span')[0].string
    bus_type = soup.select('div[class="bus-lzinfo service-area mb20"]>div[class="info"]>h1[class="title"]>a')[0].string[1:-1]
    bus_time = soup.find_all('li', tabindex='0')[4].string
    bus_ticket = soup.find_all('li', tabindex='0')[5].string

    bus_gongsi = soup.select('ul[class="bus-desc"]>li>span')[0].string + soup.select('ul[class="bus-desc"]>li>a')[0].string
    bus_gengxin = soup.select('ul[class="bus-desc"]>li>span')[1].string
   
    try:
        wang_info = soup.select('div[class="bus-excerpt mb15"]>div>div[class="trip"]')[0].string
        wang_list = soup.select('div[class="bus-lzlist mb15"]:nth-of-type(2)>ol>li>a')
    except:
        wang_info = None
        wang_list = None
    
    try:
        fan_info = soup.select('div[class="bus-excerpt mb15"]>div>div[class="trip"]')[1].string
        fan_list = soup.select('div[class="bus-lzlist mb15"]:nth-of-type(4)>ol>li>a')
    except:
        fan_info = None
        fan_list = None
        
    if wang_list != None:    
        bus_wang = ''
        for i in range(len(wang_list)):
            if i != len(wang_list) - 1:
                bus_wang += wang_list[i].string + ','
            else:
                bus_wang += wang_list[i].string
    else:
        bus_wang = None
        
    if fan_list != None:
        bus_fan = ''
        for i in range(len(fan_list)):
            if i != len(fan_list) - 1:
                bus_fan += fan_list[i].string + ','
            else:
                bus_fan += fan_list[i].string
    else:
        bus_fan = None
    result = [bus_name, bus_type, bus_time, bus_ticket, bus_gongsi, bus_gengxin, wang_info, bus_wang, fan_info, bus_fan]
    return result

该函数的功能是获取公交线路信息页中指定的公交线路详细信息,并将其封装成一个列表返回。首先,通过urllib库中的urlopen()方法和BeautifulSoup库中的select()方法,解析出公交线路名称、类型、运行时间、票价、公交公司、更新时间等信息。其中,使用CSS选择器来定位HTML标签,可以更加方便地解析HTML文档。接着,通过find_all()方法和tabindex属性来获取HTML中指定的标签,进一步解析出公交线路的运行时间和票价信息。

然后,使用select()方法来查找公交线路是否有往返信息,如果有,则获取往返信息和对应的公交线路列表。而如果没有往返信息,则往返信息和对应的公交线路列表赋值为None。需要注意的是,在获取公交线路列表时,需要遍历所有的a标签,并将每个a标签的string属性连接成一个以逗号为分隔符的字符串,最后赋值给bus_wang或bus_fan。

最后,将所有获取到的公交线路信息按照指定的顺序封装成一个列表result,并返回该列表。

(4)编写主函数,爬取公交信息。

if __name__ == "__main__":
    
    url = 'http://suzhou.8684.cn/list%d'
    url_list = []

    for i in range(1,10):
        urls = url % i
        url_list += get_page_url(urls)
    for i in url_list:
        result = get_page_info(i)
        for j in result:
            print(j)
        print('\n')

程序执行前判断了当前模块是否是主模块,如果是主模块,则执行程序中的main()函数。在main()函数中,通过调用get_page_url()函数,获取了所有公交线路信息页的URL,并将其保存到url_list中。接着,使用循环遍历url_list中的每个URL,调用get_page_info()函数获取每个URL中的公交线路详细信息,并将每条公交线路的详细信息按照指定的顺序打印出来,以供可视化查看。

3. 保存公交数据到csv文件中

程序设计

修改主函数为:

if __name__ == "__main__":
	
	url = 'http://suzhou.8684.cn/list%d'
	url_list = []
	
	cs = open("bus_info.csv",'w',newline='')
	writer = csv.writer(cs)
	
	for i in range(1,10):
	    urls = url % i
	    url_list += get_page_url(urls)
	for i in url_list:
	    result = get_page_info(i)
	    writer.writerow(result)
	
	with open('bus_info.csv', newline='') as csvfile:
	    reader = csv.reader(csvfile)
	    for i in reader:
	        for j in i:
	            print(j)
	        print('\n')

该程序在前一个的基础上增加了将获取到的公交线路信息写入到CSV文件中的功能。程序开始时同样会判断当前模块是否为主模块,若是则执行程序中的main()函数。在main()函数中,首先打开一个名为“bus_info.csv”的文件,用于存储公交线路信息。通过csv.writer创建一个csv文件写入器writer,然后循环遍历url_list列表中的每个URL,调用get_page_info()函数获取每个URL中的公交线路详细信息,并将获取到的信息写入到创建的CSV文件中。最后,再次打开“bus_info.csv”文件,通过csv.reader读取其中的数据,然后将每一行数据输出到终端,实现可视化输出。

运行结果

7

4. 保存公交数据到mysql数据库中

程序设计

修改主函数为:

if __name__ == "__main__":

	url = 'http://suzhou.8684.cn/list%d'
	url_list = []
	
	cs = open("bus_info.csv",'w',newline='')
	writer = csv.writer(cs)
	
	for i in range(1,10):
	    urls = url % i
	    url_list += get_page_url(urls)
	    
	mysql_url = pymysql.connect(host="***", user="***", passwd="***", db="***")
	curson = mysql_url.cursor()
	curson.execute("create table bus_info(name varchar(1000), type varchar(1000), time varchar(1000),ticket varchar(1000),gongsi varchar(1000),gengxin varchar(1000),wang varchar(1000),wang_info varchar(1000),fan varchar(1000), fan_info varchar(1000))")
	mysql_url.commit()
	    
	for i in url_list:
	    result = get_page_info(i)
	    writer.writerow(result)
	    data = tuple(result)
	    curson.execute('insert into bus_info(name,type,time,ticket,gongsi,gengxin,wang,wang_info,fan,fan_info) values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', data)
	    mysql_url.commit()

该程序在前一个程序的基础上增加了将获取到的公交线路信息写入到MySQL数据库中的功能。程序开始时同样会判断当前模块是否为主模块,若是则执行程序中的main()函数。在main()函数中,首先打开一个名为“bus_info.csv”的文件,用于存储公交线路信息。通过csv.writer创建一个csv文件写入器writer,然后循环遍历url_list列表中的每个URL,调用get_page_info()函数获取每个URL中的公交线路详细信息,并将获取到的信息写入到创建的CSV文件中。接下来连接MySQL数据库,创建一个包含各列标题的表,用于存储公交线路信息。然后再次循环遍历url_list列表,调用get_page_info()函数获取该URL中的公交线路详细信息,并将获取到的信息通过SQL语句写入到已创建的MySQL表中。最后,提交数据库的更改并关闭数据库连接。这样就可以实现从网页上爬取公交线路信息并将其存储到MySQL数据库中。

运行结果

8

写在后面

我是一只有趣的兔子,感谢你的喜欢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web基础和http协议(粗糙版)

服务部署,集训,分布式,数据库,日志系统,等二阶段 web基础和http协议: web的相关基础知识,包括域名 dns解析 网页的概念以及http协议 1.网络当中通信:端口 ip 协议 tcp/ip 传输过程…

CAD转换器:CAD Exchanger SDK --Crack

转换器 目录 概述读取文件 增量加载写入文件格式特定的详细信息进度状态支持例子 读取和写入多种 CAD 和 BIM 文件格式。 概述 读取(导入)和写入(导出)文件是使用 CAD Exchanger SDK 时的主流场景。支持的格式列表可在此处获取。 …

Misc | bucket 第二届“奇安信”杯网络安全技能竞赛

题目描述: 解密Base全家桶。 密文: 下载附件,解压得到一个txt文本,打开如下。 3441344134363435344435323442344534423441343635353334353333323442343935413442353434393535354135333441344534353536353535333332353534413436…

酷柚易汛ERP-自定义打印整体介绍

1、产品介绍 每种单据系统预设常用模板,提供A4纸张、三等分、二等分,销货单额外提供80mm、58mm供用户选择;每张单据可设置一个默认模板和多个常用模;除默认模板外,其他模板都允许删除,用户可以根据公司业务…

ArcGIS实现矢量区域内所有要素的统计计算

1、任务需求:统计全球各国所有一级行政区相关属性的总和。 (1)有一个全球一级行政区的矢量图,包含以下属性(洪灾相关属性 province.shp) (2)需要按照国家来统计各个国家各属性的总值…

前端前沿技术

文章目录 网站静态化PWA - Progressive Web APP, 渐进式 Web 应用PWA 简介解决了哪些问题?PWA 的优势浏览器支持情况参考文档 Weex 是一个可以使用现代化的 Web 技术开发高性能原生应用的框架。高性能跨平台贴近前端生态被大规模的使用 GraphQL[一种用于 API 的查询语言](http…

并发事务下,不同隔离级别可能出现的问题

并发事务下,不同隔离级别可能出现的问题 1、事务的 ACID2、并发事务下,不同隔离级别可能出现的问题2.1、脏写2.2、脏读2.3、不可重复读2.4、幻读 3、SQL 中的四种隔离级别 1、事务的 ACID 原子性(Atomicity):原子性意味…

数据结构 | 栈的实现

数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 Stack.h初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。…

勘察设计考试公共基础之数学篇

1、数学 向量点积:向量叉积:平面的法向量为n(A,B,C),则该平面的点法式方程为: A(x-x0)B(y-y0)C(z-z0)0 两平…

爬虫,TLS指纹 剖析和绕过

当你欲爬取某网页的信息数据时,发现通过浏览器可正常访问,而通过代码请求失败,换了随机ua头IP等等都没什么用时,有可能识别了你的TLS指纹做了验证。 解决办法: 1、修改 源代码 2、使用第三方库 curl-cffi from curl…

【T690 之十一】基于方寸EVB2开发板,结合 Eclipse+gdb+gdbserver 调试 CCAT 的流程总结

目录 1. 准备工作1.1 Eclipse1.2 工程编译1.3 烧写固件 2. 创建工程2.1 搭建调试工程2.2 配置Dbug调试信息 3. 调试4. 手动调试过程4. 总结 备注: 1,假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解,可以根据此文的配置进行Li…

3D模型人物换装系统二(优化材质球合批降低DrawCall)

3D模型人物换装系统 介绍原理合批材质对比没有合批材质核心代码完整代码修改总结 介绍 本文使用2018.4.4和2020.3.26进行的测试 本文没有考虑法线贴图合并的问题,因为生成法线贴图有点问题,放在下一篇文章解决在进行优化 如果这里不太明白换装的流程可以…

基于物理的多偏置射频大信号氮化镓HEMT建模和参数提取流程

标题:Physics-Based Multi-Bias RF Large-Signal GaN HEMT Modeling and Parameter Extraction Flow 来源:JOURNAL OF THE ELECTRON DEVICES SOCIETY 摘要 本文展示了一种一致的Al镓氮化物(AlGaN)/氮化镓(GaN&#x…

CSS省略号n行公式

记得改图中的n,这是你需要的几行省略号!复制中间的5行就行了。 .text {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: n; //n为你想省略的行数,需要改-webkit-box-orient: vertical; } 这是…

卷积神经网络(1)

目录 卷积 1 自定义二维卷积算子 2 自定义带步长和零填充的二维卷积算子 3 实现图像边缘检测 4 自定义卷积层算子和汇聚层算子 4.1 卷积算子 4.2 汇聚层算子 5 学习torch.nn.Conv2d()、torch.nn.MaxPool2d();torch.nn.avg_pool2d(),简要介绍使用方…

时间序列预测实战(十三)定制化数据集FNet模型实现滚动长期预测并可视化结果

论文地址->官方论文代码地址 官方代码地址->官方下载地址Github 个人修改代码地址-> 个人修改版本呢的下载地址CSDN 一、本文介绍 本博客将介绍一种新的时间序列预测模型——FNet,它通过使用傅里叶变换代替自注意力机制,旨在解决传统Transf…

瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 1.启用/禁用员工账号 1.1 思路分析 1.2Controller层 PutMapping()public R<String> update(RequestBody Employee employee, HttpServletRequest request) {log.info(employee.toString());Long emp (Long) request.getSession().getAttribu…

AI毕业设计生成器(基于AI大模型技术开发)

这是一个辅助生成计算机毕业设计的工具&#xff0c;可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目&#xff0c;运用tengsorflow技术&#xff0c;训练出了AI大模型。基本实现了计算机毕业设计生成器&#xff0c;能够初步生成Java或python基本源码。…

遇到问题,我该如何提问?

作为IT行业的从业者&#xff0c;我们深知程序员在保障系统安全、数据防护以及网络稳定方面所起到的重要作用。他们是现代社会的护城河&#xff0c;用代码构筑着我们的未来。那程序员的护城河又是什么呢&#xff1f;是技术能力的深度&#xff1f;是对创新的追求&#xff1f;还是…

一些分享| 在线笔记、GIF图片生成方法

文章目录 在线笔记视频转GIF 本片博客旨在挖掘一些好用且免费的在线平台&#xff0c;持续更新中~ 正所谓科技解放双手&#xff0c;使用在线平台可以方便快捷地学习办公&#xff0c;节省时间。 在线笔记 语雀 https://www.yuque.com/dashboard 语雀是笔者用得最长最久的平台了…