悠悠楠杉
如何用Python制作爬虫?Scrapy框架入门指南
一、为什么选择Scrapy框架?
当我们需要批量获取网页数据时,Requests+BeautifulSoup组合虽简单,但面对大规模抓取时,Scrapy的优势便显现出来:
1. 异步处理机制:内置Twisted引擎支持并发请求
2. 结构化项目架构:清晰分离爬虫逻辑、数据模型和管道处理
3. 丰富的中间件:轻松处理Cookies、User-Agent轮换等反爬策略
安装只需一行命令:bash
pip install scrapy
二、创建第一个爬虫项目
通过终端初始化项目骨架:bash
scrapy startproject news_crawler
cd news_crawler
scrapy genspider news_spider example.com
生成的核心文件结构解析:
- items.py
:定义数据存储模型
- middlewares.py
:处理请求/响应中间件
- pipelines.py
:数据持久化管道
- /spiders
:存放爬虫脚本
三、编写爬虫核心逻辑
以抓取新闻网站为例,修改news_spider.py
:
python
import scrapy
class NewsSpider(scrapy.Spider):
name = "news"
start_urls = ['https://news.example.com/latest']
def parse(self, response):
for article in response.css('div.news-item'):
yield {
'title': article.css('h2::text').get(),
'summary': article.css('p.summary::text').get(),
'publish_time': article.css('time::attr(datetime)').get()
}
next_page = response.css('a.next-page::attr(href)').get()
if next_page:
yield response.follow(next_page, callback=self.parse)
关键点说明:
- css选择器
比XPath更易读写
- yield
实现增量式抓取
- response.follow
自动处理相对URL
四、突破反爬机制实战技巧
1. UserAgent伪装
在settings.py
中添加:python
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...'
]
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_useragents.downloadermiddlewares.useragents.UserAgentsMiddleware': 500,
}
2. IP代理池配置
通过中间件实现动态代理:python
class ProxyMiddleware:
def process_request(self, request, spider):
request.meta['proxy'] = 'http://proxy_ip:port'
3. 智能限速设置
python
AUTOTHROTTLE_ENABLED = True # 根据服务器响应动态调整请求频率
DOWNLOAD_DELAY = 2 # 基础延迟秒数
五、数据存储方案对比
| 存储方式 | 适用场景 | 代码示例 |
|----------------|-------------------|-----------------------------------|
| JSON文件 | 小型临时项目 | scrapy crawl news -o output.json
|
| MongoDB | 非结构化数据 | 通过Pipeline连接数据库 |
| MySQL | 关系型数据 | 使用SQLAlchemy处理表关系 |
| Elasticsearch | 全文检索需求 | 通过elasticsearch-py库索引 |
推荐使用Item Pipeline实现结构化存储:python
class MongoPipeline:
def process_item(self, item, spider):
db[spider.name].insert_one(dict(item))
return item
六、部署与调度进阶
- Scrapyd部署:
bash scrapyd-deploy default -p news_crawler
- 定时任务:配合Celery实现每日抓取
- 分布式扩展:使用Scrapy-Redis搭建集群
七、道德与法律边界
- 遵守
robots.txt
协议 - 设置合理的请求间隔(建议≥2秒)
- 避免抓取个人隐私数据
- 商业用途需获得网站授权
某电商平台爬虫案例:通过分析Ajax接口规律,配合Selenium模拟登录,最终实现每小时抓取5万条商品数据且稳定运行3个月未被封禁。
结语
掌握Scrapy只是爬虫工程师的起点,真正的挑战在于:
1. 如何识别网站的动态加载逻辑
2. 怎样设计高可用的分布式爬虫架构
3. 持续对抗不断升级的反爬技术
建议后续学习:
- 网页动态渲染(Splash/Puppeteer)
- 验证码识别方案
- 机器学习在反反爬中的应用