ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数据采集入门:Python顺序结构核心解析与三个可运行示例

数据采集入门:Python顺序结构核心解析与三个可运行示例 前几天一个学数据采集的同学跟我说他看教程翻到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 * quantityprint(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, encodingutf-8) as file: # 第二步读取全部内容 content file.read() # 第三步输出内容 print(content)为什么用with open而不是file open(...)因为with会在代码块执行完后自动关闭文件不会打开一个忘关的文件句柄。文件句柄泄漏是新手写采集脚本时容易忽略的问题在长期运行的脚本里每漏一个就占一个资源积累多了会导致程序异常。如果你想按行处理可以这样with open(data.csv, r, encodingutf-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, encodingutf-8) as file: # 第三步创建写入器 writer csv.writer(file) # 第四步写入表头 writer.writerow([名称, 数量, 单价]) # 第五步写入数据行 writer.writerow(row_data)newline这个参数很多人第一次会忽视。如果不加在Windows上写出的CSV会在每行后面多出一个空行很烦人。encodingutf-8是为了避免中文乱码。这里的每一步都有前后关系先有数据才能打开文件写入必须先创建写入器才能调用writerow写一行。任何一步顺序颠倒脚本都会报错或者写错内容。学习顺序结构最重要的就是建立这种先后顺序的敏感度。3.4 把三个示例串成一条完整流水线把上面三个示例首尾相接就得到了一个完整的读取→处理→保存采集流水线import csv # 第一阶段从源文件读取 with open(data.csv, r, encodingutf-8) as file: content_lines file.readlines() # 第二阶段处理数据这里只做简单的输出确认 first_line content_lines[0].strip() print(表头内容, first_line) # 第三阶段保存到新文件 with open(result.csv, w, newline, encodingutf-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, encodingutf-8) as file:如果你的文件是Windows常见的中文编码可以试试with open(data.csv, r, encodinggbk) 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 indentIndentationError是缩进错误。虽然顺序结构本身不需要子代码块但你一旦开始写之后的if、for缩进就很重要。在顺序结构阶段就要养成统一缩进的习惯默认用4个空格不要混用Tab和空格。很多编辑器会提示缩进或自动转换但如果你在混用编辑器里的空格和Tab在某些地方看起来一样程序却会报错。我遇到这种问题最有效的方法是打开编辑器显示空白字符的功能或者直接把相关代码重新敲一遍。等你能看见Tab和空格的区别了这类问题一次就能定位。报错/问题常见原因处理办法TypeError字符串和数字混用先转类型再拼接或计算FileNotFoundError路径不对用绝对路径注意正反斜杠UnicodeDecodeError编码不一致用源文件一致的encoding参数请求异常/状态码403地址或参数问题打印status_code加请求头遵守使用规则IndentationError缩进混用统一4空格不混用Tab6. 关于顺序结构我最后说几句实在话如果只让我给你一条建议我会说在学顺序结构这段时间多写注释先行的脚本。别嫌它简单也别急着跳去研究那些花哨的框架。我在这个阶段养成的最值钱的习惯就是每个脚本都能清清楚楚说出第一步干什么、第二步干什么这个能力在你处理真正大规模采集任务时比会背任何库的API都管用。还有一个小技巧拿一两份真实的CSV文件或者找一两个公开的、允许访问的数据接口用我这篇文章里的三段示例反复组合着玩。今天只读取明天尝试提取不同字段后天试着自己写文件。整个过程都只用顺序结构不做任何分支和循环。等你把拿到数据→处理数据→保存数据这条链路走顺了再往分支、循环和函数的方向走进度会快很多。数据采集的路很长但起点就是这看起来不起眼的顺序结构。把地基打稳后面盖楼才不慌。
返回列表