Python爬虫入门实战:从环境搭建到数据存储全流程
Python爬虫是很多新手接触Python以后第一个想学的方向原因很简单它能立刻见效把网页上的标题、链接、图片、价格、文章正文抓下来。这篇文章不要求你有多深的编程基础我会按一条最容易走通的路来写装环境、发请求、解析页面、存数据最后再把常见问题一起讲掉。整套走完你不仅能跑通第一个爬虫还能理解批量任务真正要踩的坑在哪里。下面按实际落地顺序拆一遍。1. 先搞清楚爬虫到底能做什么哪些不能做1.1 爬虫的本质程序替你访问网页并提取数据爬虫不是魔法它做的事和你手动打开浏览器、复制内容差不多。差别在于程序可以一次访问几百几千个页面并按照规则把需要的信息提取、保存、汇总。爬虫常用的分类有三种你在项目里会经常听到批量型爬虫一次性把一批页面的数据抓下来适合做数据分析和离线归档。增量型爬虫每隔一段时间只抓新增或变化的内容适合新闻监控、价格跟踪、列表同步。垂直型爬虫只针对某个特定行业或特定网站做深度采集比如只抓技术博客、只抓招聘信息。新手入门时不用急着区分得太细。先学会单页面抓取再扩展到列表页最后再考虑批量任务和定期更新。1.2 合规边界先看协议再谈技术写爬虫之前先养成一个习惯看目标网站的robots.txt、使用条款和版权声明。robots.txt是网站对爬虫的访问许可说明虽然它不是法律但能帮你判断网站是否允许被程序采集。合规使用大概有这几条底线不抓取需要登录才能访问的非公开数据。不抓取个人隐私信息包括手机号、身份证、住址、聊天记录。不抓取会员专属内容、付费内容。不绕过验证码、不破解加密接口、不伪造身份。控制请求频率不要对网站造成压力。商业用途的数据采集最好先获得授权。我见过不少初学者问“抖音爬虫怎么做”“小红书爬虫怎么绕过限制”。这类问题往往涉及平台反爬、账号数据和用户隐私不是入门教程应该碰的方向。做一个学习型爬虫完全可以用公开示例网站、新闻列表、技术博客这些正当场景来练习。注意爬虫能力本身是中立的但滥用它可能带来法律风险。学会写爬虫之后更要学会判断“这个数据我该不该抓”。1.3 新手最常见的几个误解第一个误解爬虫就是复制粘贴。不对。爬虫需要处理请求、解析、编码、存储、异常重试越往后越像一个小工程。第二个误解爬虫一定要破解验证码。不需要。入门阶段选公开数据不选有强验证码的网站。破解验证码本身就是高风险行为不应该出现在学习路径里。第三个误解必须准备大量代理IP。没那回事。初学阶段一个普通IP加合理频率就够了。等你真的需要跑大规模任务再考虑分布式和代理策略。先把这三个误区放下后面会顺畅很多。2. 装环境这一步做完什么才算真装好了2.1 安装Python解释器如果你用的是Windows去Python官网下载稳定版安装包即可。安装时有一个关键步骤勾选“Add Python to PATH”。这一步很多人漏掉结果后面在命令行里输入python会提示找不到命令。macOS 一般自带Python 3不过自带版本可能偏旧。建议用brew install python3或者直接官网安装器。Linux 下可以用包管理器安装比如 Ubuntu 用apt install python3 python3-pip。装完之后在命令行里验证python --version如果输出版本号说明解释器已经可用。Windows 上有些环境会要求用py --version也正常。这个细节不是坑是系统和Shell配置差异。2.2 pip和第三方库先学会装库爬虫需要装第三方库最常用的是requests、beautifulsoup4、lxml。pip是Python的包管理工具安装命令很简单pip install requests如果想提高国内下载速度可以指定镜像源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests我一般建议把requests、beautifulsoup4、lxml一次装齐pip install requests beautifulsoup4 lxml装完可以用pip list查看已安装的包。经常有人问“库装到哪去了”你用pip show requests就能看到路径。理解这个路径对后面排查环境问题很有帮助。2.3 VSCode和Python解释器选择编辑器方面新手最适合VSCode。它免费、插件生态好写Python体验比IDLE好太多。安装VSCode之后再装一个官方Python扩展。第一次打开Python文件时用CtrlShiftP打开命令面板输入 “Python: Select Interpreter”选择刚才安装的Python版本。这个步骤最容易被忽略一旦解释器选错代码可能报“模块找不到”。验证环境是否OK可以新建一个文件写一行print(hello crawler)能运行成功说明环境已经通顺。接下来再写真正的爬虫。3. 第一个爬虫用 requests 把网页内容拉下来3.1 最小案例请求一个公开页面requests是Python里最友好的HTTP请求库。它封装了底层细节写起来像读中文。来看一个最小案例import requests url https://example.com resp requests.get(url, timeout10) print(resp.status_code) print(resp.text[:500])resp.status_code是HTTP状态码200表示正常。resp.text是页面文本内容这里只取前500个字符预览。这里有个容易出错的地方如果不写timeout程序可能一直挂在等待响应的状态。网络波动时没有超时限制会导致脚本卡死。所以每次请求都建议带上timeout。3.2 请求头和User-Agent让服务端知道你是一个正常访客服务器会通过User-Agent判断访问者是谁。用程序默认的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(https://example.com, headersheaders, timeout10) print(resp.status_code) print(resp.headers.get(Content-Type))这一段主要是模拟正常浏览器访问降低被拒绝的概率。但要注意设置User-Agent的目的是让请求更规范不是让你伪装成真人去做违规操作。合理频率和公开数据才是安全前提。3.3 编码问题中文乱码的根源很多新手在抓取中文网页时遇到乱码原因90%是编码设置不对。网页可能用UTF-8也可能用GBKrequests不一定能自动判断准确。处理方法有两种resp.encoding resp.apparent_encoding或者手动指定已知编码resp.encoding utf-8apparent_encoding是chardet库根据字节内容推断出的编码一般够用。看到乱码时先做两件事查看网页源码里meta charset...的声明再在代码里对应设置resp.encoding。4. 从HTML里提取数据用什么工具最合适4.1 先学会看HTML结构提取数据之前先在浏览器里打开目标页面右键“检查”或者“查看网页源代码”找到你要的数据在哪个标签里。比如新闻标题可能在h2 classnews-title里链接在a href...里图片在img src...里。不要上来就写代码先花几分钟观察页面结构。选择器写得准后面的代码才会稳。4.2 正则表达式小巧但容易写错正则适合提取有明显模式的文本比如邮箱、时间、编号。示例import re titles re.findall(rh2(.*?)/h2, html, re.S) print(titles)这段代码会把所有h2标签里的内容找出来。re.S让.可以匹配换行避免标题跨行时漏掉。正则在简单场景下很好用但HTML结构复杂时容易误匹配。比如标签嵌套、属性里包含尖括号都会让正则出错。所以我更推荐把它用在“提取纯文本中的特定模式”上而不是解析整个网页结构。4.3 BeautifulSoup新手上手最快的解析库BeautifulSoup可以把HTML解析成对象然后像查字典一样提取内容from bs4 import BeautifulSoup soup BeautifulSoup(html, html.parser) items soup.find_all(div, class_news-item) for item in items: title item.find(h2).text link item.find(a)[href] print(title, link)find_all返回所有匹配标签find返回第一个。.text提取标签内文本[href]提取属性值。html.parser是Python自带解析器不需要额外安装。如果解析复杂页面遇到问题可以换成lxml速度更快、容错更好soup BeautifulSoup(html, lxml)唯一的坑是lxml依赖系统编译库有些环境下装不上。如果安装失败退回html.parser一样能用。4.4 XPath和lxml适合复杂层级XPath是一种路径语言写起来像目录路径适合定位嵌套很深的内容from lxml import html doc html.fromstring(page_text) items doc.xpath(//div[contains(class, news-item)]) for item in items: title item.xpath(.//h2/text())[0] link item.xpath(.//a/href)[0] print(title, link)//表示相对路径查找.//表示从当前节点往下找text()取文本href取属性。有人问“BeautifulSoup和XPath哪个好”。我的建议新手先用BeautifulSoup等需要写复杂定位逻辑时再换XPath。两个都别回避实际项目里可能混合用。5. 动态页面和接口数据按这个顺序处理5.1 先看数据是不是藏在Ajax接口里有些网页直接打开看到的内容并不在HTML源码里而是通过JavaScript异步请求接口拿到的。这时你再抓HTML会发现里面是空的。处理思路不是立刻上浏览器自动化而是先打开浏览器开发者工具切到Network面板刷新页面找到返回JSON数据的接口。这个接口往往有一个类似api/data?page1的地址。找到接口后直接用requests请求它import requests api https://example.com/api/data?page1 resp requests.get(api, headersheaders, timeout10) data resp.json() print(data[list])resp.json()会把JSON字符串转成Python字典或列表处理起来非常方便。这个方式比Selenium快得多资源占用也低。能走接口就优先走接口。5.2 Session和Cookie保持登录状态如果目标页面部分信息需要登录后才能看到你就需要先登录再带着登录状态访问数据页。requests.Session可以帮你保持Cookies requests.Session() s.headers.update(headers) login_url https://example.com/login payload {username: your_account, password: your_password} s.post(login_url, datapayload, timeout10) resp s.get(https://example.com/profile, timeout10) print(resp.text)用Session的好处是同一个Session对象会保存Cookie后续请求自动带上。登录操作本身要遵守网站条款只访问你有权查看的数据。不要用Session去批量获取他人隐私或会员数据。5.3 实在要渲染浏览器再考虑Selenium有些页面数据完全靠JavaScript动态渲染接口又加了很多加密参数这时候才用得上浏览器自动化工具。最简单的示例from selenium import webdriver driver webdriver.Chrome() driver.get(https://example.com) html driver.page_source driver.quit() print(html[:500])Selenium会启动一个真实浏览器所以页面里所有脚本都会执行。代价是速度慢、内存占用高、并发能力差。能用接口解决的场景我基本不会用Selenium。建议把Selenium当成兜底方案。先查Network再找接口接口不行再考虑浏览器渲染。这样路径最短也最稳定。6. 数据存下来才算是真正完成一个爬虫6.1 为什么不能只print输出新手最常见的问题是爬下来的数据只在控制台打印一遍关了窗口就没了。数据量小时问题不大数据一多就一定要想办法存储。存储方式选哪种取决于后续怎么用分析时存CSV或Excel方便打开看。程序对接时存JSON结构清晰。长期管理和增量更新存SQLite或MySQL。6.2 CSV、Excel、JSON、SQLite各有各的用法写CSV用Python内置的csv模块注意编码用utf-8-sig否则Excel打开中文会乱码import csv rows [ {title: 标题一, link: https://example.com/1}, {title: 标题二, link: https://example.com/2}, ] with open(news.csv, w, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnames[title, link]) writer.writeheader() writer.writerows(rows)写Excel用openpyxl或者pandas。如果你熟悉pandas可以一步完成import pandas as pd df pd.DataFrame(rows) df.to_excel(news.xlsx, indexFalse)写JSON非常简单import json with open(news.json, w, encodingutf-8) as f: json.dump(rows, f, ensure_asciiFalse, indent2)如果想做增量更新建议用SQLite它是Python内置支持的轻量数据库不需要额外起服务import sqlite3 conn sqlite3.connect(news.db) cur conn.cursor() cur.execute( CREATE TABLE IF NOT EXISTS news ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, link TEXT UNIQUE ) ) cur.executemany( INSERT OR IGNORE INTO news (title, link) VALUES (?, ?), [(r[title], r[link]) for r in rows] ) conn.commit() conn.close()表里给link加唯一约束重复抓取时用INSERT OR IGNORE跳过已存在数据这是最简单的一种去重方案。6.3 批量任务要提前想清楚三件事跑批量任务之前不要急着开循环。先把三件事想清楚第一件输入列表。要抓哪些URL放在一个文本文件或列表里保证每次运行可以重新读取。不要把URL写死在业务代码中间。第二件失败重试和日志。单条失败不能导致整个脚本中断。遇到临时网络问题重试两三次连续失败记录到日志里回头再查。from time import sleep for url in url_list: for attempt in range(3): try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() break except Exception as e: print(f第{attempt 1}次请求失败: {url}, 错误: {e}) sleep(2) else: print(f最终失败: {url})第三件输出命名。批量抓取图片、文件时输出文件名不能重复。按页面序号_原始文件名或时间戳_内容标识的方式命名避免覆盖。再补充一点批量任务一定要加延时。请求太快容易给服务器压力也容易被限制。一般time.sleep(1)到3是相对稳妥的节奏。不要抱着“越快越好”的心态写并发入门阶段先保证稳定再讨论速度。7. 常见报错和排查顺序7.1 请求阶段先看状态码再看网络403是很多初学者第一个遇到的报错。它表示服务器拒绝了请求。处理思路是携带合理的User-Agent、Referer降低请求频率确认目标数据是否公开。429是请求太频繁。这时候加延时最有效不要急着换代理。超时是网络问题居多。先检查本地网络能否访问目标站点再检查timeout参数是否设置得太小。SSL证书报错时先确认是不是目标站点证书本身的问题。verifyFalse确实能绕过验证但不建议随便用这会带来安全隐患。7.2 解析阶段先确认HTML到底长什么样解析结果为空时第一个动作不是改选择器而是把抓下来的HTML存到本地文件手动查看结构。with open(page.html, w, encodingutf-8) as f: f.write(resp.text)很多时候你会发现页面的内容是通过JavaScript动态渲染的HTML源码里根本没有目标数据。那就要回到第5章说的思路去Network里找接口。还有一种情况是页面结构改版了选择器失效。这时候用本地检查器重新定位元素更新选择器即可。爬虫代码不要一次写太长把“抓取”“解析”“存储”拆成函数页面改版时只需要改其中一小块。7.3 项目卡住、速度慢、数据重复怎么办任务卡住时先看控制台日志和输出目录。不要立刻终止脚本先确认它到底停在哪个URL、哪一步。如果脚本没有任何日志说明你一开始就少写了日志这是工程意识问题。速度慢不一定是代码效率低可能是延时设得太多。想区分原因就先记录单条请求耗时再用小样本跑一遍测量整体耗时决定要不要调并发。数据重复多半是去重逻辑不到位。解决方式用唯一键去重比如文章URL、内容ID、文件Hash。SQLite的UNIQUE约束配合INSERT OR IGNORE是最省事的入门方案。7.4 最后的提醒把学习用途和生产用途分开学习爬虫和部署爬虫是两回事。学习阶段公开示例网站、技术文档站点、自己搭建的测试页面都是好目标。生产环境里任何数据采集都要经过授权、遵守协议、评估影响。我建议你练手的时候优先选这些方向抓取公开的天气数据、抓取开源项目的发布列表、抓取技术博客文章标题、抓取公开API返回的数据。这些场景风险低、结构清晰、适合打磨技术。爬虫的核心能力不是花哨的绕过技巧而是请求、解析、存储、重试、日志这些基本功。把这些基本功练扎实遇到99%的采集需求都能应付。踩过几次之后你会发现很多问题不是工具能力不够而是前置环境和输入材料没有处理干净。所以每一次写爬虫都按“确认数据是否公开 - 检查页面结构 - 先抓单页 - 再跑批量 - 最后落库”的顺序来。这个顺序被验证过很多次新手照着走可以少走很多弯路。

相关新闻

最新新闻

日新闻

周新闻

月新闻