用Python编写一个简单网页爬虫
用Python编写一个简单网页爬虫:从入门到实践
引言/概述
在当今信息爆炸的时代,网络爬虫(Web Crawler)已成为获取公开数据的重要工具。无论是做数据分析、市场调研,还是学术研究,掌握基本的爬虫技能都能显著提升工作效率。Python 凭借其简洁的语法和丰富的第三方库(如 requests、BeautifulSoup、lxml 等),成为编写爬虫的首选语言。
本文将带领读者从零开始,用 Python 编写一个简单的网页爬虫。我们将以抓取某新闻网站的标题和链接为例,逐步讲解爬虫的基本原理、常用库的使用方法、反爬机制的应对策略,以及代码的优化与规范。全文约2000字,适合有一定 Python 基础但尚未接触爬虫的初学者。
注意:爬虫应遵守网站的
robots.txt协议,仅用于合法、合规的数据采集,切勿用于商业侵犯或对服务器造成负担。
核心内容
1. 爬虫的基本原理
网络爬虫的核心思想是模拟浏览器向目标网站发送 HTTP 请求,获取网页的 HTML 源码,然后从中提取所需信息。整个过程可分为三个步骤:
- 发送请求:使用 HTTP 客户端(如
requests库)向目标 URL 发起 GET 请求。 - 解析响应:获取服务器返回的 HTML 内容。
- 提取数据:利用解析库(如
BeautifulSoup)从 HTML 中定位并提取目标数据。
这个流程看似简单,但在实际操作中需考虑编码、异常处理、反爬策略等问题。
2. 环境准备与依赖安装
在开始编码前,请确保已安装 Python(建议 3.7+)。然后通过 pip 安装必要的第三方库:
pip install requests beautifulsoup4 lxml
requests:用于发送 HTTP 请求。beautifulsoup4:用于解析 HTML/XML 文档。lxml:高性能的 XML/HTML 解析器,可作为 BeautifulSoup 的后端加速解析。
3. 发送请求并获取网页内容
我们以 https://example-news-site.com(此处为示例,实际可替换为真实网站)为例。首先,使用 requests 获取网页内容:
import requests
url = "https://example-news-site.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查是否请求成功
response.encoding = response.apparent_encoding # 自动识别编码
html_content = response.text
print("网页获取成功!")
except requests.RequestException as e:
print(f"请求失败: {e}")
说明:设置
User-Agent是为了模拟真实浏览器,避免被服务器识别为爬虫而拒绝访问。timeout参数防止程序无限等待。
4. 使用 BeautifulSoup 解析 HTML
获取 HTML 后,我们需要从中提取新闻标题和链接。假设目标网页的结构如下:
<div class="news-list">
<a href="/article/1">今日科技新闻</a>
<a href="/article/2">经济走势分析</a>
...
</div>
我们可以使用 BeautifulSoup 定位这些 <a> 标签:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'lxml')
# 查找所有 class 为 'news-list' 的 div 下的 a 标签
news_items = soup.select('div.news-list a')
for item in news_items:
title = item.get_text(strip=True)
link = item.get('href')
if link.startswith('/'):
link = "https://example-news-site.com" + link # 补全相对链接
print(f"标题: {title}\n链接: {link}\n")
select() 方法支持 CSS 选择器,非常灵活。例如:
soup.find_all('a'):查找所有<a>标签soup.select('.class-name'):查找指定 class 的元素soup.select('#id-name'):查找指定 id 的元素
5. 完整爬虫示例
下面是一个完整的、结构清晰的爬虫脚本:
# simple_crawler.py
import requests
from bs4 import BeautifulSoup
import time
def fetch_page(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
try:
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()
resp.encoding = resp.apparent_encoding
return resp.text
except Exception as e:
print(f"获取页面失败: {e}")
return None
def parse_news(html, base_url="https://example-news-site.com"):
if not html:
return []
soup = BeautifulSoup(html, 'lxml')
items = soup.select('div.news-list a')
results = []
for a in items:
title = a.get_text(strip=True)
href = a.get('href')
if href:
if href.startswith('/'):
href = base_url + href
results.append({'title': title, 'url': href})
return results
def main():
url = "https://example-news-site.com"
html = fetch_page(url)
news_list = parse_news(html)
print(f"共抓取到 {len(news_list)} 条新闻:\n")
for news in news_list:
print(f"【{news['title']}】\n→ {news['url']}\n")
# 可选:将结果保存到文件
with open('news.txt', 'w', encoding='utf-8') as f:
for news in news_list:
f.write(f"{news['title']} | {news['url']}\n")
if __name__ == "__main__":
main()
运行该脚本,即可在控制台看到抓取结果,并生成 news.txt 文件保存数据。
6. 应对常见反爬机制
许多网站会设置反爬措施,常见的包括:
- IP 封禁:短时间内频繁请求会被限制。
对策:添加延时(time.sleep(1)),或使用代理池。 - 验证码:触发风控后弹出验证码。
对策:降低请求频率,或使用 Selenium 模拟浏览器(适用于 JavaScript 渲染页面)。 - 动态加载内容:数据通过 AJAX 或 JavaScript 动态生成。
对策:分析 Network 面板,找到真实 API 接口;或使用selenium+chromedriver。
对于初学者,建议先从静态页面入手,避免复杂场景。
7. 遵守法律与道德规范
编写爬虫时务必注意以下几点:
- 查看目标网站的
robots.txt(如https://example.com/robots.txt),确认允许爬取的路径。 - 控制请求频率,避免对服务器造成压力(建议间隔 1 秒以上)。
- 不爬取用户隐私、付费内容或受版权保护的数据。
- 在
User-Agent中注明联系方式(如邮箱),便于网站管理员联系。
总结
本文通过一个简单的新闻标题爬虫项目,介绍了 Python 爬虫的基本开发流程:从发送 HTTP 请求、解析 HTML,到提取结构化数据。我们使用了 requests 和 BeautifulSoup 这两个核心库,它们组合起来足以应对大多数静态网页的抓取需求。
虽然本文示例较为基础,但它涵盖了爬虫开发的关键环节:错误处理、编码识别、链接补全、数据存储等。随着经验的积累,你可以进一步学习以下进阶内容:
- 使用
Scrapy框架构建分布式爬虫 - 处理 JavaScript 渲染页面(Selenium / Playwright)
- 数据清洗与存储(Pandas、SQLite、MongoDB)
- 反反爬策略(代理 IP、User-Agent 轮换、Cookies 池)
最后再次强调:技术无罪,但使用需谨慎。请始终以合法、合理、尊重网站规则为前提进行数据采集。希望本文能为你打开爬虫世界的大门,开启数据探索之旅!

评论 0