好的,这是一个非常适合入门的Python爬虫案例。

我们将使用两个非常流行的Python库来编写这个爬虫:

  1. requests: 用于向网站发送HTTP请求,获取网页的HTML内容。
  2. beautifulsoup4 (BS4): 用于解析HTML内容,方便我们从中提取所需的数据。

案例目标

我们将爬取一个专门用于练习爬虫的网站 http://quotes.toscrape.com/。我们的目标是获取网站首页上所有的名言和对应的作者


步骤1:安装所需库

在运行代码之前,你需要在你的环境中安装 requestsbeautifulsoup4。打开你的终端或命令行,运行以下命令:

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()

代码讲解

  1. 导入库: 导入 requests (用于访问网页) 和 BeautifulSoup (用于解析网页)。
  2. 发送请求: requests.get(url, headers=headers) 向目标URL发送一个GET请求。我们附带了 headers,其中 User-Agent 告诉网站我们是一个“浏览器”,这有助于避免被一些基本反爬机制拦截。
  3. 检查响应: response.status_code == 200 检查请求是否成功。200 是 HTTP 的标准成功状态码。
  4. 创建Soup对象: BeautifulSoup(response.text, 'html.parser') 将获取到的HTML文本(response.text)加载到一个 BeautifulSoup 对象中,以便我们使用 findfind_all 方法进行搜索。
  5. 查找元素 (find_all): soup.find_all('div', class_='quote') 会查找HTML中所有 class 属性为 quote<div> 标签。这会返回一个列表,包含了所有名言的“HTML块”。
  6. 提取数据 (find): 在循环中,我们对每一个“HTML块” (quote_div) 内部进行搜索。

    • quote_div.find('span', class_='text') 找到第一个 classtext<span> 标签。
    • quote_div.find('small', class_='author') 找到第一个 classauthor<small> 标签。
  7. 获取文本: .get_text(strip=True) 从标签中提取纯文本内容,并移除前后的空白字符。

爬虫的重要提示

  • 遵守 robots.txt: 在爬取真实网站之前,请检查网站的 robots.txt 文件(例如 https://example.com/robots.txt),它规定了哪些页面允许爬虫访问。
  • 不要过度请求: 过于频繁的请求会给对方服务器带来压力,可能会导致你的IP被封禁。最好在循环请求之间加入适当的延迟(例如 time.sleep(1))。

这个案例为你展示了爬虫最基本的核心流程。

你是否想了解更高级的爬虫技术,比如如何爬取多个页面(翻页)、如何处理需要登录的网站,或者了解一下像 Scrapy 这样的专业爬虫框架?

标签: none

添加新评论

  • 上一篇: 没有了
  • 下一篇: 没有了