使用第三方库爬取郑州地铁线路信息

本文已同步更新于博主个人博客:blog.buzzchat.top

一、目标分析

目标网站:8684郑州地铁线路图 (郑州地铁线路图新版 - 郑州地铁图 - 郑州地铁线路)

郑州地铁线路图新版 - 郑州地铁图 - 郑州地铁线路

  • 爬取内容
    • 所有地铁线路的名称
    • 每条线路的站点信息
  • 数据存储:将爬取到的数据存储到 CSV 文件中,方便后续查看和分析。

二、项目准备

必要的 Python 库:

  • requests: 用于发送 HTTP 请求,获取网页内容。
  • lxml: 用于解析 HTML 文档,提取所需信息。
  • csv: 用于处理 CSV 文件,将数据写入文件。

2.1 第三方库介绍:

2.1.1 requests 库:

💡 作用: requests 是一个简洁且易于使用的 HTTP 库,用于发送 HTTP 请求,例如 GET 和 POST 请求,并处理服务器的响应。

💡 优点:

  • 简洁易用:requests 的 API 设计简洁明了,易于理解和使用。
  • 功能强大:requests 支持各种 HTTP 方法,包括 GET、POST、PUT、DELETE 等,以及各种身份验证、代理、Cookie 处理等功能。
  • 速度快:requests 底层使用 urllib3,具有高效的 HTTP 连接池和连接复用机制,能够快速处理大量请求。 

💡 选择理由: 在爬虫项目中,requests 是获取网页内容的首选库,因为它能够高效、可靠地处理 HTTP 请求和响应。

2.1.2 lxml 库:

💡 作用: lxml 是一个高效的 XML 和 HTML 处理库,支持 XPath 和 CSS 选择器,用于解析 HTML 文档,定位和提取所需信息。

 💡 优点:

  • 高效快速:lxml 基于 C 库 libxml2 和 libxslt,解析速度非常快,尤其是在处理大型 HTML 文档时。
  • 功能强大:lxml 支持 XPath 1.0、XSLT 1.0、DTD 验证、 RelaxNG 验证等功能,能够处理复杂的 HTML 结构。
  • 易于使用:lxml 提供了简洁的 API,方便使用 XPath 和 CSS 选择器定位和提取 HTML 元素。 

💡 选择理由: lxml 是解析 HTML 文档的理想选择,因为它能够快速、准确地定位和提取所需信息,并且支持 XPath,方便处理复杂的 HTML 结构。

2.1.3 csv 库:

💡 作用: csv 是 Python 内置的 CSV 文件处理库,用于读取和写入 CSV 文件。

 💡 优点:

  • 简单易用:csv 库提供了简洁的 API,方便读取和写入 CSV 文件。
  • 支持多种格式:csv 库支持多种 CSV 格式,包括标准 CSV、Excel CSV 等。 

 💡 选择理由: csv 库是处理 CSV 文件的标准库,能够方便地将爬取到的数据存储到 CSV 文件中,方便后续查看和分析。

三、XPath 结构分析与爬取逻辑

3.1 XPath 结构分析:

首先,我们需要分析目标网站的 HTML 结构,找到包含线路和站点信息的元素,并确定其 XPath 表达式。

 💡 通过观察郑州地铁官网的 HTML 源代码,我们可以发现:

  • 所有地铁线路信息包含在 <div class="line-box"> 元素中。
  • 每条线路对应一个 <li class="sLink"> 元素。
  • 线路名称包含在 <li> 元素下的 <a> 元素的文本内容中。
  • 线路下的站点信息包含在 <div class="cm-tr"> 元素下的多个 <a> 元素的文本内容中。 

