什么是网络爬虫

Python网络爬虫入门介绍:从网页中自动获取数据

在互联网时代,网页中存在着大量有价值的信息,例如新闻资讯、商品价格、招聘岗位、天气数据、论文信息等。如果我们依靠人工逐个打开网页、复制粘贴数据,不仅效率低,而且容易出错。

这时,网络爬虫就派上了用场。Python由于语法简洁、第三方库丰富,已经成为网络爬虫开发中非常常用的语言。

本文将带你了解什么是Python网络爬虫、爬虫的基本工作流程、常用技术以及学习爬虫时需要注意的问题。


一、什么是网络爬虫?

网络爬虫,也叫网页蜘蛛、网络机器人,是一种按照一定规则自动访问网页并提取信息的程序。

简单来说,网络爬虫可以模拟浏览器访问网页,然后从网页内容中提取我们需要的数据。

例如,我们可以编写一个爬虫程序,自动完成以下工作:

  1. 打开某个新闻网站;
  2. 获取新闻列表页面;
  3. 提取新闻标题、发布时间、来源和链接;
  4. 保存到CSV文件或数据库中。

网络爬虫并不是一个神秘的技术,它本质上就是:

用程序代替人工访问网页,并自动提取网页中的数据。


二、为什么选择Python编写网络爬虫?

Python非常适合爬虫开发,主要原因有以下几点。

1. 语法简单,适合入门

Python代码可读性强,语法接近自然语言,初学者可以较快上手。

例如发送一个网页请求,只需要几行代码:

import requests

url = "https://www.example.com"
response = requests.get(url)

print(response.status_code)
print(response.text)

2. 第三方库丰富

Python拥有大量成熟的爬虫相关库,例如:

库名 作用
requests 发送HTTP请求
BeautifulSoup 解析HTML网页
lxml 使用XPath解析网页
re 正则表达式解析文本
Selenium 抓取动态网页
Scrapy 爬虫框架
pandas 数据清洗和分析

这些工具可以帮助我们快速完成网页请求、数据解析、数据存储等任务。

3. 适合数据处理

爬虫采集到的数据通常需要清洗、统计和分析,而Python在数据分析领域也非常强大,可以与pandas、matplotlib等库结合使用。


三、网络爬虫的基本工作流程

一个完整的网络爬虫通常包括以下几个步骤:

确定目标数据 → 分析网页结构 → 发送网页请求 → 获取响应内容 → 解析网页数据 → 清洗数据 → 保存数据

下面逐步说明。


1. 确定目标数据

在写爬虫之前,首先要明确自己想采集什么数据。

例如:

  • 采集新闻网站中的标题和发布时间;
  • 采集商品页面中的名称、价格和销量;
  • 采集招聘网站中的岗位名称、薪资和城市;
  • 采集学校官网中的通知公告。

目标越清晰,后面的代码越容易编写。


2. 分析网页结构

网页通常由HTML、CSS和JavaScript组成。

对于爬虫来说,我们重点关注HTML结构,因为数据大多隐藏在HTML标签中。

例如一个简单的HTML片段:

<div class="book">
    <h2 class="title">Python网络爬虫实战</h2>
    <p class="author">作者:张老师</p>
    <p class="price">价格:¥59.00</p>
</div>

我们可以看到:

  • 书名在h2标签中;
  • 作者在p class="author"中;
  • 价格在p class="price"中。

后续代码就可以根据这些标签和属性提取数据。


3. 发送网页请求

Python中常用requests库发送网页请求。

安装方式:

pip install requests

示例代码:

import requests

url = "https://www.example.com"
response = requests.get(url)

print(response.status_code)
print(response.text)

其中:

  • requests.get(url)表示向目标网址发送GET请求;
  • response.status_code表示响应状态码;
  • response.text表示网页源码。

常见状态码包括:

状态码 含义
200 请求成功
301/302 重定向
403 禁止访问
404 页面不存在
500 服务器错误

4. 解析网页数据

获取网页源码后,需要从中提取目标数据。常见解析方式有以下几种。

方式一:正则表达式

适合提取格式比较固定的文本。

import re

html = '<p class="price">价格:¥59.00</p>'

result = re.findall(r'价格:¥(.*?)</p>', html)

print(result)

输出:

['59.00']

正则表达式灵活,但对复杂HTML结构不够稳定。


方式二:BeautifulSoup

BeautifulSoup适合初学者,语法简单,常用于解析HTML页面。

安装:

pip install beautifulsoup4 lxml

示例:

from bs4 import BeautifulSoup

html = """
<div class="book">
    <h2 class="title">Python网络爬虫实战</h2>
    <p class="author">作者:张老师</p>
    <p class="price">价格:¥59.00</p>
</div>
"""

soup = BeautifulSoup(html, "lxml")

title = soup.select_one(".title").get_text(strip=True)
author = soup.select_one(".author").get_text(strip=True)
price = soup.select_one(".price").get_text(strip=True)

print(title)
print(author)
print(price)

输出:

Python网络爬虫实战
作者:张老师
价格:¥59.00

方式三:XPath

XPath常与lxml库结合使用,适合结构化网页解析。

from lxml import etree

html = """
<div class="book">
    <h2 class="title">Python网络爬虫实战</h2>
    <p class="author">作者:张老师</p>
</div>
"""

tree = etree.HTML(html)

title = tree.xpath('//h2[@class="title"]/text()')
author = tree.xpath('//p[@class="author"]/text()')

