Python爬虫入门:从HTTP请求到数据存储的完整指南
1. 爬虫入门基础概念
第一次接触爬虫技术时,最困惑的就是"它到底是什么"。简单来说,爬虫就是模拟人类浏览网页行为的自动化程序。就像你用浏览器打开淘宝查看商品价格一样,爬虫能够自动完成这个操作,并把需要的数据提取出来。
为什么需要爬虫?举个例子,如果你要收集某电商平台1000款手机的价格做比价分析,手动操作可能需要整整一天。而用爬虫程序,可能几分钟就能搞定。我在做第一个爬虫项目时,需要收集全国300个城市的天气数据,手动操作根本不可能完成,这就是爬虫的价值所在。
2. HTTP请求基础
爬虫工作的核心就是发送HTTP请求。就像在浏览器地址栏输入网址后按回车一样,爬虫也需要发送这样的请求。Python中最常用的请求库是requests,它比内置的urllib更简单易用。
import requests response = requests.get('http://example.com') print(response.text) # 获取网页HTML内容这里有个新手常犯的错误:忘记检查请求状态。正确的做法应该是:
if response.status_code == 200: print('请求成功') # 处理网页内容 else: print('请求失败', response.status_code)3. 网页解析技术
获取网页内容后,下一步是从HTML中提取需要的数据。常用的解析方式有三种:
- 正则表达式:适合简单结构的文本提取
- BeautifulSoup:适合复杂的HTML解析
- lxml:性能最好的解析库
以BeautifulSoup为例:
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') titles = soup.find_all('h2', class_='title') # 获取所有h2标题实际项目中,我建议先用浏览器开发者工具(F12)分析目标数据的HTML结构,再编写对应的提取代码。这样能避免很多不必要的调试时间。
4. 数据存储方案
提取到的数据通常需要保存起来。根据数据量和用途,可以选择不同的存储方式:
- 小量数据:CSV或JSON文件
- 结构化数据:SQLite或MySQL
- 非结构化数据:MongoDB
import csv with open('data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['标题', '价格']) # 写入表头 for item in items: writer.writerow([item.title, item.price])5. 反爬虫应对策略
现代网站都有各种反爬虫机制,新手常会遇到请求被封禁的情况。常见对策包括:
- 设置请求头,模拟浏览器访问
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } response = requests.get(url, headers=headers)- 使用代理IP轮换
proxies = {'http': 'http://10.10.1.10:3128'} response = requests.get(url, proxies=proxies)- 控制请求频率
import time time.sleep(1) # 每次请求间隔1秒6. 遵守Robots协议
在编写爬虫时,必须尊重网站的Robots.txt协议。这个文件通常放在网站根目录下,例如https://www.taobao.com/robots.txt。它会声明哪些页面允许爬取,哪些禁止爬取。
合法的爬虫应该:
- 先检查robots.txt
- 设置合理的爬取间隔
- 不爬取敏感或个人数据
- 不对服务器造成过大压力
7. 第一个完整爬虫示例
下面是一个完整的天气数据爬取示例:
import requests from bs4 import BeautifulSoup import csv import time def get_weather(city): url = f'http://www.weather.com.cn/weather/{city}.shtml' headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(url, headers=headers) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') weather = soup.find('ul', class_='t clearfix') return [li.text.strip() for li in weather.find_all('li')] return [] cities = ['101010100', '101020100'] # 北京,上海 with open('weather.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['城市', '日期', '天气', '温度']) for city in cities: data = get_weather(city) for item in data: writer.writerow([city, *item.split()]) time.sleep(2) # 礼貌爬取8. 常见问题排查
新手常遇到的几个问题:
- 获取不到数据:检查元素选择器是否正确,网页是否动态加载
- 被封IP:添加请求头,使用代理,降低请求频率
- 编码问题:确保使用正确的字符编码,如utf-8
- SSL证书错误:添加verify=False参数(仅限测试环境)
9. 爬虫进阶方向
掌握基础后,可以学习以下进阶内容:
- Scrapy框架:专业的爬虫框架
- Selenium:处理动态网页
- 分布式爬虫:提高爬取效率
- 验证码识别:应对复杂反爬
- 数据清洗:提高数据质量
10. 爬虫伦理与法律
最后要强调的是,爬虫技术是把双刃剑。务必注意:
- 不爬取敏感数据
- 遵守网站的使用条款
- 控制爬取频率
- 尊重数据版权
- 不用于非法用途
我在实际项目中发现,保持良好爬虫道德的项目往往能长期稳定运行,而那些过度爬取的很快就会遇到各种限制。