Python爬虫入门教程:使用requests库
爬虫是数据获取的重要手段,下面我将通过一个完整的示例,教你如何使用Python的requests库编写一个简单的爬虫。我们将以爬取豆瓣电影Top250为例。
【python】网络爬虫教程 - 教你用python爬取豆瓣电影 Top250
1. 环境准备
首先需要安装必要的库:
bash
pip install requests beautifulsoup4
2. 项目结构规划
一个简单的爬虫项目通常包含以下模块:
- 发送HTTP请求获取页面内容
- 解析HTML提取数据
- 数据存储
- 控制爬虫行为(如翻页、延时)
3. 编写爬虫代码
下面是一个完整的爬虫示例:
python
import requests
from bs4 import BeautifulSoup
import time
import random
import csv
class DoubanSpider:
def __init__(self):
# 设置请求头,模拟浏览器访问
self.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'
}
# 存储结果的列表
self.movies = []
def get_page(self, page_num):
"""获取指定页数的HTML内容"""
url = f'https://movie.douban.com/top250?start={page_num*25}'
try:
response = requests.get(url, headers=self.headers, timeout=10)
# 检查响应状态码
if response.status_code == 200:
return response.text
else:
print(f"请求失败,状态码: {response.status_code}")
return None
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
return None
def parse_page(self, html_content):
"""解析HTML内容,提取电影信息"""
if not html_content:
return
soup = BeautifulSoup(html_content, 'html.parser')
# 查找所有电影项
movie_items = soup.select('div.item')
for item in movie_items:
try:
# 提取电影标题
title = item.select_one('span.title').text
# 提取评分
rating = item.select_one('span.rating_num').text
# 提取简介
quote = item.select_one('span.inq')
quote = quote.text if quote else '无简介'
# 提取导演和主演
info = item.select_one('div.bd p').text.strip()
# 添加到结果列表
self.movies.append({
'title': title,
'rating': rating,
'quote': quote,
'info': info
})
except Exception as e:
print(f"解析错误: {e}")
def save_to_csv(self, filename='douban_movies.csv'):
"""将结果保存为CSV文件"""
if not self.movies:
print("没有数据可保存")
return
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
fieldnames = ['title', 'rating', 'quote', 'info']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# 写入表头
writer.writeheader()
# 写入数据
writer.writerows(self.movies)
print(f"数据已保存到 {filename}")
def run(self, pages=10):
"""运行爬虫,爬取指定页数的数据"""
for page in range(pages):
print(f"正在爬取第 {page+1} 页...")
html_content = self.get_page(page)
self.parse_page(html_content)
# 设置随机延时,避免频繁请求
delay = random.uniform(1, 3)
print(f"等待 {delay:.2f} 秒后继续...")
time.sleep(delay)
# 保存数据
self.save_to_csv()
print(f"共爬取 {len(self.movies)} 条电影数据")
# 运行爬虫
if __name__ == "__main__":
spider = DoubanSpider()
# 爬取前10页数据,共250条
spider.run(pages=10)
4. 代码解析
这个爬虫程序包含以下关键部分:
-
请求处理:
get_page
方法发送HTTP请求获取网页内容- 设置了请求头和超时时间,提高稳定性
- 处理了可能的请求异常
-
数据解析:
parse_page
方法使用BeautifulSoup解析HTML- 通过CSS选择器定位电影信息元素
- 提取标题、评分、简介等关键信息
-
数据存储:
save_to_csv
方法将结果保存为CSV文件- 使用UTF-8-sig编码确保中文正常显示
-
爬虫控制:
run
方法控制爬取流程- 设置随机延时避免被封IP
- 支持指定爬取页数
5. 进阶优化建议
-
添加异常处理:可以增强错误处理机制,例如失败重试功能
-
使用代理IP:爬取大量数据时,使用代理IP避免被封
-
数据清洗:提取数据后进行清洗和验证
-
存储优化:可以使用数据库存储数据,如SQLite、MySQL等
-
异步请求:对于大规模爬取,可以考虑使用aiohttp提高效率
这个爬虫示例展示了基本的爬虫架构和实现方法。实际应用中,你可以根据目标网站的结构调整解析逻辑,或者添加更多功能如图片下载、数据可视化等。