Python 数据爬取(爬虫):从零开始学会爬取网页数据

数据爬取(爬虫)是一项常见的技术,用于从互联网上获取大量的数据。Python 作为一个强大的工具,提供了丰富的库来实现这一目标。以下是一个从零开始的教程,帮助你理解如何使用 Python 编写网页爬虫,爬取网页数据。

第 1 步:了解网页结构

在开始编写爬虫之前,首先要了解网页的结构。现代网页通常使用 HTML(超文本标记语言)和 CSS 来结构化内容。网页的数据通常呈现为一个 HTML 文档,可以通过浏览器的开发者工具来查看网页的 HTML 结构。

  1. HTML 标签:例如 <h1><p><div><a> 等,用于标记网页内容的不同部分。
  2. CSS 选择器:用于通过特定规则选择 HTML 元素。
  3. 网络请求:网页内容通过 HTTP 请求获取,爬虫需要模拟这些请求。

第 2 步:准备环境

你需要安装一些 Python 库来进行网页数据抓取。常见的爬虫库有 requests(用于发送 HTTP 请求)和 BeautifulSoup(用于解析网页内容)。

你可以使用以下命令安装这些库:

pip install requests beautifulsoup4 lxml

第 3 步:发送 HTTP 请求

在编写爬虫时,第一步是通过 Python 模拟浏览器向网页发送 HTTP 请求。通常使用 requests 库来执行这一操作。

3.1 发送 GET 请求

GET 请求是最常见的请求方式,用于从服务器获取数据。

import requests

# 目标网页的 URL
url = "https://example.com"

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

# 检查请求是否成功(状态码 200 表示成功)
if response.status_code == 200:
    print("请求成功!")
    print(response.text)  # 打印网页的 HTML 内容
else:
    print(f"请求失败,状态码:{response.status_code}")

第 4 步:解析网页内容

通过 requests 获取到的网页是一个 HTML 文档,但这些数据并不容易直接使用。我们需要使用 BeautifulSoup 来解析和提取数据。

4.1 解析 HTML 内容

from bs4 import BeautifulSoup

# 获取到的网页内容
html_content = response.text

# 使用 BeautifulSoup 解析 HTML 内容
soup = BeautifulSoup(html_content, "lxml")

# 打印格式化的 HTML 内容
print(soup.prettify())

BeautifulSoup 可以帮助我们轻松地从 HTML 文档中提取数据。

4.2 提取指定的 HTML 元素

你可以使用 CSS 选择器或标签名称来查找网页中的元素。例如:

# 查找所有 <a> 标签(通常用于超链接)
links = soup.find_all("a")

for link in links:
    print(link.get("href"))  # 打印每个超链接的 URL

find_all 返回页面中所有匹配条件的元素,而 get("href") 获取每个超链接的地址。

4.3 选择特定元素

你也可以使用更多的选择器来提取特定的内容。例如,假设你想抓取网页中某个特定类名的 div 元素:

# 查找 class="example" 的 <div> 标签
divs = soup.find_all("div", class_="example")

for div in divs:
    print(div.text)  # 打印该 <div> 中的文本内容

你可以根据标签的 idclassname 等属性来定位元素。

第 5 步:处理网页中的动态内容

一些现代网站的数据是通过 JavaScript 动态加载的,而不是直接嵌入到 HTML 中。这类内容通过 API 或 AJAX 请求加载。对于这些页面,我们可以采用其他方法,比如使用 Selenium 或 Playwright 等库来模拟浏览器操作,抓取动态加载的数据。

5.1 使用 Selenium 爬取动态内容

pip install selenium

使用 Selenium 来模拟浏览器的方式:

from selenium import webdriver

# 启动浏览器驱动(需要下载适合浏览器的驱动)
driver = webdriver.Chrome(executable_path="path_to_chromedriver")

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

# 获取网页内容
html_content = driver.page_source

# 解析网页
soup = BeautifulSoup(html_content, "lxml")

# 关闭浏览器
driver.quit()

# 查找元素
print(soup.prettify())

Selenium 会打开一个真实的浏览器,等待 JavaScript 完全加载后获取 HTML 内容,适用于爬取动态生成的内容。


第 6 步:数据存储

在爬取完数据后,你通常需要将其存储到本地文件或数据库中。

6.1 存储为 CSV 文件

import csv

# 假设我们抓取了某些超链接,存储到 CSV 文件中
links = soup.find_all("a")
with open("links.csv", mode="w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["Link Text", "URL"])  # 写入表头
    for link in links:
        text = link.text
        url = link.get("href")
        writer.writerow([text, url])  # 写入每个链接的文本和 URL

6.2 存储为 JSON 文件

import json

# 假设我们抓取了一些文章标题,存储为 JSON 文件
titles = ["Title 1", "Title 2", "Title 3"]
with open("titles.json", "w") as file:
    json.dump(titles, file, indent=4)

6.3 存储到数据库

如果需要存储到数据库,可以使用 SQLiteMySQL 或 PostgreSQL 等数据库。以下是将数据存储到 SQLite 数据库的示例:

import sqlite3

# 连接数据库(如果没有则创建)
conn = sqlite3.connect("example.db")
cursor = conn.cursor()

# 创建一个表
cursor.execute("CREATE TABLE IF NOT EXISTS links (text TEXT, url TEXT)")

# 插入数据
for link in links:
    text = link.text
    url = link.get("href")
    cursor.execute("INSERT INTO links (text, url) VALUES (?, ?)", (text, url))

# 提交事务并关闭连接
conn.commit()
conn.close()

第 7 步:遵守网站的 robots.txt 协议

在编写爬虫时,务必遵守网站的 robots.txt 文件中的规定,这个文件告诉爬虫哪些内容可以爬取,哪些内容不能爬取。你可以通过访问 https://example.com/robots.txt 来查看该网站的规则。

# 示例:检查 robots.txt 是否允许爬虫访问
url = "https://example.com/robots.txt"
response = requests.get(url)

if "User-agent: *" in response.text:
    print("该网站允许爬虫访问")
else:
    print("该网站不允许爬虫访问")

总结

以上步骤展示了如何使用 Python 进行网页数据爬取。你可以根据需求,使用 requests 和 BeautifulSoup 来抓取静态网页数据,或者使用 Selenium 来抓取动态网页数据。此外,爬取的数据可以存储为 CSV、JSON 或数据库格式。确保遵循网站的使用规则,避免违反网站的爬虫政策。

随着你对爬虫技术的熟练度提高,你可以进一步探索高级的反爬虫策略,如模拟浏览器请求、代理池、IP 轮换等技术。