☰
数据采集入门:Python顺序结构核心解析与三个可运行示例
2026/10/4 13:32:15 网站建设 项目流程

前几天一个学数据采集的同学跟我说,他看教程翻到"Python顺序结构"这一章,觉得平平无奇:代码不就是从上往下写,一行一行执行吗?有什么好学的。我听完笑了笑,跟他说:你要是把顺序结构只理解成"从上到下",那后面写采集脚本时十有八九要吃苦头。数据采集的完整流程——发请求、收数据、清洗、存库——本质上就是一段一段按顺序执行的操作,你只有把顺序结构里的变量、赋值、输入输出、类型转换这些基本功吃透,才能把采集脚本写得既清晰又不出错。这篇文章我就从数据采集的真实场景出发,把Python顺序结构讲透,再带三个可以直接运行的示例,帮你走一遍"读取数据→处理数据→保存数据"的闭环。适合刚学Python准备做数据采集的朋友,也适合语法学了一阵子却不太会落地的人。

1. 数据采集为什么要从顺序结构开始

1.1 采集任务本身就是一条"流水线"

我见过不少人学Python学了好几个星期,列表、字典、函数都会写,但一上手要做数据采集就懵。原因往往不是不会用某个库,而是搞不清"先做什么、再做什么"。

数据采集任务天然是一条流水线。拿最简单的一次网页数据抓取来说:先要确定采集对象的地址,再向这个地址发起请求,等服务端把内容返回给你,然后从返回内容里提取需要的字段,最后把这些字段写到文件或数据库里。这个顺序几乎是固定的,你不可能还没发起请求就先保存数据,也不可能还没拿到网页内容就开始提取字段。

这个"先做什么、再做什么、最后做什么",放到Python里就是用顺序结构来落地。顺序结构的含义很直白:程序默认按代码从上到下的书写顺序逐条执行,除非用if分支、while或for循环显式改变执行方向。你可以把它想象成一条流水线传送带,每一行代码就是一个工位,上一行处理完,下一行才能接着处理。

我在实际写采集脚本的时候有一个习惯:手写代码之前,先在注释里把自己的流程列出来。比如:

# 第一步:准备要访问的地址 # 第二步:发出请求获取数据 # 第三步:提取有用的字段 # 第四步:保存结果

这种"注释先行"的做法,就是先把流水线的工位排好,再逐行填代码。等真出问题的时候,顺着注释从头往下看,很快就能定位是哪一步错了。这个习惯给我省下了大量排错时间。

1.2 顺序结构是后续所有Python能力的地基

这句话听起来像套话,但实际是实话。Python里有三大程序结构:顺序、分支、循环。分支结构用if做条件判断,循环结构用for、while重复执行一段代码,可它们共同的前提是:你必须先能把一段代码按顺序写对。分支选择的是"接下来走哪条路",但每条路里面还是顺序执行;循环是把一段顺序代码重复执行,而循环体内部依然一行一行来。

有人会问:那既然以后大量用到分支和循环,直接把重点放在那里不行吗?我的经验是不行。顺序结构虽然简单,但它牵扯到的细节恰恰是新手犯错的重灾区:变量命名不规范、该赋值的地方没赋值、input拿到的内容是字符串却当数字用、print拼接输出时忽略类型转换……这些坑在你之后写任何Python代码时都会反复出现。数据采集脚本尤其容易踩类型转换的坑,因为从文件、接口、网页返回的数据大多是文本字符串,而你要做计算、排序、筛选的时候,必须先转成数字或合适的类型。

换句话说,顺序结构是坐标系的原点。把它搞清楚了,后面的分支、循环、函数都是在这个原点之上生长出来的。如果原点歪了,后面学得越多,代码越容易出问题。

2. 顺序结构的核心语法:变量、输入输出与类型转换

2.1 变量与赋值:给采集到的数据安排"容器"

顺序结构里最常见的操作就是变量赋值。数据采集的过程,本质上就是不断把"拿到的数据"放进变量里,再从变量里把数据取出来加工。

url = "https://api.example.com/public-data" title = "示例数据" count = 42

右边先被计算出来,然后存进左边变量。执行到第二行时,变量url里装的是地址字符串;执行到第三行,title装的是标题字符串;到第四行,count装的是整数42。下一行想用这些数据,直接用变量名就行。

