使用python实现网页爬虫的核心流程包括:发起请求、获取响应、解析html、提取数据;2. 选择requests和beautifulsoup组合的原因是其学习曲线平缓、功能强大且灵活,requests库封装了http请求的复杂性,beautifulsoup能高效解析不规范的html结构;3. 应对反爬机制的方法包括:设置浏览器user-agent头模拟真实访问、使用time.sleep()控制请求频率以避免ip被封、利用requests.session()管理登录状态和cookies;4. 爬取数据的存储方式根据需求选择:小规模结构化数据可保存为csv或json文件,大规模或需复杂查询的数据推荐使用sqlite等数据库;5. 数据管理还需遵守robots.txt协议、控制请求频率以尊重服务器负载,并确保符合相关法律法规,保障爬虫合法合规运行。

Python实现网页爬虫,利用
requests
BeautifulSoup
要用Python实现网页爬虫,核心流程其实并不复杂,它通常包括这几步:发起请求、获取响应、解析HTML、提取数据。
我们先引入必要的库:
立即学习“Python免费学习笔记(深入)”;
import requests from bs4 import BeautifulSoup import time # 用于设置延时,做个有礼貌的爬虫
接着,以一个简单的例子来说明:抓取某个网页的标题和所有段落文本。
url = 'https://example.com' # 替换成你要抓取的网页URL
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
} # 模拟浏览器访问,这是个好习惯
try:
response = requests.get(url, headers=headers, timeout=10) # 设置超时,避免无限等待
response.raise_for_status() # 如果状态码不是200,抛出HTTPError异常
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')
# 提取标题
title = soup.title.string if soup.title else '无标题'
print(f"网页标题: {title}")
# 提取所有段落文本
paragraphs = soup.find_all('p')
print("\n所有段落内容:")
for p in paragraphs:
print(p.get_text())
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except Exception as e:
print(f"解析或处理数据时发生错误: {e}")
time.sleep(1) # 简单延时,给服务器一点喘息时间这段代码展示了最基础的抓取逻辑。
requests.get()
BeautifulSoup(response.text, 'html.parser')
soup.find()
soup.find_all()
soup.select()
.get_text()
['attribute']
我经常被问到,Python里有那么多爬虫库,为什么你偏爱
requests
BeautifulSoup
requests
requests.Session()
requests
而
BeautifulSoup
soup.select('div.content a')当然,如果你需要处理JavaScript动态加载的内容,或者进行大规模、高并发的爬取,可能就需要考虑
Selenium
Playwright
Scrapy
requests
BeautifulSoup
在实际操作中,网页并不是总那么“友好”,它们会设置一些障碍来阻止自动化程序抓取数据,也就是我们常说的“反爬机制”。这些机制形形色色,有些很简单,有些则相当复杂。
最常见的一个是User-Agent检测。很多网站会检查你的请求头,如果发现User-Agent是Python的默认值(比如
python-requests/X.Y.Z
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)另一个常见的反爬是请求频率限制。如果你在短时间内发送了大量请求,服务器可能会认为你是恶意行为,从而暂时或永久地封禁你的IP。应对这种机制,最直接有效的方法就是设置请求间隔,也就是在每次请求之间加入
time.sleep()
import time # ... (your scraping code) ... time.sleep(random.uniform(1, 3)) # 每次请求后随机等待1到3秒,更自然
还有一些网站会通过Cookie和Session来管理用户状态,或者要求登录才能访问数据。
requests
Session
session = requests.Session()
# 模拟登录,获取session
login_data = {'username': 'your_user', 'password': 'your_password'}
session.post('https://example.com/login', data=login_data)
# 登录后,使用session对象访问需要权限的页面
response = session.get('https://example.com/protected_page')对于更复杂的反爬,比如JavaScript动态渲染内容、验证码、字体反爬、参数加密等,
requests
BeautifulSoup
Selenium
Playwright
辛辛苦苦爬取到的数据,如果不能妥善存储和管理,那之前的所有努力就白费了。选择合适的数据存储方式,取决于你数据的规模、结构以及后续的用途。
最简单也是最常用的方式,是将数据保存为CSV文件或JSON文件。
CSV (Comma Separated Values) 适用于结构化、表格型的数据。每一行代表一条记录,列之间用逗号分隔。它的优点是简单、通用,可以用Excel等工具直接打开查看。
import csv
# 假设你爬取到了这样的数据列表
data_to_save = [
{'title': '文章A', 'author': '张三', 'date': '2023-01-01'},
{'title': '文章B', 'author': '李四', 'date': '2023-01-02'}
]
# 写入CSV文件
csv_file = 'articles.csv'
fieldnames = ['title', 'author', 'date'] # 定义列名
with open(csv_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(data_to_save) # 写入数据
print(f"数据已保存到 {csv_file}")JSON (JavaScript Object Notation) 格式则更适合半结构化或嵌套结构的数据。它以键值对的形式存储,可读性好,并且与Python的字典和列表天然对应,非常方便数据交换。
import json
# 假设你爬取到了这样的数据
data_to_save = [
{'id': 1, 'name': '产品A', 'details': {'price': 100, 'stock': 50}},
{'id': 2, 'name': '产品B', 'details': {'price': 200, 'stock': 30}}
]
# 写入JSON文件
json_file = 'products.json'
with open(json_file, 'w', encoding='utf-8') as f:
json.dump(data_to_save, f, ensure_ascii=False, indent=4) # indent参数让输出更美观
print(f"数据已保存到 {json_file}")当数据量较大,或者你需要进行复杂的查询、更新、关联操作时,将数据存储到数据库会是更好的选择。Python有成熟的库来连接各种数据库,比如
sqlite3
psycopg2
PyMySQL
pymongo
以SQLite为例,它是一个文件型数据库,非常适合本地存储和测试:
import sqlite3
# 连接到SQLite数据库(如果文件不存在则创建)
conn = sqlite3.connect('my_scraped_data.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS articles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT,
date TEXT
)
''')
conn.commit()
# 插入数据
article_data = ('新文章标题', '作者甲', '2023-03-15')
cursor.execute("INSERT INTO articles (title, author, date) VALUES (?, ?, ?)", article_data)
conn.commit()
# 查询数据
cursor.execute("SELECT * FROM articles")
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close() # 关闭数据库连接
print("数据已存储并查询完毕。")除了技术层面的存储,数据管理还涉及到一些伦理和法律问题。在爬取数据前,务必检查网站的
robots.txt
以上就是Python如何实现网页爬虫?requests+BeautifulSoup的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号