1. 爬虫入门:从零到一的实战指南
第一次接触爬虫时,我盯着屏幕上滚动的数据流,感觉像在破解某种数字密码。Python爬虫本质上就是让程序代替人工,自动从网页上抓取我们需要的信息。对于电商价格监控、舆情分析或者学术研究,这项技能都能让你效率提升十倍不止。
初学者常犯的错误是直接跳进复杂的Scrapy框架,结果被各种概念绕晕。我的建议是从最基础的requests和BeautifulSoup开始,就像学游泳先在浅水区练习基本动作。你需要准备的只有:
- Python 3.6+环境(推荐Anaconda全家桶)
- 一个趁手的IDE(VS Code或PyCharm社区版足矣)
- 目标网站(建议先用豆瓣电影这类对爬虫友好的站点练手)
重要提示:务必遵守robots.txt协议,控制访问频率(建议2秒/次),避免给服务器造成负担。我在早期曾因高频请求被封IP,这个教训值千金。
2. 核心工具链解析
2.1 requests库:网络请求的瑞士军刀
安装只需一行命令:
pip install requests经典GET请求示例:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } response = requests.get('https://movie.douban.com/top250', headers=headers) print(response.status_code) # 200表示成功这里有几个关键点:
- User-Agent伪装成浏览器访问,避免被识别为爬虫
- status_code检查必不可少,我遇到过403禁止访问却傻等半小时的情况
- 超时参数timeout=10一定要设置,否则可能卡死线程
2.2 BeautifulSoup:HTML解析利器
配合requests使用的标准姿势:
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') titles = soup.find_all('span', class_='title') for title in titles: print(title.get_text())实际项目中我总结的经验:
- 用class_而不是class(Python关键字冲突)
- get_text()比直接.text更安全,能处理嵌套标签
- 遇到动态加载内容时,需要结合浏览器开发者工具分析真实请求
3. 完整爬虫实战:豆瓣Top250电影抓取
3.1 分页爬取策略
观察URL规律发现分页参数:
第1页:https://movie.douban.com/top250?start=0 第2页:https://movie.douban.com/top250?start=25 ...封装成函数:
def scrape_douban(page): url = f'https://movie.douban.com/top250?start={(page-1)*25}' response = requests.get(url, headers=headers) # 解析逻辑...3.2 数据存储方案
对于小型项目,CSV是最佳选择:
import csv with open('movies.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['排名', '片名', '评分']) # 循环写入数据...当数据量超过1万条时,建议升级到SQLite:
import sqlite3 conn = sqlite3.connect('movies.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS movies (id INT PRIMARY KEY, title TEXT, rating REAL)''')4. 反爬虫应对手册
4.1 常见反爬措施破解
验证码识别:对于简单数字验证码,可以使用Tesseract OCR
import pytesseract from PIL import Image captcha = Image.open('captcha.png') text = pytesseract.image_to_string(captcha)IP封锁:建议使用免费代理池(如西刺代理)
proxies = { 'http': 'http://123.123.123.123:8080', 'https': 'https://123.123.123.123:8080' } response = requests.get(url, proxies=proxies)请求频率控制:使用time模块做间隔
import time import random time.sleep(random.uniform(1, 3)) # 随机间隔更自然
4.2 法律风险规避
务必注意:
- 检查目标网站的robots.txt(如https://www.douban.com/robots.txt)
- 商业用途需获得授权
- 个人学习也要控制爬取量
- 敏感数据(用户信息等)绝对不要碰
5. 性能优化技巧
5.1 多线程加速
使用concurrent.futures实现并行:
from concurrent.futures import ThreadPoolExecutor urls = [f'https://movie.douban.com/top250?start={i*25}' for i in range(10)] with ThreadPoolExecutor(max_workers=4) as executor: executor.map(scrape_page, urls)5.2 断点续爬方案
记录已爬取的URL:
import pickle # 保存进度 with open('progress.pkl', 'wb') as f: pickle.dump(crawled_urls, f) # 读取进度 try: with open('progress.pkl', 'rb') as f: crawled_urls = pickle.load(f) except FileNotFoundError: crawled_urls = set()6. 项目进阶路线
当基础爬虫无法满足需求时,可以考虑:
Scrapy框架:适合大型爬虫项目
pip install scrapy scrapy startproject doubanSelenium自动化:处理JavaScript渲染页面
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://movie.douban.com')分布式爬虫:使用Scrapy-Redis实现多机协作
我在处理百万级数据采集时,发现几个关键优化点:
- 使用Redis作为请求队列
- 采用布隆过滤器去重
- 分离下载器和解析器进程
刚开始建议从修改这个豆瓣爬虫案例起步,比如增加导演、主演信息的抓取,或者把数据可视化做成评分分布图。真正的精进之道在于不断解决实际问题——上周我刚帮朋友写了个自动抓取招聘信息的脚本,用XPath定位元素比BeautifulSoup更精准,这就是另一个故事了。