这个过程中有几点容易忽略。第一,变量名要起得能说明用途,比如user_name、total_count,不要用a、b、c这种含义不明的名字,时间久了自己都会忘。第二,Python变量是动态类型,同一个变量可以先存字符串再存数字,但这不等于可以随便乱用。我自己就见过有人把一个原本存URL的变量后面赋值成数字,结果请求时报错半天找不到原因。我的做法是:一个变量在程序里尽量只装一种类型的数据,换类型就换新变量名。

2.2 print()和input():让脚本与外界打交道

顺序结构下,跟用户或外部环境打交道主要靠print和input。

print负责把结果输出到屏幕,是快速验证每一步采集结果的神器。我经常在脚本里临时加print,把刚拿到的数据打出来看看结构对不对,调试完再删掉。比如从接口拿到返回内容后,先print(response.text)看看整体结构;结构清楚了再写提取逻辑。

input负责接收用户在终端输入的内容。它在采集脚本里通常用于动态指定参数,比如要下载哪个地址、保存到哪个目录:

url = input("请输入要采集的接口地址:") save_path = input("请输入保存文件路径:")

这里要特别提醒:input接收到的内容一律是字符串。哪怕你在终端里输入的是2024,程序收到的也是字符串"2024",不是数字2024。这直接引出下一个重点。

2.3 类型转换:字符串和数字之间那道隐形门槛

数据采集里最常见的类型问题就是字符串和数字混淆。举个例子:

price = "19.9" quantity = "3" total = price * quantity

print(price * quantity)在Python里不会得到59.7,结果是什么?字符串重复"19.919.919.9"。如果你想让它们当数字相乘,必须显式转换:

total = float(price) * int(quantity) print(total)

这条代码在顺序结构里看似平淡无奇,处理不好就是无数报错的根源。说一个我实操中常遇到的场景:从CSV文件里读出来的列全是字符串,哪怕那一列写的是数字,想求和、求平均就必须先转换。从接口返回的JSON里拿数字字段时,大部分情况下Python会自动解析成数字,但如果你从网页上直接用正则或字符串截取,那拿到的一定又是字符串。所以我在处理数据时有一个固定动作:凡是下一步要参与数学计算的值,先确认它的类型;不确定就用type()函数查一下。

3. 手把手:用顺序结构跑通三个采集示例

3.1 示例一:读取本地CSV并输出

很多人的第一个"数据采集"不是从网络开始的,而是从本地文件开始的。把CSV文件里的数据读进来、做个简单输出,这个流程就完整包含顺序结构的所有要素。

假设你有一个data.csv文件,内容是文本格式:

名称,数量,单价 苹果,3,5.5 香蕉,2,4.0

按顺序结构来写:

# 第一步:打开文件 with open("data.csv", "r", encoding="utf-8") as file: # 第二步:读取全部内容 content = file.read() # 第三步:输出内容 print(content)

为什么用with open而不是file = open(...)?因为with会在代码块执行完后自动关闭文件,不会打开一个忘关的文件句柄。文件句柄泄漏是新手写采集脚本时容易忽略的问题,在长期运行的脚本里,每漏一个就占一个资源,积累多了会导致程序异常。

如果你想按行处理,可以这样:

with open("data.csv", "r", encoding="utf-8") as file: line = file.readline() print("读取到一行的内容是:", line)

readline每次只读取一行。整个过程是按顺序执行的:打开文件、读取一行、输出一行。后面学了循环,你只需把这段顺序代码重复跑几遍,逻辑就从"读一行"变成"把每行都读一遍"。

3.2 示例二:从公开接口获取JSON数据

网络数据采集最常见的来源是公开接口,返回格式通常是JSON。这里以公开的示例接口为例:

import requests # 第一步:准备访问地址 url = "https://api.example.com/public-data" # 第二步:发送请求 response = requests.get(url) # 第三步:把返回内容解析成JSON格式 data = response.json() # 第四步:提取字段 name = data["name"] value = data["value"] # 第五步:输出 print("名称:", name) print("数值:", value)

这段脚本没有一句分支、没有一次循环,干干净净的顺序结构,但它完成了一次完整的数据获取:构造请求、发送、解析、提取、输出。你可以先把requests库安装好,命令是:

pip install requests

如果提示没有pip命令,多半是Python环境变量没配好,重新装一遍Python并勾选"Add Python to PATH"就好。这里必须强调:对于公开接口,调整访问频率和方式以满足正常教学学习需要即可,不要高频轰炸不属自己的服务,更不要把拿到的数据二次打包传播。做数据采集要有基本边界感,这比技巧重要。

