Python数据分析实验一:Python数据采集与存储

news2024/11/15 13:54:51

目录

    • 一、实验目的与要求
    • 二、实验过程
    • 三、主要程序清单和运行结果
      • 1、爬取 “中国南海网” 站点上的相关信息
      • 2、爬取天气网站上的北京的历史天气信息
    • 四、程序运行结果
    • 五、实验体会

一、实验目的与要求

1、目的:

  理解抓取网页数据的一般处理过程;熟悉应用 Chrome 浏览器的工具分析网页的基本操作步骤;掌握使用 Requests 库获取静态网页的基本方法;掌握 Beautiful Soup 提取静态网页信息的主要技术。
  理解网络数据采集的 Robots 协议的基本要求,能合规地进行网络数据采集。

2、要求:

  编写一个网络爬虫,爬取某个网站的信息并存储到文件或数据库中。学生既可以使用 Requests/Beautiful Soup 库来实现信息采集,也可以自选其他爬虫技术,对爬取的网站也允许自选,但需要符合相关网站的规定。推荐如下的两个网址,可以选择其中之一采集网页上的信息:

(1)爬取 “中国南海网” 站点上的相关信息。

  图1是中国南海网上特定页面(http://www.thesouthchinasea.org.cn/about.html)的部分截图,请爬取该网页中某一栏目的内容并保存在一个TXT文件中,爬取结果如图2所示。

Alt

图1 中国南海网的网页截图
  

Alt

图2 爬取网页上“概说南海”的文字效果图
  

(2)爬取天气网站上的北京的历史天气信息。

  图3是天气网关于北京2019年9月份天气信息的部分截图,请爬取该网页(http://www.tianqihoubao.com/lishi/beijing/month/201909.html)中的天气信息并保存在一个 CSV 文件中,爬取结果如图4所示。

Alt

图3 天气网关于北京2019年9月份天气信息的部分截图
  

Alt

图4 爬取并保存在CSV文件中的信息

二、实验过程

1、观察所爬取网站的Robots协议的相关内容:

https://www.baidu.com/robots.txt

Alt

2、网络爬虫抓取网页数据的一般处理过程:

(1)确定目标网站:首先,需要明确自己想要获取哪个网站上的数据。通常情况下,我们需要先通过浏览器访问该网站,并查看其源代码,以便更好地了解其网页结构和所需数据所在位置。
(2)分析目标网站:接着,需要对目标网站进行分析。这包括查看该网站的 robots.txt 文件,了解其对爬虫的限制;查看其页面结构和 URL 规则,以便编写相应的爬虫程序。
(3)编写爬虫程序:在确定了目标网站并分析了其结构后,就可以开始编写爬虫程序了。这需要使用一些编程语言和相关库来实现。在编写程序时,需要注意多线程处理、异常处理等问题。
(4)发送 HTTP 请求:在编写好爬虫程序后,就可以向目标网站发送 HTTP 请求了。这需要使用相应的库或工具来实现。在发送请求时,需要注意设置请求头、代理等参数,以避免被目标网站封禁。
(5)解析 HTML 页面:当爬虫程序成功获取到目标网站返回的响应后,就需要对其进行解析。这需要使用一些 HTML 解析器来实现。在解析页面时,需要注意处理页面中的各种标签、属性等信息,并将所需数据提取出来。
(6)存储数据:在提取出所需数据后,就需要将其存储下来。这可以使用各种数据库或文件系统来实现。在存储数据时,需要考虑数据格式、存储方式等问题。
(7)去重处理:由于同一个网站上可能存在多个相同的页面或数据,因此需要对已经获取过的页面或数据进行去重处理。

三、主要程序清单和运行结果

1、爬取 “中国南海网” 站点上的相关信息

import requests
from bs4 import BeautifulSoup

# 发起请求
url = 'http://www.thesouthchinasea.org.cn/about.html'
response = requests.get(url)

# 解析HTML内容
soup = BeautifulSoup(response.content, 'html.parser')

# 查找包含标题为“概说南海”的元素
section = soup.find('h3', text='概说南海')

if section:
    # 获取概说南海栏目标题和内容
    content = f"{section.get_text(strip=True)}\n\n"
    next_element = section.find_next_sibling()
    while next_element and next_element.name != "h3":
        if next_element.name == "p":  # 只获取段落内容
            paragraph_text = next_element.get_text(strip=True)
            paragraph_text = paragraph_text.replace("[更多]", "")
            content += paragraph_text + "\n"
        next_element = next_element.find_next()
    
    # 将内容存储到文件中
    with open('概说南海.txt', 'w', encoding='utf-8') as file:
        file.write(content)

    print('“概说南海”内容已成功爬取并保存到概说南海.txt文件中。')
else:
    print('未找到“概说南海”栏目的内容。')

  用于从指定的 URL(在这个例子中是http://www.thesouthchinasea.org.cn/about.html)爬取标题为“概说南海”的内容,并将这些内容保存到本地文件“概说南海.txt”中。这个过程涉及到发送 HTTP 请求、解析 HTML 内容、文本处理以及文件操作等多个环节。以下是对这个代码的简要分析:

  • 发送HTTP请求:使用requests.get(url)向指定的URL发起GET请求,获取网页内容。

  • 解析HTML内容:利用BeautifulSoup(response.content, 'html.parser')解析服务器返回的内容。这里,response.content得到的是原始的字节流,而'html.parser'是指定的解析器。

  • 查找特定元素:通过soup.find('h3', text='概说南海')查找页面上文本为“概说南海”的<h3>标签,这是定位需要抓取内容的起点。

  • 提取并处理内容:从找到的<h3>标签开始,遍历其后的同级元素,直到遇到下一个<h3>标签为止(或者没有更多同级元素)。在这个过程中,如果遇到的是<p>标签,则提取其文本内容,并去除其中的 “[更多]” 字符串。

  • 保存到文件:将处理后的文本内容写入名为“概说南海.txt”的文件中,文件编码为UTF-8

  • 异常处理:如果在页面中没有找到标题为“概说南海”的部分,会打印提示信息。

  此脚本展示了 Python 在网络爬虫方面的应用,尤其是使用requests库进行网络请求和BeautifulSoup库进行 HTML 解析的实践。

2、爬取天气网站上的北京的历史天气信息

import requests
from bs4 import BeautifulSoup

# 目标网页的URL
url = "http://www.tianqihoubao.com/lishi/beijing/month/201909.html"
# 使用requests库获取网页内容
response = requests.get(url)
# 使用BeautifulSoup解析获取到的网页内容
soup = BeautifulSoup(response.text, "html.parser")
# 在解析后的网页中找到包含天气信息的表格,假设它的class为"b"
weather_table = soup.find("table", class_="b")
# 从表格中找到所有的行(tr元素),跳过第一行(标题行)
rows = weather_table.find_all("tr")[1:]

# 打开(或创建)一个名为"北京天气信息201909.csv"的文件用于写入
with open("北京天气信息201909.csv", mode="w", encoding="utf-8") as file:
    # 写入CSV文件头
    file.write("日期,温度,天气情况\n")
    
    # 遍历每一行天气数据
    for row in rows:
        columns = row.find_all("td")  # 在当前行中找到所有的单元格(td元素)
        date = columns[0].text.strip()  # 提取日期数据,并去除两端多余的空白字符
        temperature = ' '.join(columns[2].text.strip().split())  # 提取温度数据,将多余的空白字符替换为单个空格
        weather = ' '.join(columns[1].text.strip().split())  # 提取天气情况数据,同样将多余的空白字符替换为单个空格
        
        # 将提取的数据写入CSV文件的一行中
        # 注意CSV中的数据项通常由逗号分隔,如果数据本身包含逗号,则需要用引号包围该数据项
        file.write(f"{date},{temperature},{weather}\n")

# 数据保存完成后打印提示信息
print("天气信息已保存在 北京天气信息201909.csv 文件中。")

  这段代码是用 Python 编写的一个简单的网络爬虫脚本,旨在从指定的网页中提取北京市2019年9月份的天气信息,并将提取到的数据保存到CSV文件“北京天气信息201909.csv”中。以下是对代码的简要分析:

  • 发送HTTP请求:使用requests.get(url)向指定的URL发起GET请求,获取网页内容。

  • 解析HTML内容:利用BeautifulSoup(response.text, 'html.parser')解析服务器返回的HTML内容。这里,response.text包含了网页的文本内容,而'html.parser'是指定的HTML解析器。

  • 查找特定元素:通过soup.find("table", class_="b")查找页面上class"b"的表格元素,用于定位包含天气信息的表格。

  • 提取并处理内容:遍历表格中的每一行,提取日期、温度和天气情况数据,并进行适当的清洗(去除空白字符)。

  • 保存到文件:将提取的天气信息按照CSV格式写入到名为“北京天气信息201909.csv”的文件中,每行包含日期、温度和天气情况。

  • CSV文件格式:CSV文件中的数据项通常由逗号分隔,如果数据本身包含逗号,则需要用引号包围该数据项。

  • 异常处理:代码中没有显式的异常处理逻辑,如果在实际运行中出现网络连接问题或者页面结构变化,可能会导致程序出错。

  请注意,网页的结构和内容经常会发生变化,因此需要定期检查和更新代码以适应目标网站的变化。同时,在实际应用中,也应该尊重网站的robots.txt协议,避免对网站造成不必要的负担。

四、程序运行结果

1、爬取 “中国南海网” 站点上的相关信息

Alt

运行结果:

Alt

2、爬取天气网站上的北京的历史天气信息

Alt

运行结果:

Alt

五、实验体会

  通过实践,对网络爬虫如何工作有一个直观的认识,包括如何发送 HTTP 请求、如何解析网页内容、如何提取和处理数据等。这个过程能更好地理解网络协议、网页结构(HTML、CSS、JavaScript)以及服务器响应等概念。
  在 Python 数据采集与存储实验中,你接触并使用多种第三方库,比如 requests 用于发起网络请求,BeautifulSoup 或 lxml 用于解析 HTML 文档,pandas 用于数据处理,sqlite3 或其他数据库模块用于数据存储等。这些库大大简化了数据采集和处理的过程,提高了开发效率。数据采集后的处理和存储是非常重要的一环。学会如何清洗数据、转换数据格式、有效地存储数据。这包括了解不同数据存储方式的特点,如文件存储(CSV、JSON等)、数据库存储(关系型数据库如 MySQL、SQLite ;非关系型数据库如 MongoDB)等。
  在进行网络爬虫实验的过程中,更加深切地意识到遵守目标网站的 robots.txt 协议、尊重版权、保护个人隐私等法律法规和伦理道德的重要性。这不仅是合法合规的要求,也是作为一名负责任的开发者应有的职业操守。

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

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

相关文章

JAVA实战开源项目:智能停车场管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

【python】异常处理

前言 省略各种废话&#xff0c;直接快速整理知识点 try-except 基础 作用 程序不可能永远都是对的&#xff0c;当7除a&#xff0c;a由用户输入时&#xff0c;用户输入0就会报错。try-except就是解决这些问题。 结构 多分支自定义错误类型 上方的exception是一个错误类型…

Unity性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI&#xff0c;因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测&#xff0c;则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明&#xff0c;我们看不见它&#xf…

【牛客】HJ87 密码强度等级 CM62 井字棋

题目一:密码强度等级 题目链接&#xff1a;密码强度等级_牛客题霸_牛客网 (nowcoder.com) 本题主要考察C语言中逻辑分支语句&#xff0c;基本语句以及对各种特殊字符 &#xff0c;ASCII值以及条件表达中的逻辑运算符关系运算符各自功能的理解&#xff0c;以及基本使用&#x…

【linuxC语言】dup、dup2函数

文章目录 前言一、dup函数二、dup2函数三、将标准输出重定向到文件总结 前言 在Linux环境下&#xff0c;dup、dup2以及原子操作都是用于文件描述符管理和处理的重要工具。这些功能提供了对文件描述符进行复制和原子操作的能力&#xff0c;使得在多线程或多进程环境中更加安全和…

qt一个项目有且只有有一个maindow,其他小窗口用QWidget,QDialog是带有yes和no的QWidget

QMaindow QWidget QDialog区别很大 我想要在生成一个小窗口&#xff0c;结果选择基类为maindow&#xff0c;应该是QWidget 然后就出现奇奇怪怪的问题 QMaindow和QWidget不能乱选择&#xff0c;而且各自QPaintEvent也有很多区别 以下就是错误&#xff1a; 我继承maindow的基类…

C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码

1 排列组合的堆生成法 堆生成算法用于生成n个对象的所有组合。其思想是通过选择一对要交换的元素&#xff0c;在不干扰其他n-2元素的情况下&#xff0c;从先前的组合生成每个组合。 下面是生成n个给定数的所有组合的示例。 示例&#xff1a; 输入&#xff1a;1 2 3 输出&a…

【Qt】四种绘图设备详细使用

绘图设备有4个: **绘图设备是指继承QPainterDevice的子类————**QPixmap QImage QPicture QBitmap(黑白图片) QBitmap——父类QPixmapQPixmap图片类&#xff0c;主要用来显示&#xff0c;它针对于显示器显示做了特殊优化&#xff0c;依赖于平台的&#xff0c;只能在主线程…

python编程从入门到实践

python编程从入门到实践 if语句1.条件测试&#xff1a;2.更多的条件测试&#xff1a;3.外星人颜色#1&#xff1a;4. 外星人颜色#2&#xff1a;5. 外星人颜色#3&#xff1a;6. 人生的不同阶段&#xff1a;7. 喜欢的水果&#xff1a;8. 以特殊方式跟管理员打招呼&#xff1a;9. 处…

程序员失业,被迫开启 PlanB——成为自由职业/独立开发者的第 0 天

程序员失业&#xff0c;被迫开启 PlanB——成为自由职业/独立开发者的第 0 天 今天在逛V2EX的时候看到的一个帖子&#xff0c;程序员中年被裁&#xff0c;被迫开启独立开发这条路。 原贴如下&#xff1a; lastday, 失业啦 公司年前通知我合同到期不续签&#xff0c;今天是我…

React改变数据【案例】

State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…

专业的项目管理系统,企智汇!帮助企业提高项目管理效率!

一款专业的项目管理系统&#xff0c;是企智汇项目管理系统&#xff01;企智汇专业做项目管理系统10年&#xff0c;经过10年的打磨&#xff0c;有成熟的项目管理系统功能&#xff0c;它面向各个企业的项目团队&#xff0c;提供数字化、智能化、信息化的项目管理功能&#xff0c;…

【亲测有效】解决三月八号ChatGPT 发消息无响应!

背景 今天忽然发现 ChatGPT 无法发送消息&#xff0c;能查看历史对话&#xff0c;但是无法发送消息。 可能的原因 出现这个问题的各位&#xff0c;应该都是点击登录后顶部弹窗邀请 [加入多语言 alapha 测试] 了&#xff0c;并且语言选择了中文&#xff0c;抓包看到 ab.chatg…

工作合同坑

1-不要给证件原件&#xff0c;给复印件&#xff0c;并写明用处 。 2-正式入职才填写详细的个人信息 3-入职的各种相关费用需要谨慎&#xff0c;注意是否合法正规 4-招转培是个坑 5-无薪试岗&#xff0c;滚 6-试用期工资不能低于转正之后的80%&#xff0c;一定要有纸质的正式工资…

LayerNorm的图是不是画错了

这是网上一张很流行的说明几个 Normalization 区别的图 这图出自Kaiming的文章 Group Norm 但是他这个 Layer Norm 的图是不是画错了? 我大四写毕设的时候就想问&#x1f923;&#x1f923;&#x1f923; 这都几年过去了 我觉得图应该是这样画的&#xff0c;相同颜色的区域…

使用docker-compose编排ruoyi项目

目录 一、开始部署 1.拉取ruoyi代码 2.拉取node镜像 3.拉取maven镜像 4.在/root/ruoyi/java下写一个Dockerfile用于后端Java环境 5.拉取MySQL&#xff0c;Redis&#xff0c;Nginx镜像 6.在/root/java目录下写一个nginx.conf 7.在/root/ruoyi目录下写docker-compose.yml文…

计算机网络——计算机网络的性能

计算机网络——计算机网络的性能 速率带宽吞吐量时延时延宽带积往返时间RTT利用率信道利用率网络利用率 我们今天来看看计算机网络的性能。 速率 速率这个很简单&#xff0c;就是数据的传送速率&#xff0c;也称为数据率&#xff0c;或者比特率&#xff0c;单位为bit/s&#…

Spring boot 请求参数包含[]等特殊字符,导致无法接收问题

前言对字符进行转义修改tomcat 配置 前言 Spring boot 请求参数包含[]等特殊字符&#xff0c;导致无法接收问题 对字符进行转义 中括号[] 必须用%5B%5D转义&#xff0c;否则tomcat无法解析&#xff0c;回抛出不合法字符异常&#xff0c;不会进入控制器 修改tomcat 配置 p…

JavaEE企业开发新技术

目录 2.1 Class对象基本概念 1、概念 2.2 Class对象的获取方式 2.3基本数据类型的Class对象 1、概念 2.4 反射的基本概念 概念 2.5 Class对象的基本使用-1 2.6 Class对象的基本使用-2 newInstance()和new()区别&#xff1a; 2.1 Class对象基本概念 1、概念 反射的…

【字符串】【贪心】【 树状数组】2193. 得到回文串的最少操作次数

作者推荐 视频算法专题 本文涉及知识点 字符串 贪心 树状数组 分类讨论 LeetCode2193. 得到回文串的最少操作次数 给你一个只包含小写英文字母的字符串 s 。 每一次 操作 &#xff0c;你可以选择 s 中两个 相邻 的字符&#xff0c;并将它们交换。 请你返回将 s 变成回文串…