3.2 爬取逻辑:

 1️⃣ 发送 HTTP 请求: 使用 requests 库向目标网站发送 GET 请求,获取网页的 HTML 内容。

 2️⃣ 解析 HTML 结构: 使用 lxml 库将 HTML 内容解析为 HTML 文档,方便使用 XPath 定位元素。

 3️⃣ 提取线路信息:

  • 使用 XPath //li[@class="sLink"] 定位所有线路的 <li> 元素。
  • 对于每个 <li> 元素:
    • 使用 XPath ./a/text() 提取线路名称。
    • 使用 XPath ./div[@class="cm-tr"]/a/text() 提取该线路下所有站点的名称列表。 

 4️⃣ 数据整合:

  • 将站点名称列表转换为字符串,使用 "," 连接各个站点。 

 5️⃣ 写入 CSV 文件:

  • 创建名为 ZhengZhouSubwayInfo.csv 的 CSV 文件。
  • 写入列名 "线路" 和 "站点"。
  • 将线路名称和站点信息逐行写入文件。 

四、代码实现及运行结果

import requests  # 导入 requests 库,用于发送 HTTP 请求
from lxml import etree  # 导入 lxml 库,用于解析 HTML
import csv  # 导入 csv 库,用于处理 CSV 文件

# 设置目标 URL
url = '<https://m.8684.cn/zhengzhou_dt_map>'

# 发送 GET 请求获取网页内容
response = requests.get(url)
response.encoding = 'utf-8'  # 设置网页编码为 utf-8

# 使用 lxml 解析 HTML
html = etree.HTML(response.text)

# 使用 XPath 找到所有线路的 <li> 元素
lines = html.xpath('//li[@class="sLink"]')

# 指定 CSV 文件地址
csv_file = 'D:/Program/python Program/pachong/venv/ZhengZhouSubway.csv'

# 打开 CSV 文件,使用 'w' 模式写入,清空文件并重新写入数据
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)  # 创建 CSV 写入器
    # 写入列名
    writer.writerow(['线路', '站点'])

    # 遍历每个线路
    for line in lines:
        # 使用 XPath 提取线路名称,并去除空格
        line_name = line.xpath('./a/text()')[0].strip()
        # 使用 XPath 提取站点列表
        stations = line.xpath('./div[@class="cm-tr"]/a/text()')

        # 将站点列表转换为字符串,并用","连接
        station_str = ",".join(stations)

        # 将线路名称和站点字符串写入 CSV 文件
        writer.writerow([line_name, station_str])
        print(f"{line_name}线路信息已爬取完毕!")  # 打印提示信息

print(f"郑州地铁站点信息已写入 {csv_file} 文件中。")  # 打印提示信息

运行结果:

 💡 添加打印提示信息,方便用户了解程序运行状态。

五、项目延伸(多层级爬取)

假设郑州地铁官网的每个线路页面都有更详细的信息,例如首末班车时间、票价等。我们可以利用多层级爬取获取这些数据:

  1. 获取线路链接: 在提取线路名称的同时,获取每个线路页面的链接,通常包含在 <a> 元素的 href 属性中。
  2. 循环访问线路页面: 遍历线路链接,发送 HTTP 请求获取每个线路页面的内容。
  3. 解析线路页面: 使用 XPath 定位并提取所需信息,例如首末班车时间、票价等。
  4. 数据整合与存储: 将所有信息整合到一个数据结构中,例如字典或列表,并存储到 CSV 文件或数据库中。

多层级爬取代码示例:

# ... (前面的代码)

for line in lines:
    # ... (提取线路名称)

    # 获取线路链接
    line_url = line.xpath('./a/@href')[0]

    # 访问线路页面
    line_response = requests.get(line_url)
    line_response.encoding = 'utf-8'
    line_html = etree.HTML(line_response.text)

    # 提取首末班车时间
    start_time = line_html.xpath('//xpath/to/start_time/text()')[0]
    end_time = line_html.xpath('//xpath/to/end_time/text()')[0]

    # ... (提取其他信息)

    # 将线路信息整合到字典中
    line_data = {
        '线路': line_name,
        '站点': station_str,
        '首班车': start_time,
        '末班车': end_time,
        # ...
    }

    # ... (将数据写入文件或数据库)