3.3 示例三:把采集结果写入新文件

采集数据后往往要落盘保存。最省事的方式是写成CSV或者JSON文件。这里用写CSV作为示例,因为格式直观,用表格软件也能打开。

import csv # 第一步:组织要写入的内容 row_data = ["苹果", 3, 5.5] # 第二步:打开文件,准备写入 with open("result.csv", "w", newline="", encoding="utf-8") as file: # 第三步:创建写入器 writer = csv.writer(file) # 第四步:写入表头 writer.writerow(["名称", "数量", "单价"]) # 第五步:写入数据行 writer.writerow(row_data)

newline=""这个参数很多人第一次会忽视。如果不加,在Windows上写出的CSV会在每行后面多出一个空行,很烦人。encoding="utf-8"是为了避免中文乱码。

这里的每一步都有前后关系:先有数据,才能打开文件写入;必须先创建写入器,才能调用writerow写一行。任何一步顺序颠倒,脚本都会报错或者写错内容。学习顺序结构,最重要的就是建立这种"先后顺序"的敏感度。

3.4 把三个示例串成一条完整流水线

把上面三个示例首尾相接,就得到了一个完整的"读取→处理→保存"采集流水线:

import csv # 第一阶段:从源文件读取 with open("data.csv", "r", encoding="utf-8") as file: content_lines = file.readlines() # 第二阶段:处理数据(这里只做简单的输出确认) first_line = content_lines[0].strip() print("表头内容:", first_line) # 第三阶段:保存到新文件 with open("result.csv", "w", newline="", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow(["来源文件名", "第一行内容"]) writer.writerow(["data.csv", first_line])

这段脚本就是反复强调的"注释先行"的产物。三段流水线各司其职,后面你学了循环结构,可以在第一阶段把它改成"读取一个文件夹下的所有文件",在第二阶段改成"逐行清洗",在第三阶段改成"追加写入多行"。那时候你会发现,所有更复杂的功能,都是在顺序结构这条主干上长出来的。

4. 顺序结构怎么在真实项目中用得更好

4.1 先从"整体流程"拆解到"逐行实现"

写数据采集脚本,最忌讳的是看到什么就写什么。我见过不少新手打开编辑器,先写一句import requests,然后愣十分钟。为什么?因为脑子里没有流程。

我的套路是:先不碰键盘,用三句话描述这个任务。第一句是"我要去哪里拿数据",第二句是"我要从数据里拿走什么",第三句是"拿到之后放哪里"。这三句话落到程序里,正好对应顺序结构的三段代码:准备与请求、解析与提取、保存与输出。

以"采集某个城市的天气状况"为例,流程拆解是:

  • 找到能返回天气数据的公开接口地址
  • 请求接口并把返回的JSON解析出来
  • 提取温度、湿度、天气描述三个字段
  • 把结果打印并保存成文件

然后你在代码里按这个顺序一行一行实现。顺序结构不仅是代码执行方式,更是一种思维方式:把一个大任务拆成一段一段的小步骤,然后一小步一小步地走。这个拆解习惯会伴随你整个技术生涯,越早养成越好。

4.2 让脚本可复用的三个小习惯

数据采集脚本经常要一遍一遍跑,所以顺序结构阶段就应该养成几个习惯。

第一个习惯是加注释。我会把每个步骤的注释写在对应代码上方,例如:

# 请求天气接口 response = requests.get(weather_url) weather_data = response.json()

三个月后再看这脚本,一目了然。不写注释的话,哪怕是你自己写的代码,隔一阵子再读也要花时间回忆。

第二个习惯是使用常量保存固定信息。比如接口地址、文件路径,都建议在脚本顶部先用变量定义好:

source_url = "https://api.example.com/public-data" save_path = "./output/result.csv"

后续要改地址或路径,只改这两行就行,不用满篇找。

第三个习惯是每完成一个步骤就print一下关键结果。别怕print多,调试期多输出能帮你快速定位问题。等到确认没问题了,再逐步删掉多余的print。

这三个习惯在顺序结构时期养成,比到了复杂项目里再改容易得多。

5. 数据采集入门者最容易踩的五个坑

5.1 TypeError: can only concatenate str (not "int") to str

这个报错在初学者里出现频率极高。原因就是print里混了字符串和数字:

