python爬虫案例
好的,这是一个非常适合入门的Python爬虫案例。
我们将使用两个非常流行的Python库来编写这个爬虫:
requests: 用于向网站发送HTTP请求,获取网页的HTML内容。beautifulsoup4(BS4): 用于解析HTML内容,方便我们从中提取所需的数据。
案例目标
我们将爬取一个专门用于练习爬虫的网站 http://quotes.toscrape.com/。我们的目标是获取网站首页上所有的名言和对应的作者。
步骤1:安装所需库
在运行代码之前,你需要在你的环境中安装 requests 和 beautifulsoup4。打开你的终端或命令行,运行以下命令:
pip install requests
pip install beautifulsoup4步骤2:Python爬虫代码
下面是完整的Python代码。你可以将其保存为一个 .py 文件(例如 scraper.py)并运行它。
import requests
from bs4 import BeautifulSoup
def scrape_quotes():
# 1. 目标URL
url = "http://quotes.toscrape.com/"
try:
# 2. 发送HTTP GET请求
# 我们添加一个 headers 伪装成浏览器访问,这是一个好习惯
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
response = requests.get(url, headers=headers)
# 确保请求成功 (状态码 200)
if response.status_code == 200:
print(f"成功连接到 {url}")
# 3. 解析HTML内容
# 'html.parser' 是 BeautifulSoup 使用的解析器
soup = BeautifulSoup(response.text, 'html.parser')
# 4. 查找所有名言容器
# 通过分析网页源码,我们发现每条名言都在一个 class="quote" 的 <div> 标签中
quotes_divs = soup.find_all('div', class_='quote')
if not quotes_divs:
print("没有找到名言。")
return
print(f"\n找到了 {len(quotes_divs)} 条名言:\n")
# 5. 遍历每个容器并提取数据
for quote_div in quotes_divs:
# 提取名言文本
# 名言文本在 class="text" 的 <span> 标签内
text = quote_div.find('span', class_='text').get_text(strip=True)
# 提取作者
# 作者在 class="author" 的 <small> 标签内
author = quote_div.find('small', class_='author').get_text(strip=True)
# 打印结果
print("--------------------")
print(f"名言: {text}")
print(f"作者: {author}")
else:
print(f"连接失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"请求时发生错误: {e}")
# 运行爬虫
if __name__ == "__main__":
scrape_quotes()代码讲解
- 导入库: 导入
requests(用于访问网页) 和BeautifulSoup(用于解析网页)。 - 发送请求:
requests.get(url, headers=headers)向目标URL发送一个GET请求。我们附带了headers,其中User-Agent告诉网站我们是一个“浏览器”,这有助于避免被一些基本反爬机制拦截。 - 检查响应:
response.status_code == 200检查请求是否成功。200是 HTTP 的标准成功状态码。 - 创建Soup对象:
BeautifulSoup(response.text, 'html.parser')将获取到的HTML文本(response.text)加载到一个BeautifulSoup对象中,以便我们使用find和find_all方法进行搜索。 - 查找元素 (
find_all):soup.find_all('div', class_='quote')会查找HTML中所有class属性为quote的<div>标签。这会返回一个列表,包含了所有名言的“HTML块”。 提取数据 (
find): 在循环中,我们对每一个“HTML块” (quote_div) 内部进行搜索。quote_div.find('span', class_='text')找到第一个class为text的<span>标签。quote_div.find('small', class_='author')找到第一个class为author的<small>标签。
- 获取文本:
.get_text(strip=True)从标签中提取纯文本内容,并移除前后的空白字符。
爬虫的重要提示
- 遵守
robots.txt: 在爬取真实网站之前,请检查网站的robots.txt文件(例如https://example.com/robots.txt),它规定了哪些页面允许爬虫访问。 - 不要过度请求: 过于频繁的请求会给对方服务器带来压力,可能会导致你的IP被封禁。最好在循环请求之间加入适当的延迟(例如
time.sleep(1))。
这个案例为你展示了爬虫最基本的核心流程。
你是否想了解更高级的爬虫技术,比如如何爬取多个页面(翻页)、如何处理需要登录的网站,或者了解一下像 Scrapy 这样的专业爬虫框架?