零基础Python爬虫实战:三步抓取网页数据
在现代软件开发和数据分析中,从网页上自动抓取数据是一项不可或缺的技能。无论你是想收集市场信息、监控价格变化,还是分析用户评论,掌握基本的爬虫技术都能大幅提升效率。不过,对于许多零基础的学习者来说,复杂的理论知识往往令人望而却步。别担心,本教程将采用步骤式教学,带你从零开始,使用Python编写一个简单的爬虫脚本,让你在短短三步内就能获取网页数据。
本教程适合完全没接触过爬虫的读者,工具和代码已尽量简化。你只需要一台能上网的电脑,并安装好Python环境(建议Python 3.7以上版本)。如果你还没有安装Python,请先前往Python官网下载安装,并在安装过程中勾选“Add Python to PATH”。打开终端或命令提示符,输入python --version确认安装成功。
准备工具:除了Python,我们还需要安装两个代码库:requests用于发送网络请求,BeautifulSoup4用于解析HTML页面。打开终端,运行以下命令:
pip install requests beautifulsoup4
如果系统提示“pip”不是内部命令,可以尝试python -m pip install requests beautifulsoup4。安装完成后,我们就可以正式开始第一步。
第一步:发送HTTP请求,获取网页源代码
爬虫的第一步与普通用户访问网页类似:你需要告诉服务器“我想看这个页面”,然后服务器会返回页面的HTML代码。我们用requests库来完成这个任务。
假设我们要抓取一个常见的示例网站“http://books.toscrape.com/”,它是个模拟书店,界面清晰,很适合新手练习。我们要抓取所有书籍的标题和价格。首先,编写一个简单的Python脚本:
import requests
url = "http://books.toscrape.com/"
try:
response = requests.get(url)
response.encoding = 'utf-8' # 设置编码,避免乱码
if response.status_code == 200:
print("请求成功!")
html_content = response.text
# 这里先输出前200个字符看看效果
print(html_content[:200])
else:
print(f"请求失败,状态码:{response.status_code}")
except requests.exceptions.RequestException as e:
print(f"请求异常:{e}")
运行这段代码,如果控制台输出“请求成功!”并显示一段HTML代码,说明你已经成功获取了网页源代码。注意:有的网站会设置反爬机制(如限制User-Agent或IP频率),这属于进阶内容,初学者不必担心。我们的示例网站是开放的。
第二步:解析HTML,提取关键数据
第一步我们拿到了全乱的HTML代码,但我们要的数据在哪些标签里呢?这时就需要BeautifulSoup来“清扫”数据了。打开浏览器的开发者工具(F12),查看网页结构。在示例网站上,每张书卡都被包裹在<article class="product_pod">中,标题在<h3><a>标签里,价格在<p class="price_color">标签里。
我们用BeautifulSoup来提取:
from bs4 import BeautifulSoup
import requests
url = "http://books.toscrape.com/"
response = requests.get(url)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 找到所有书卡
books = soup.find_all('article', class_='product_pod')
for book in books[:5]: # 先打印前5本
title_tag = book.h3.a
title = title_tag.get('title') if title_tag else "无标题"
price_tag = book.find('p', class_='price_color')
price = price_tag.text if price_tag else "无价格"
print(f"书名: {title} | 价格: {price}")
运行后,你会看到类似这样的输出:
书名: A Light in the Attic | 价格: £51.77
书名: Tipping the Velvet | 价格: £53.74
书名: Soumission | 价格: £50.10
书名: Sharp Objects | 价格: £47.82
书名: Sapiens: A Brief History of Humankind | 价格: £54.23
看,数据已被成功提取!核心逻辑很简单:用find_all找出所有符合条件的容器,再用.text或.get()提取具体内容。你也可以使用CSS选择器,如select('.product_pod .price_color'),但find和find_all更适合新手。
第三步:保存数据到CSV文件
仅仅在控制台打印数据是不够的,我们通常需要保存下来以便后续分析。最简单的方式是保存为CSV文件,它可以被Excel或数据处理软件直接打开。在Python中,我们可以用内置的csv模块实现。将以上代码升级:
import csv
import requests
from bs4 import BeautifulSoup
url = "http://books.toscrape.com/"
response = requests.get(url)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
books = soup.find_all('article', class_='product_pod')
data = []
for book in books:
title_tag = book.h3.a
title = title_tag.get('title', "无标题")
price_tag = book.find('p', class_='price_color')
price = price_tag.text.strip() if price_tag else "无价格"
data.append([title, price])
# 保存到CSV文件
with open('books_data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['书名', '价格'])
writer.writerows(data)
print("数据已保存到 books_data.csv 文件中!")
运行脚本,同级目录下会出现一个books_data.csv文件,里面包含你刚刚抓取的所有书籍数据(示例网站有53本书,所以会生成53行)。打开它,数据清晰易读。
进阶提示:处理分页和动态加载
上面的例子只抓取了一页。很多网站有分页,比如点击“下一页”会加载新内容。示例网站的页码结构是page-1.html、page-2.html……你可以通过一个循环,修改URL中的页码数字来抓取所有页。注意设置请求间隔(time.sleep(1)),避免对服务器造成压力。
如果网站数据是通过JavaScript动态加载的(你查看页面源代码时找不到数据),那么requests直接获取的HTML不包含内容。此时需要结合Selenium或请求XHR接口。不过,对于绝大多数静态网站,上面的三步方法已经足够使用。
总结一下:爬虫的本质就是“请求-解析-保存”。本教程的三步方法,你可以应用到任何具有类似结构的网页上。但请记住,爬取数据前要尊重网站的robots.txt规则(在网站域名后加/robots.txt可查看),不要频繁请求导致服务器负载过高,更不要爬取个人隐私信息。学习始终建立在合法、道德的基础上。