💡 注意:

  • 以上代码示例仅供参考,实际代码需要根据目标网站的结构进行调整。
  • 多层级爬取需要控制爬取频率,避免对目标网站造成过大压力。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python中的urllib库来爬取北京公交线路信息。具体步骤如下: 1. 打开北京公交网站(http://www.bjbus.com/home/index.php)。 2. 在网站上找到“线路查询”功能,输入需要查询的公交线路。 3. 在查询结果页面中,找到需要的公交线路信息。 4. 使用urllib库中的urlopen()函数打开查询结果页面,获取页面内容。 5. 使用正则表达式或BeautifulSoup等工具,从页面内容中提取需要的公交线路信息。 6. 将提取到的公交线路信息保存到本地或数据库中。 需要注意的是,爬取网站信息时需要遵守相关法律法规,不得进行非法操作。同时,也需要注意网站的反爬虫机制,避免被封禁IP等情况发生。 ### 回答2: 要使用urllib爬取北京公交线路信息,需要先了解一下相关的数据接口。目前,北京公交的数据接口已经开放,在网页上可以找到相应的API文档,其中包含了公交线路信息的获取方法。 在使用urllib进行爬取时,需要先使用urlopen函数获取API网址的数据,然后使用json.loads函数将获取到的数据转换为json格式,便于对其进行处理。 在获取到json数据之后,需要对其进行分析和筛选,以便获取到需要的公交线路信息。具体来说,需要从json数据中提取出线路名称、全程行驶时间、起点和终点等信息,并进行存储和处理。对于不同的数据格式和结构,需要编写相应的代码进行处理和转换。 值得注意的是,由于公交线路信息的实时变化,需要及时更新所获取的数据,以保证数据的准确性和完整性。另外,在进行数据爬取时,需要遵守相关的法律法规,合理使用数据接口,确保数据安全和传输的合法性。 总的来说,使用urllib爬取北京公交线路信息需要对公交数据接口的使用方式有一定的了解,需要编写相应的代码进行数据处理和存储,并需要遵守相关法律法规,保证数据的安全和合法性。 ### 回答3: 要使用urllib爬取北京公交线路信息,需要先了解一下公交线路信息的获取方式。北京市交通委员会的官网上提供了公交线路查询服务,通过这个服务可以查询到各个公交线路的详细信息,包括线路名称、起始点、终点、站点、运行时间、票价等。 通过分析这个查询服务的URL,可以发现它是通过GET方式接收查询参数的,我们只需要构造查询参数,然后将其拼接到查询URL后面,就可以获取到相应的查询结果了。 在Python中,可以使用urllib库来构造URL和发送HTTP请求,获取查询结果。具体步骤如下: 1. 构造查询URL 根据查询服务的URL构造查询URL,并设置查询参数,比如查询线路名称为“103路”的公交信息: url = 'http://www.bjbus.com/home/ajax_search.php' params = { 'act': 'getLineDir', 'selBLine': '103路' } url += '?' + urllib.parse.urlencode(params) 2. 发送HTTP请求 使用urllib库的urlopen()方法发送HTTP请求,并读取响应数据: response = urllib.request.urlopen(url) data = response.read().decode('utf-8') 3. 解析响应结果 查询服务返回的结果是一个JSON格式的字符串,可以使用Python提供的JSON解析库解析出结果: import json result = json.loads(data) print(result) 解析出来的结果是一个嵌套的字典和列表结构,包含了公交线路的详细信息。 需要注意的是,由于查询服务是通过AJAX异步请求来实现的,所以需要设置一些HTTP请求头参数才能成功获取查询结果,比如: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Referer': 'http://www.bjbus.com/home/index.php' } request = urllib.request.Request(url, headers=headers) 另外,北京公交线路比较多,直接爬取所有线路信息可能会导致数据量过大,建议使用多线程或异步IO等技术来优化爬虫效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值