python爬取网站
这个示例将抓取一个假设的商品列表网站,提取商品名称和价格,并将数据保存到CSV文件中。
pip install requests beautifulsoup4 pandas
然后,使用以下代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
# 目标网址(假设为一个商品列表页面)
base_url = 'http://example.com/products?page={}'
# 存储抓取的数据
data = []
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 处理分页
for page in range(1, 6): # 假设我们抓取前5页
url = base_url.format(page)
try:
# 发送请求
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
# 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 提取商品信息
products = soup.find_all('div', class_='product') # 假设商品信息在<div class='product'>中
for product in products:
name = product.find('h2', class_='product-name').text.strip() # 假设商品名称在<h2 class='product-name'>中
price = product.find('span', class_='product-price').text.strip() # 假设价格在<span class='product-price'>中
data.append({'name': name, 'price': price})
# 随机延迟,避免被封禁
time.sleep(random.uniform(1, 3))
except requests.RequestException as e:
print(f'请求错误: {e}')
except Exception as e:
print(f'解析错误: {e}')
# 将数据保存为CSV文件
df = pd.DataFrame(data)
df.to_csv('products.csv', index=False, encoding='utf-8-sig')
print('数据抓取完成,已保存为products.csv')
代码说明:
- 请求头:使用
User-Agent
伪装成浏览器,减少被封禁的风险。 - 分页处理:通过循环遍历多个页面,抓取每一页的数据。
- 异常处理:使用
try...except
块来捕获请求和解析中的错误,确保爬虫在遇到问题时不会崩溃。 - 随机延迟:在请求之间添加随机延迟,以减少被网站识别为爬虫的风险。
- 数据存储:使用
pandas
将抓取的数据存储为CSV文件,方便后续分析。