引言:当互联网变成你的数据库
互联网是一个巨大的信息宝库。新闻、商品价格、天气预报、学术论文、社交媒体动态…几乎所有数据都以网页的形式存在。如果我们能用程序自动地从这些网页中抓取(“爬取”)结构化信息,就相当于拥有了一个取之不竭的数据库。这就是网络爬虫的魅力所在。
对于爬取静态网页(即网页内容在服务器端已经生成好,不需要浏览器执行JavaScript来渲染),Python提供了两个简单而强大的库,它们的组合被誉为爬虫入门的“黄金搭档”:
- Requests: 一个优雅而简单的HTTP库,它能让你像人类一样轻松地发送HTTP请求,获取网页的HTML源代码。它的口号是“为人类准备的HTTP”。
- Beautiful Soup: 一个专门用于从HTML和XML文件中提取数据的库。它能将复杂的HTML文档转换成一个易于遍历和搜索的Python对象树,让你能用简单的方式定位和提取任何你需要的信息。
步骤1:安装Requests和Beautiful Soup
pip install requests beautifulsoup4
beautifulsoup4
是库的包名。同时,为了能解析HTML,我们还需要一个解析器,lxml
是性能最好、最常用的一个。
pip install lxml
步骤2:使用Requests获取网页内容
爬虫的第一步,是模拟浏览器向目标网站发送一个请求,获取返回的HTML页面。
import requests
# 目标URL
url = "https://quotes.toscrape.com/" # 这是一个专门为爬虫练习设计的网站
try:
# 发送GET请求
response = requests.get(url)
# 检查请求是否成功 (状态码 200)
response.raise_for_status()
# 获取网页内容
html_content = response.text
# print(html_content) # 你可以取消这行注释,看看原始的HTML长什么样
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
requests.get(url)
: 向目标URL发送一个HTTP GET请求。response.raise_for_status()
: 这是一个好习惯。如果请求返回的HTTP状态码不是200(表示成功),这行代码会抛出一个异常。response.text
:response
对象包含了服务器返回的所有信息,.text
属性是网页的HTML内容,以字符串形式存在。
步骤3:使用Beautiful Soup解析和提取数据
现在我们拿到了HTML字符串,但它杂乱无章。接下来轮到Beautiful Soup登场,将它变成结构化的数据。
我们的目标是:抓取quotes.toscrape.com
首页上所有的名言、作者和标签。
import requests
from bs4 import BeautifulSoup
url = "https://quotes.toscrape.com/"
response = requests.get(url)
html_content = response.text
# 1. 创建BeautifulSoup对象
# 'lxml'是我们安装的解析器
soup = BeautifulSoup(html_content, 'lxml')
# 2. 定位包含所有名言的<div>
quotes = soup.find_all('div', class_='quote') # 注意class_有个下划线
# 3. 遍历每一个名言<div>,提取所需信息
for quote in quotes:
# 提取名言文本
text = quote.find('span', class_='text').get_text(strip=True)
# 提取作者
author = quote.find('small', class_='author').get_text(strip=True)
# 提取标签 (一个名言有多个标签)
tags_div = quote.find('div', class_='tags')
tags = [tag.get_text(strip=True) for tag in tags_div.find_all('a', class_='tag')]
print("---")
print(f"名言: {text}")
print(f"作者: {author}")
print(f"标签: {', '.join(tags)}")
代码解读:
soup = BeautifulSoup(html_content, 'lxml')
: 用lxml
解析器创建了一个soup
对象。soup.find_all('div', class_='quote')
: 这是核心。find_all()
: 查找所有符合条件的标签。'div'
: 标签名。class_='quote'
: 属性过滤器。因为class
是Python的关键字,所以在Beautiful Soup中用class_
来指定CSS类名。- 这行代码会返回一个列表,其中每个元素都是一个代表名言区块的
div
标签对象。
quote.find(...)
: 在quote
这个标签对象的子孙中,查找第一个符合条件的标签。.get_text(strip=True)
: 获取标签内的所有文本内容,并用strip=True
移除前后的空白字符。
运行这段代码,你会看到所有名言、作者和标签被整齐地打印出来。
总结:你的爬虫之旅
恭喜!你已经成功编写并运行了你的第一个网络爬虫。你掌握了爬虫最核心的两个步骤:
- 获取数据: 使用
requests
库获取网页的HTML。 - 解析数据: 使用
Beautiful Soup
库,通过标签名和CSS类名等方式定位元素,并提取其中的文本或属性。
这只是一个开始。基于这个模式,你可以尝试抓取其他静态网站的信息,比如新闻标题、博客文章、商品列表等。对于需要登录(涉及Cookies)或由JavaScript动态加载数据(如瀑布流)的网站,你可能需要学习更高级的工具,比如我们之前介绍过的Selenium。
但无论如何,Requests
+ Beautiful Soup
这对经典组合,都是你进入数据抓取世界最坚实的第一步。
...