count = 5 print("总数量是:" + count)

在Python里,字符串只能和字符串拼接,不能直接和数字拼接。改成下面任意一种都行:

print("总数量是:" + str(count)) print("总数量是:", count)

数据采集场景里更隐蔽的版本是:从文件或接口拿到的数字在内部其实是字符串,直接参与计算就报错。解决办法是转换类型。我给自己定的规矩是:所有外部传入的数据,用之前先确认类型,不确定就print(type(x))。这个动作做多了,你一眼就能看出问题出在哪。

5.2 FileNotFoundError: No such file or directory

这个错误是文件路径不对。新手经常在"当前脚本目录"和工作目录之间犯迷糊。我在本地示例里用的"data.csv"是相对于运行脚本时所在目录的路径,不是脚本文件所在目录。最直接的处理方式是用绝对路径:

file_path = "D:/myproject/data/data.csv"

这里要提醒:Windows路径里的反斜杠要在Python里写成双反斜杠,或者干脆用正斜杠,否则容易触发转义问题。我自己的偏好是永远用正斜杠,少踩转义的坑。

5.3 UnicodeDecodeError和中文乱码

读取CSV或文本文件时,如果文件本身是GBK编码而你又用utf-8去读,就会报UnicodeDecodeError;如果编码不匹配但没报错,打开后则可能是乱码。解决办法是读取时指定和源文件一致的编码:

with open("data.csv", "r", encoding="utf-8") as file:

如果你的文件是Windows常见的中文编码,可以试试:

with open("data.csv", "r", encoding="gbk") as file:

如果还不行,先别急着改,用文本编辑器打开文件看看状态栏显示的编码是什么,再填进去。这个检查动作能省下不少折腾时间。

5.4 请求接口时报错或返回空值

requests.get在网络状况不好或者目标接口拒访时,会抛异常,或者返回一个带错误码的响应。顺序结构时期还没学try/except,但可以先学会看响应状态:

response = requests.get(url) print(response.status_code)

状态码是200一般就是成功了,404说明地址不对,403说明对方拒绝访问。遇到403时,通常需要带符合要求的请求头,最简单的做法是模拟普通浏览器访问,在requests.get里加一个headers参数。我不展开具体规则,但记住一点:访问任何公开接口,先看人家有没有使用说明和使用限制,尊重对方的公开声明,数据只用于个人学习分析,不二次打包传播。

5.5 IndentationError: unexpected indent

IndentationError是缩进错误。虽然顺序结构本身不需要子代码块,但你一旦开始写之后的if、for,缩进就很重要。在顺序结构阶段就要养成统一缩进的习惯:默认用4个空格,不要混用Tab和空格。很多编辑器会提示缩进或自动转换,但如果你在混用,编辑器里的空格和Tab在某些地方看起来一样,程序却会报错。我遇到这种问题最有效的方法是打开编辑器显示空白字符的功能,或者直接把相关代码重新敲一遍。等你能看见Tab和空格的区别了,这类问题一次就能定位。

报错/问题常见原因处理办法
TypeError字符串和数字混用先转类型再拼接或计算
FileNotFoundError路径不对用绝对路径,注意正反斜杠
UnicodeDecodeError编码不一致用源文件一致的encoding参数
请求异常/状态码403地址或参数问题打印status_code,加请求头,遵守使用规则
IndentationError缩进混用统一4空格,不混用Tab

6. 关于顺序结构,我最后说几句实在话

如果只让我给你一条建议,我会说:在学顺序结构这段时间,多写"注释先行"的脚本。别嫌它简单,也别急着跳去研究那些花哨的框架。我在这个阶段养成的最值钱的习惯,就是每个脚本都能清清楚楚说出"第一步干什么、第二步干什么",这个能力在你处理真正大规模采集任务时,比会背任何库的API都管用。

还有一个小技巧:拿一两份真实的CSV文件,或者找一两个公开的、允许访问的数据接口,用我这篇文章里的三段示例反复组合着玩。今天只读取,明天尝试提取不同字段,后天试着自己写文件。整个过程都只用顺序结构,不做任何分支和循环。等你把"拿到数据→处理数据→保存数据"这条链路走顺了,再往分支、循环和函数的方向走,进度会快很多。

数据采集的路很长,但起点就是这看起来不起眼的顺序结构。把地基打稳,后面盖楼才不慌。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询