
看到零基础一键爬数据这样的组合很多人第一反应是又要让我背语法、学框架、看一堆抽象概念了吧。其实真不用我自己带过不少完全没写过代码的朋友入门爬虫发现大家卡住的从来不是算法数据结构这种高大上的东西而是连一个能跑的脚本都没见过就跑去啃大部头教程。爬虫本质上就是一件特别具体的事把网页上的数据拿下来整理成自己想要的格式。这篇文章我就按自己实操的习惯来写从环境怎么装、依赖怎么配到一个真正能跑、能出数据的爬虫脚本一步一步带你过一遍。文章里所有代码都是可以直接复制运行的跑通了再回头理解原理你会发现比先啃理论快得多。1. 零基础运行爬虫前先把这套思路装进脑子里1.1 爬虫到底在干什么拿、解、存我给完全没有基础的朋友讲爬虫从来不讲由URL发起HTTP请求获得响应实体这种教科书定义。我一般会打一个比方爬虫就是一个帮你抄笔记的人。你告诉它去哪个书架拿哪本书翻到哪一页把哪一段话抄下来然后按你要求的格式放进笔记本里。对应到技术上就是三件事拿用程序向某个网址发起请求把服务器返回的网页内容通常是HTML、JSON或者图片二进制流拿到本地。这一步在Python里最常用的是requests这个库。解拿到的内容是一堆字符串你要从里面把真正有用的数据挑出来。如果是HTML网页就用解析器比如BeautifulSoup把网页结构拆开如果是JSON接口直接按字典和列表的方式取值就行。存把挑出来的数据保存成你能用的格式比如CSV、Excel或者存进数据库。这一步决定了你爬下来的数据到底能不能被后续分析使用。我见过很多人学爬虫第一个脚本就奔着爬淘宝、爬微博去结果被各种反爬机制打得满头包然后得出爬虫太难的结论。其实把上面这三件事跑通你只需要一个没有任何反爬的公开目标就行。下面要讲的环境搭建和第一个案例都是照着最短路径来设计的你先别管太多原理先把跑通这件事做了。1.2 “能跑”比“懂原理”更重要学习顺序的大坑零基础学爬虫最容易犯的错就是顺序搞反了。我见过连续两周在装环境、选编辑器、配虚拟环境之间反复折腾最后连一个print(hello)都没跑到的人。不是他们笨而是教程铺得太开一会儿讲解释器原理一会儿讲PEP规范一会儿讲包管理器的各种参数信息量过大直接把人劝退。我的建议非常明确第一个目标不是学会而是跑起来。哪怕你完全不懂每行代码在干嘛只要能把别人写好的脚本跑出结果你就在大脑里建立起了这件事我能做成的正反馈后面拆解起来才有动力。实际操作顺序可以这样安排装好Python解释器确认在终端输入python --version能输出版本号。用记事本或者随便一个编辑器写一个最简单的请求脚本目标选一个公开测试接口。跑通脚本看到数据打印出来的瞬间恭喜你你已经有爬虫运行经验了。再回头逐步拆解每一行代码结合报错去理解。很多人不信这个顺序总觉得没学懂之前不该动手。但从我带人的经验来看先跑通再做上面向过程的拆解学习效率至少高一倍。因为你在拆解的时候每个概念都能挂靠到一个你已经见过的实际现象上而不是纯抽象。1.3 软件清单与版本选择别在工具上内耗先给一份我在教学和实际项目中常用的软件清单照着装就行不用纠结太多别的软件/库用途版本建议Python解释器本体3.10 或 3.11 或 3.12 均可不推荐3.9以下的老版本VSCode写代码的编辑器最新稳定版即可requests发起HTTP请求2.28以上beautifulsoup4解析HTML网页4.12以上lxmlBeautifulSoup的解析引擎4.9以上pandas数据整理与导出Excel2.0以上openpyxlpandas导出Excel的引擎3.1以上这里多说一句Python版本的问题。很多新手看到网上一堆教程有的说3.7最好、有的说3.12太新不兼容直接懵了。我的看法是做爬虫和数据分析只要是3.10到3.12之间的版本都行别选那些已经停止维护的老版本。你现在装的版本大概率会影响一年后你要用的库选当前官方还在活跃维护的版本是最稳妥的。2. 一步一步把运行环境搭好5分钟进入能写代码的状态2.1 Windows环境安装Python的实操细节在Windows上装Python最关键的一步不是点击安装而是安装时有没有勾选Add Python to PATH这个选项。如果忘了勾后面你在终端输入python就会提示找不到命令你得手动去配环境变量这一步能劝退不少人。正确流程是进入Python官网找到Downloads页面选择Windows安装包下载后双击运行。注意安装界面第一屏就有Add Python to PATH的复选框一定勾上。然后直接点Install Now就行不用管自定义路径。装完验证一次python --version能输出类似Python 3.11.x就说明解释器已经OK了。如果提示找不到命令大概率是PATH没勾上重新安装一次或者手动加到环境变量即可。macOS用户一般自带Python 2.x但你大概率需要单独装3.x版本建议用官网安装包不要用系统自带的老版本。Linux用户可以用包管理器安装例如sudo apt install python3 python3-pip。2.2 在VSCode里配置Python环境避开这些鬼打墙VSCode本身只是个编辑器要让它能运行Python脚本需要装官方的Python扩展。打开VSCode后在扩展商店搜索Python装那个发布方是Microsoft的插件。装完之后打开一个文件夹把.py文件放进去然后用快捷键CtrlShiftP执行Python: Select Interpreter选你已经装好的那个Python版本。这里面最常遇到的坑是明明终端里跑得好好的VSCode里一按运行就提示ModuleNotFoundError或者选择了错误的解释器。原因就是VSCode默认使用了自己选中的解释器而不是你终端里PATH指向的那个。解决办法就是上面说的手动选一下解释器路径就解决了。配置完解释器运行脚本有两种方式直接点VSCode右上角的三角形运行按钮这种方式会用当前选中的解释器直接跑。在VSCode底部打开终端输入python 文件名.py运行。我个人更喜欢用终端的方式因为输出信息完整、报错看得清楚也更接近真实生产环境的使用习惯。2.3 装库遇到网络问题的实用解法换源不是玄学跑爬虫离不开安装第三方库比如pip install requests。但国内用户直接用默认的PyPI源经常会遇到一个又一个的超时重试非常折磨。这跟你的网络环境有关解决办法就是换用国内镜像源。用一个我自己常用的方式在终端执行pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple如果你不想每次安装都加这一长串可以一次性配置成默认源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple配完之后再安装库就快多了。这里要强调一个概念你安装的库比如requests、beautifulsoup4都不属于Python自带的“标准库”它们是别人写好、通过pip分发的“第三方库”。爬虫绝大多数功能要靠这些第三方库来实现所以能顺利安装第三方库是非常基础的一项能力。3. 第一个能跑的爬虫从公开接口到Excel表格3.1 先跑最简单的请求验证环境通没通环境搭好之后不要着急去爬什么复杂网站。先用一个公开测试接口把整个拿数据的过程跑通。我做教学时最常用的一个目标就是jsonplaceholder这个公开服务它专门为开发者提供假数据接口不存在任何反爬非常适合第一跑。新建一个demo.py文件写入下面这段代码import requests url https://jsonplaceholder.typicode.com/posts/1 resp requests.get(url) print(resp.status_code) print(resp.text)保存后在终端运行python demo.py正常情况下你会先看到200然后看到一段JSON字符串。200在HTTP协议里表示服务器一切正常你要的东西我给你了。这表示你至少完成了爬虫的拿这一步。注意这里没有做任何编码处理如果返回的内容里出现了乱码先别慌后面我会专门讲。很多初学者第一次跑通这个脚本时的反应是原来爬虫就这么简单是的本质上就是这么简单。复杂的从来不是请求本身而是你面对不同网站时的应对策略。3.2 解析数据从JSON里提取字段resp.text是一段长字符串看着费劲但是如果你知道它是一个JSON格式的接口就可以把字符串转换成Python里的字典和列表结构再用键去取对应的值。比如上面那个接口返回的内容长这样{ userId: 1, id: 1, title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit, body: quia et suscipit ... }在Python里可以用resp.json()方法直接得到这个字典然后像查词典一样取值import requests url https://jsonplaceholder.typicode.com/posts/1 resp requests.get(url) data resp.json() print(标题是, data[title]) print(内容是, data[body])运行之后终端只输出标题和正文。这一步就是解你从一整段数据里提取出了自己真正关心的小部分。但如果想要多条数据比如把/posts下的100条内容都拿下来就需要循环和列表推导式了import requests url https://jsonplaceholder.typicode.com/posts resp requests.get(url) data_list resp.json() print(总共有, len(data_list), 条数据) for item in data_list[:3]: print(item[id], item[title])这里的data_list是一个列表里面每个元素都是字典。遍历列表把每条数据里的id和title取出来。到这一步你已经完成了拿和解下面就可以谈存了。3.3 把数据写进CSV和Excel两条路都能走保存是爬虫最容易被忽视却极其重要的一步。我之前有过一次很丢人的经历爬了大半天数据跑完脚本发现没写保存逻辑全部数据只存在于终端输出里关掉窗口就全没了。从那以后我每次爬虫都会先把保存方案想好。如果你是刚开始学推荐先试Python标准库里的csv模块不需要额外安装任何库。思路是先打开一个CSV文件用csv.writer创建写入器然后把表头和每行数据逐个写进去。import csv import requests url https://jsonplaceholder.typicode.com/posts resp requests.get(url) data_list resp.json() with open(posts.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([id, title, body]) for item in data_list: writer.writerow([item[id], item[title], item[body]])注意这里用utf-8-sig编码而不是直接utf-8是为了让CSV文件用Excel打开时中文不乱码。这个小细节是我踩过坑才记住的直接用utf-8保存的CSV在Excel里打开容易显示成乱码改成utf-8-sig就正常了。如果你的数据要做后续分析或者希望输出更专业可以用pandas直接导出Excelimport pandas as pd import requests url https://jsonplaceholder.typicode.com/posts resp requests.get(url) data_list resp.json() df pd.DataFrame(data_list) df.to_excel(posts.xlsx, indexFalse)pandas是数据分析领域最常用的库它把数据整理成表格结构DataFrame然后一行代码导出Excel。这里要求你已经用pip装好了pandas和openpyxl。3.4 把整个流程连起来一个完整可复制的案例前面几步是分开拆解的现在我把拿、解、存三件事拼成一个完整脚本。这个脚本可以直接复制运行目标是抓取公开接口的数据保存成Excel文件import pandas as pd import requests # 1. 发起请求 url https://jsonplaceholder.typicode.com/posts resp requests.get(url) resp.raise_for_status() # 2. 解析数据 data_list resp.json() # 3. 数据整理与保存 df pd.DataFrame(data_list) df.to_excel(posts.xlsx, indexFalse) print(保存完成共, len(df), 条数据)运行完之后你会在当前目录看到posts.xlsx这个文件打开它就是一个规整的表格。这就是一个一键爬数据的最小闭环。我还建议你在这个脚本基础上做个很简单的改造把url换成其他公开接口比如https://jsonplaceholder.typicode.com/comments或者/albums你会发现整个流程不需要任何改动只需要换一个网址。这就是把拿、解、存拆开的好处——结构清晰之后换目标网站只是换参数的事。很多人想象中的写爬虫脚本其实就是做这个参数替换和结构适配的活。4. 当你真想爬一个网站时这些坑会让你当场崩溃4.1 第一道坎网页内容和代码里看到的不一样你在浏览器里打开一个网站看到的是数据整齐地排在页面里。然后你把同样的网址放到requests里请求结果返回的HTML里根本找不到那些数据。这种情况极大概率是你请求到的只是一层空壳真正的数据是浏览器执行了JavaScript之后才动态加载出来的。打个比方一个网页就像一家餐厅浏览器进去之后可以看菜单点菜菜品都是现场炒的动态加载而requests是个只会在门口排队的外卖员你让它去拿已经出锅的菜结果门口只给你一张菜单页面。遇到这种情况你有几条路可选找到这个网页背后真正加载数据的接口。按F12打开开发者工具切到Network网络标签页刷新页面然后筛选XHR或Fetch类型的请求里面往往能看到一个返回JSON的接口地址那个才是你该爬的目标。用selenium或playwright这类浏览器自动化工具让真实浏览器去渲染页面再从中提取数据。这个方案更重但对付复杂动态页面很有效。用requests模拟浏览器发送的请求头包括User-Agent、Referer等看能不能直接访问那个JSON接口。我在实际项目里优先用的其实是第一种方法。先花时间分析出真实的数据接口后面整个爬虫都会非常轻量高效。直接上selenium的结局往往是脚本慢、资源占用高、维护成本大。4.2 第二道坎服务器给你返回403或418当你用requests直接访问一个正经网站时经常会被服务器拒绝常见的状态码是403Forbidden或418Im a teapot。这通常是因为服务器识别出了你的请求不是来自正常浏览器。解决这个问题的第一招就是设置请求头尤其是User-Agent。浏览器在发起请求时会带上这个字段告诉服务器我是Chrome浏览器。而Python的requests默认的User-Agent是一串非常明显的库标识服务器一看就知道不是真人。可以这么加请求头import requests headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders)我半开玩笑地说这个User-Agent字符串都快被爬虫界背下来了。它唯一的任务就是让服务器以为你是一个真实用户在访问。很多网站只要加上这个请求头403的问题就直接解决了。如果加了User-Agent还是被拒就需要进一步补充Referer、Origin等字段。建议你在浏览器开发者工具里找到具体的请求右键复制为cURL再转换成Python代码这样能最大限度复刻浏览器的请求特征。用命令行的方式做初步调试比反复改代码要快得多。4.3 第三道坎乱码、超时、连接重置在爬虫报错清单里乱码、超时、连接被重置是出现频率最高的三大怪。先说乱码。乱码的根源是编码方式不匹配。网页本身可能用UTF-8、GBK或者GB2312编码而Python拿到的是一堆字节流如果不告诉它怎么解码就会按默认方式处理于是满屏的锟斤拷。常见的解决姿势是import requests resp requests.get(url) resp.encoding utf-8 # 根据页面实际情况设置 print(resp.text)有时候还会配合判断实际编码如果发现设置了utf-8还是乱码可以试试gbk。快速定位的方式是查看网页源码中meta charset...那一行或者直接观察乱码字符的规律。我的一个经验是如果乱码字符都是一些说不清的生僻字组合通常就是GBK被当成UTF-8解码了。再说超时。requests.get()默认不会自动超时也就是服务器一直不返回你的程序就会一直卡住。写爬虫时设置超时是一个好习惯这样至少不会让整个任务挂死resp requests.get(url, headersheaders, timeout10)timeout的单位是秒。这个配置就是告诉requests10秒钟之内服务器没反应直接抛异常别傻等。最后说连接重置。这个往往和网络环境、代理设置、服务器临时限制有关。遇到这类问题先别急着怀疑自己代码用浏览器访问一下同一个网址看是不是服务器本身出问题了。如果自己的代码没问题最基础的对策是加重试机制捕获异常等待几秒重新请求。比较优雅的做法是用retrying这个库或者tenacity但我个人更倾向于自己写个简单的for循环重试逻辑透明、不引入额外依赖。5. 数据存储、更新方案与长期维护建议5.1 零基础的本地存储首选SQLite还是Excel在上面的第一个完整案例里我们用Excel保存了数据。但如果你要长期爬、增量爬就会发现Excel不太够用文件一大会卡、多个字段难以管理、多个表之间联动也麻烦。这时候我建议你考虑SQLite数据库。SQLite是Python内置支持的轻量级数据库不需要安装任何额外的服务。它本质上就是一个本地文件但你可以在里面建表、查询、去重就跟正经关系型数据库一样。用Python内置的sqlite3模块就可以操作适合零基础直接上手import sqlite3 conn sqlite3.connect(my_data.db) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY, title TEXT, body TEXT ) ) conn.commit() conn.close()这一段代码创建了一个数据库文件my_data.db里面建了一张posts表。之后把爬到的数据插入进去思路和你往Excel里写是一样的只不过用的是SQL语句。我之所以给零基础读者推荐SQLite是因为它足够简单又有后期扩展空间。你不需要像MySQL或PostgreSQL那样配置一套环境也不用担心数据量大以后文件打不开。等以后需要多人共享、多机写入再迁移到正式数据库就行。5.2 用SQLAlchemy管理爬虫数据结构化程度更高如果你已经掌握了sqlite3再往深走一步可以接触一下SQLAlchemy这个ORM对象关系映射工具。所谓ORM通俗讲就是让你不用写SQL语句直接用Python类和对象来操作数据库表。比如你定义一个Post类每个属性对应表里的一个字段然后通过创建对象、会话提交的方式写入数据from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker Base declarative_base() class Post(Base): __tablename__ posts id Column(Integer, primary_keyTrue) title Column(String) body Column(String) engine create_engine(sqlite:///my_orm.db) Base.metadata.create_all(engine) Session sessionmaker(bindengine) session Session() new_post Post(id999, title测试标题, body测试内容) session.add(new_post) session.commit() session.close()不用纠结背语法你能感觉到区别就好用sqlite3是你主动写SQL和数据库打交道用SQLAlchemy是你定义Python类、然后框架帮你翻译成SQL。对于爬虫项目来说SQLAlchemy尤其适合数据需要频繁更新、字段比较多、后续可能会换数据库的场景。不过我必须提醒一句零基础阶段不要一上来就学SQLAlchemy先用pandas和sqlite3把存储的基础跑通等你已经积累了几次用代码存数据的体感再学ORM会轻松很多。跳过基础直接上框架容易陷入代码全看不懂、换个人也不会改的困境。5.3 更新策略全量爬 vs 增量爬实际爬虫项目里很少只跑一次就完事。隔一天、隔一周再爬的时候你就得考虑这次是全量爬还是增量爬。全量爬最简单不管数据库里有没有全部重新爬一遍覆盖旧数据。缺点是数据量大时浪费时间和带宽。增量爬则更聪明只爬上一次记录之后新增或变化的数据。常见做法是依赖数据里的时间字段或者唯一ID比如请求接口时传一个updated_at或者时间范围参数只取最近一天的数据。先查询数据库里已有的ID集合新爬到的数据如果ID已经存在就跳过不存在才插入。这种增量思路在爬动态变化的数据比如新闻、排名、价格时极其有用。我自己的经验是哪怕一开始数据量不大也尽量在第一次写爬虫时就把如何去重考虑进去哪怕只用一个简单的Excel判断也行。因为如果数据一旦重复积累起来后面清洗的工作量会翻倍。6. 合法合规与职业建议爬虫不是黑客技术6.1 能爬和不能爬的边界心里要有数说了这么多技术实现最后必须提一嘴合规问题。爬虫本身是中性技术但它用在哪里、目标是什么直接影响它合不合法。作为初学者我建议一开始就在几个安全范围内练习练习类型建议公开测试接口无风险适合练手政府、机构公开数据注意确认是否有明确的开放授权普通网站公开页面先阅读robots.txt控制请求频率需要登录才能看到的数据不要尝试最容易触雷个人隐私信息坚决不碰付费内容、收费接口坚决不碰robots.txt是网站所有者放在服务器上的声明文件告诉爬虫哪些路径允许访问、哪些不允许。访问一个网站你可以在网址后加上/robots.txt来查看比如https://example.com/robots.txt。虽然它只是一个声明没有强制力但遵守它是基本素养。另一个重要原则是降低请求频率。你爬得越快对目标服务器造成的压力越大。服务器异常缓慢甚至宕机对你、对其他用户、对网站运营者都是伤害。我个人的习惯是绝大多数公开网站请求间隔至少在3到5秒以上数据量大时再加随机延迟。6.2 从爬虫练手到真正做项目不只能爬到数据这么简单爬虫的终点很多时候不是爬到数据而是数据能产生价值。我自己最早的爬虫项目就只关注是否爬下来了结果数据到手里根本不知道怎么用爬了一堆数字却毫无分析价值。后来才意识到一个完整的爬虫项目应该包括明确要爬的字段、清洗规则、存储结构、分析目标、可视化展示这五个环节。所以在跑通上面的案例之后我建议你按这个路线继续深入找一个你真正关心、且允许爬取的公开数据源比如公开气象数据、公开书籍信息、公开商品价格数据。先做数据清洗去掉空值、去重、格式统一。用pandas做简单统计例如看数据分布、计算汇总指标。用matplotlib或pyecharts做可视化把你爬到的数据变成能讲故事的图表。这么一整条链路走完你不只是会运行爬虫而是具备了用数据解决实际问题的能力。我从一开始就刻意避免让自己只停留在能爬的阶段因为只掌握爬这一环的职业竞争力有限真正值钱的是你对数据的处理能力和业务理解。另外想分享一个小习惯时刻记录你的爬虫日志。不是为了给别人看而是为了自己排查问题。我早期有一次跑了几个小时的爬虫突然报错由于没记录日志完全不知道是从哪条数据开始出错的只能从头排查非常浪费时间。后来在每个关键步骤都打印日志配合时间戳和数量统计问题定位起来快得多。最后再给一个建议如果你想通过做爬虫项目提高自己不要总挑难啃的网站练手。难度太高容易消耗热情选一些数据量适中、没有复杂加密的目标把请求-解析-存储-分析整条链路跑熟比用各种骚操作攻克一个高难网站有用得多。技术只是手段能稳定复用地跑出有价值的数据才是你做爬虫这件事真正可持续的方向。