print(title)
print(author)

输出:

['Python网络爬虫实战']
['作者:张老师']

5. 保存数据

爬取到的数据可以保存到不同位置。

常见存储方式包括:

存储方式 适用场景
TXT 简单文本
CSV 表格数据,适合Excel打开
JSON 结构化数据
SQLite/MySQL 关系型数据库
MongoDB 非关系型文档数据

例如保存为CSV文件:

import csv

data = [
    ["书名", "作者", "价格"],
    ["Python网络爬虫实战", "张老师", "¥59.00"],
    ["Python数据分析", "李老师", "¥69.00"]
]

with open("books.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerows(data)

四、一个简单的Python爬虫示例

下面是一个完整的简单爬虫示例,用于请求网页并解析标题。

import requests
from bs4 import BeautifulSoup

# 目标网址
url = "https://www.example.com"

# 设置请求头,模拟浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0"
}

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

# 设置编码
response.encoding = response.apparent_encoding

# 判断请求是否成功
if response.status_code == 200:
    # 解析HTML
    soup = BeautifulSoup(response.text, "lxml")

    # 获取网页标题
    title = soup.title.string

    print("网页标题:", title)
else:
    print("请求失败,状态码:", response.status_code)

这个程序虽然简单,但已经包含了爬虫的基本流程:

  1. 指定目标URL;
  2. 设置请求头;
  3. 发送请求;
  4. 判断状态码;
  5. 解析HTML;
  6. 输出结果。

五、静态网页与动态网页

在学习爬虫时,经常会遇到两类网页:静态网页和动态网页。

1. 静态网页

静态网页的数据直接写在HTML源码中。

这种网页通常可以使用:

requests + BeautifulSoup / XPath

进行采集。

2. 动态网页

动态网页的数据不是一开始就在HTML中,而是通过JavaScript后续加载出来的。

例如:

  • 点击按钮后才出现数据;
  • 下拉页面后继续加载内容;
  • 数据来自Ajax接口;
  • 页面内容由前端框架动态渲染。

对于动态网页,常见处理方式有两种:

方法一:分析接口

使用浏览器开发者工具查看Network请求,找到真实数据接口,然后直接请求接口。

方法二:使用Selenium

Selenium可以控制浏览器自动打开网页、点击按钮、输入关键词、滚动页面。

安装:

pip install selenium

简单示例:

from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://www.example.com")

print(driver.title)

driver.quit()

Selenium适合处理动态网页,但运行速度相对较慢。


六、网络爬虫常见问题

1. 为什么请求网页时返回403?

403表示服务器拒绝访问,可能原因包括:

  • 没有设置User-Agent;
  • 请求过于频繁;
  • 网站有反爬虫机制;
  • 需要登录或Cookie。

可以尝试添加请求头:

headers = {
    "User-Agent": "Mozilla/5.0"
}

2. 为什么网页中找不到想要的数据?

可能原因是网页数据由JavaScript动态加载。

解决方法:

  • 查看浏览器开发者工具中的Network请求;
  • 找到真实数据接口;
  • 使用Selenium获取渲染后的网页内容。

3. 为什么中文显示乱码?

可以设置网页编码:

response.encoding = response.apparent_encoding

或在保存文件时指定编码:

encoding="utf-8-sig"

七、学习网络爬虫需要掌握哪些知识?

学习Python网络爬虫,建议按照以下顺序进行:

  1. Python基础语法;
  2. HTTP协议基础;
  3. HTML、CSS基础;
  4. requests库;
  5. 正则表达式;
  6. BeautifulSoup;
  7. XPath与lxml;
  8. JSON数据解析;
  9. Selenium动态网页采集;
  10. 数据存储;
  11. Scrapy框架;
  12. 反爬虫与合规采集。

其中,初学者可以先掌握:

Python基础 + requests + BeautifulSoup + CSV保存

这已经可以完成很多简单的网页采集任务。


八、网络爬虫的合法合规问题

网络爬虫虽然很有用,但并不意味着可以随意采集任何网站的数据。

在编写爬虫时,应注意以下几点:

  1. 遵守网站的robots.txt协议;
  2. 遵守网站服务条款;
  3. 不采集个人隐私和敏感信息;
  4. 不绕过登录、验证码、权限控制等安全措施;
  5. 控制请求频率,避免影响网站正常运行;
  6. 仅采集公开、合法、授权的数据;
  7. 爬取数据仅用于学习、研究或合规业务场景。

一个负责任的爬虫开发者,既要掌握技术,也要具备法律意识和数据伦理意识。


九、总结

Python网络爬虫是一项非常实用的技术,它可以帮助我们从网页中自动获取数据,并为数据分析、人工智能、商业分析等工作提供数据基础。

一个基础爬虫通常包括以下流程:

发送请求 → 获取响应 → 解析网页 → 提取数据 → 保存数据

常用技术包括:

  • requests:发送网页请求;
  • BeautifulSoup:解析HTML;
  • lxml和XPath:结构化解析;
  • re:正则表达式;
  • Selenium:处理动态网页;
  • Scrapy:构建大型爬虫项目。

对于初学者来说,不必一开始就学习复杂框架,可以先从简单的静态网页抓取开始,逐步理解网页结构、请求原理和数据解析方法。

只要掌握了基本流程,再结合不断练习,就可以逐步开发出功能完整、结构清晰的Python爬虫程序。