Bootstrap

Python 爬虫详解与操作示例

Python 爬虫是一项非常实用的技术,可以帮助我们自动化获取网页中的数据。以下内容将从理论到实践,逐步展示如何构建一个完整的 Python 爬虫,并结合实际操作过程说明。


1. 爬虫的基本概念

1.1 什么是爬虫?

爬虫(Web Crawler)是一种能够自动访问网页并提取数据的程序。简单来说,爬虫的核心工作是:

  1. 模拟用户访问网页。
  2. 获取网页内容(例如 HTML)。
  3. 从内容中提取目标数据。

1.2 爬虫的工作流程

  1. 确定目标:明确需要爬取的网页链接和数据内容。
  2. 发送请求:通过 HTTP 请求获取网页的 HTML 源码。
  3. 解析内容:使用工具提取出需要的数据。
  4. 存储数据:将数据保存到文件(如 CSV、Excel)或数据库(如 MySQL)。
  5. 循环处理:对多页、多链接进行循环爬取。

2. 基础爬虫工具和库

2.1 常用库

  1. requests:用于发送 HTTP 请求,获取网页内容。
  2. BeautifulSoup:解析 HTML 页面,提取数据。
  3. lxml:快速解析 HTML/XML。
  4. selenium:处理动态网页(JavaScript 渲染)。
  5. pandas:整理和保存数据。

2.2 安装依赖

在开始之前,先安装以下依赖库:

pip install requests beautifulsoup4 lxml pandas selenium


3. 实现爬虫的步骤

让我们通过一个具体的示例,说明如何爬取数据。

3.1 明确目标

以爬取豆瓣电影 Top 250 的电影名称、评分和链接为例,目标页面是:豆瓣电影 Top 250

3.2 查看 HTML 结构

在浏览器中打开目标网页,右键选择“检查”或按 F12 打开开发者工具,查看网页中数据的 HTML 结构。例如:

  • 电影标题的 HTML 标签:<span class="title">电影名称</span>
  • 评分的 HTML 标签:<span class="rating_num">评分</span>
  • 详情页链接的标签:<a href="链接地址"></a>

3.3 爬取网页内容

步骤 1:发送请求

使用 requests 获取目标网页的 HTML 内容:

 
import requests

# 目标 URL
url = "https://movie.douban.com/top250"

# 设置请求头,模拟浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}

# 发送 GET 请求
response = requests.get(url, headers=headers)

# 查看网页 HTML 内容
print(response.text)
步骤 2:解析网页内容

使用 BeautifulSoup 提取目标数据:

 
from bs4 import BeautifulSoup

# 解析 HTML 内容
soup = BeautifulSoup(response.text, "html.parser")

# 提取所有电影条目
movie_items = soup.find_all("div", class_="item")

for item in movie_items:
    # 提取电影标题
    title = item.find("span", class_="title").text

    # 提取评分
    rating = item.find("span", class_="rating_num").text

    # 提取详情页链接
    link = item.find("a")['href']

    print(f"标题: {title}, 评分: {rating}, 链接: {link}")

3.4 处理多页爬取

豆瓣 Top 250 的数据分布在多个分页中,每页包含 25 部电影。通过观察 URL,我们发现 start=0 参数可以控制分页:

我们可以通过循环爬取所有分页:

 
all_movies = []

for page in range(0, 250, 25):  # 每页间隔是 25
    url = f"https://movie.douban.com/top250?start={page}"
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    movie_items = soup.find_all("div", class_="item")

    for item in movie_items:
        title = item.find("span", class_="title").text
        rating = item.find("span", class_="rating_num").text
        link = item.find("a")['href']
        all_movies.append([title, rating, link])

# 查看提取的数据
print(all_movies)

3.5 保存数据

我们可以使用 pandas 将数据保存到 CSV 文件中:

 
import pandas as pd

# 保存为 DataFrame
df = pd.DataFrame(all_movies, columns=["Title", "Rating", "Link"])

# 保存为 CSV 文件
df.to_csv("douban_top250.csv", index=False, encoding="utf-8")
print("数据已保存到 douban_top250.csv")

4. 动态网页的处理

某些网页内容是通过 JavaScript 动态加载的,此时需要使用 selenium 模拟浏览器操作。例如爬取一个需要滚动加载的网页。

安装 Selenium 并下载 ChromeDriver:

 
pip install selenium

示例:动态加载网页

 
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 配置 Chrome 浏览器
driver = webdriver.Chrome()

# 打开目标网页
driver.get("https://example.com")

# 等待页面加载
time.sleep(3)

# 提取页面 HTML 内容
html = driver.page_source
print(html)

# 关闭浏览器
driver.quit()

5. 常见问题与解决方案

  1. 被反爬机制阻挡

    • 设置 User-Agent 模拟正常用户访问。
    • 使用代理 IP。
    • 避免频繁请求,添加适当延时(如 time.sleep())。
  2. 网页内容动态加载

    • 使用 Selenium 模拟用户操作。
    • 或者通过抓包工具(如 Fiddler)找到加载数据的接口,直接请求接口。
  3. 提取不到数据

    • 检查 HTML 结构是否发生变化。
    • 确保爬取网页的请求返回的是完整 HTML 源码。

6. 完整爬虫示例:豆瓣电影 Top 250

以下是一个完整的爬虫代码示例:

 
import requests
from bs4 import BeautifulSoup
import pandas as pd

# 设置请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}

# 存储所有电影数据
all_movies = []

# 爬取每一页
for page in range(0, 250, 25):
    url = f"https://movie.douban.com/top250?start={page}"
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")

    # 提取电影数据
    movie_items = soup.find_all("div", class_="item")
    for item in movie_items:
        title = item.find("span", class_="title").text
        rating = item.find("span", class_="rating_num").text
        link = item.find("a")['href']
        all_movies.append([title, rating, link])

# 保存到 CSV 文件
df = pd.DataFrame(all_movies, columns=["Title", "Rating", "Link"])
df.to_csv("douban_top250.csv", index=False, encoding="utf-8")
print("数据已保存到 douban_top250.csv")

7. 总结

通过以上步骤,我们完成了一个从零开始的 Python 爬虫,涵盖了以下内容:

  1. 下载网页内容(requests)。
  2. 解析 HTML 提取数据(BeautifulSoup)。
  3. 循环处理多页数据。
  4. 保存数据(pandas)。
  5. 处理动态网页(selenium)。

在实际开发中,还需要注意遵守目标网站的爬虫规则(如 robots.txt),并合理控制爬虫的频率以避免被封禁。希望这个完整的爬虫过程能对您有所帮助!

;