Python网络爬虫入门介绍:从网页中自动获取数据
在互联网时代,网页中存在着大量有价值的信息,例如新闻资讯、商品价格、招聘岗位、天气数据、论文信息等。如果我们依靠人工逐个打开网页、复制粘贴数据,不仅效率低,而且容易出错。
这时,网络爬虫就派上了用场。Python由于语法简洁、第三方库丰富,已经成为网络爬虫开发中非常常用的语言。
本文将带你了解什么是Python网络爬虫、爬虫的基本工作流程、常用技术以及学习爬虫时需要注意的问题。
一、什么是网络爬虫?
网络爬虫,也叫网页蜘蛛、网络机器人,是一种按照一定规则自动访问网页并提取信息的程序。
简单来说,网络爬虫可以模拟浏览器访问网页,然后从网页内容中提取我们需要的数据。
例如,我们可以编写一个爬虫程序,自动完成以下工作:
- 打开某个新闻网站;
- 获取新闻列表页面;
- 提取新闻标题、发布时间、来源和链接;
- 保存到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)
这个程序虽然简单,但已经包含了爬虫的基本流程:
- 指定目标URL;
- 设置请求头;
- 发送请求;
- 判断状态码;
- 解析HTML;
- 输出结果。
五、静态网页与动态网页
在学习爬虫时,经常会遇到两类网页:静态网页和动态网页。
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网络爬虫,建议按照以下顺序进行:
- Python基础语法;
- HTTP协议基础;
- HTML、CSS基础;
- requests库;
- 正则表达式;
- BeautifulSoup;
- XPath与lxml;
- JSON数据解析;
- Selenium动态网页采集;
- 数据存储;
- Scrapy框架;
- 反爬虫与合规采集。
其中,初学者可以先掌握:
Python基础 + requests + BeautifulSoup + CSV保存
这已经可以完成很多简单的网页采集任务。
八、网络爬虫的合法合规问题
网络爬虫虽然很有用,但并不意味着可以随意采集任何网站的数据。
在编写爬虫时,应注意以下几点:
- 遵守网站的
robots.txt协议; - 遵守网站服务条款;
- 不采集个人隐私和敏感信息;
- 不绕过登录、验证码、权限控制等安全措施;
- 控制请求频率,避免影响网站正常运行;
- 仅采集公开、合法、授权的数据;
- 爬取数据仅用于学习、研究或合规业务场景。
一个负责任的爬虫开发者,既要掌握技术,也要具备法律意识和数据伦理意识。
九、总结
Python网络爬虫是一项非常实用的技术,它可以帮助我们从网页中自动获取数据,并为数据分析、人工智能、商业分析等工作提供数据基础。
一个基础爬虫通常包括以下流程:
发送请求 → 获取响应 → 解析网页 → 提取数据 → 保存数据
常用技术包括:
requests:发送网页请求;BeautifulSoup:解析HTML;lxml和XPath:结构化解析;re:正则表达式;Selenium:处理动态网页;Scrapy:构建大型爬虫项目。
对于初学者来说,不必一开始就学习复杂框架,可以先从简单的静态网页抓取开始,逐步理解网页结构、请求原理和数据解析方法。
只要掌握了基本流程,再结合不断练习,就可以逐步开发出功能完整、结构清晰的Python爬虫程序。