import requests # 发送请求from bs4 import BeautifulSoup # 解析网页import pandas as pd # 存取csvfrom time import sleep # 等待时间from sqlalchemy import create_engine # 连接数据库
时间: 2025-03-29 11:01:59 浏览: 104
### 网页抓取与数据分析最佳实践
#### 数据抓取部分
为了高效完成网页数据的抓取,可以采用 `requests` 和 `BeautifulSoup` 的组合。以下是具体方法:
利用 `requests` 库发送 HTTP 请求以获取目标网页的内容[^3]。随后,使用 `BeautifulSoup` 解析 HTML 文档并提取所需的信息。例如,在药品价格数据抓取过程中,可以通过以下方式实现基本功能:
```python
import requests
from bs4 import BeautifulSoup
def fetch_data(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 假设我们需要提取所有的药品名称和价格
items = []
for item in soup.find_all('div', class_='product-item'):
name = item.find('h2').text.strip()
price = float(item.find('span', class_='price').text.replace('$', '').strip())
items.append({'name': name, 'price': price})
return items
```
上述代码展示了如何通过指定标签名及其属性定位目标数据,并将其整理成字典列表形式。
为了避免频繁访问服务器造成封禁风险,建议引入 `time.sleep()` 方法设置合理的延迟时间[^2]。这不仅有助于保护目标站点资源,还能提高程序稳定性。
#### 数据存储部分
对于大量数据的持久化保存,推荐使用 SQLAlchemy 进行数据库操作。SQLAlchemy 是 Python 中强大的 ORM 工具包,支持多种关系型数据库连接管理[^1]。下面是一段创建表模型并将抓取结果存入 SQLite 数据库的例子:
```python
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
name = Column(String(255))
price = Column(Float)
engine = create_engine('sqlite:///data.db') # 创建SQLite引擎实例
Base.metadata.create_all(engine) # 自动构建表格结构
Session = sessionmaker(bind=engine)
session = Session()
def save_to_db(items):
for item in items:
product = Product(name=item['name'], price=item['price'])
session.add(product)
session.commit() # 提交更改至数据库
```
此脚本定义了一个简单的商品类映射到 SQL 表格上,并实现了批量写入的功能。
#### 数据分析环节
当所有原始记录都已妥善入库之后,则可借助 Pandas 来执行进一步统计计算工作流。比如绘制柱状图比较各类别间平均售价差异情况如下所示:
```python
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_sql_table('products', con=engine) # 加载整个产品集合进入DataFrame对象中
category_avg_prices = df.groupby(['category']).mean()['price']
plt.bar(category_avg_prices.index, category_avg_prices.values)
plt.xlabel('Category')
plt.ylabel('Average Price ($)')
plt.title('Average Prices by Category')
plt.show()
```
以上片段说明了读取数据库中的资料转化为 DataFrame 后再做分组运算的过程,最后生成直观图表辅助决策者理解业务状况。
---
阅读全文
相关推荐



















