Python爬虫入门教程:使用requests库
爬虫是数据获取的重要手段,下面我将通过一个完整的示例,教你如何使用Python的requests库编写一个简单的爬虫。我们将以爬取豆瓣电影Top250为例。
【python】网络爬虫教程 - 教你用python爬取豆瓣电影 Top250
1. 环境准备
首先需要安装必要的库:
pip install requests beautifulsoup4
2. 项目结构规划
一个简单的爬虫项目通常包含以下模块:
- 发送HTTP请求获取页面内容
- 解析HTML提取数据
- 数据存储
- 控制爬虫行为(如翻页、延时)
3. 编写爬虫代码
下面是一个完整的爬虫示例:
import requests
from bs4 import BeautifulSoup
import time
import random
import csvclass 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.textelse:print(f"请求失败,状态码: {response.status_code}")return Noneexcept requests.exceptions.RequestException as e:print(f"请求异常: {e}")return Nonedef parse_page(self, html_content):"""解析HTML内容,提取电影信息"""if not html_content:returnsoup = 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("没有数据可保存")returnwith 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提高效率
这个爬虫示例展示了基本的爬虫架构和实现方法。实际应用中,你可以根据目标网站的结构调整解析逻辑,或者添加更多功能如图片下载、数据可视化等。