Python爬虫进阶:使用 Scrapy 框架构建高效爬虫
## 一、为什么选择 Scrapy?
当爬虫需求从”抓取几个页面”升级到”抓取数万条数据”时,手写脚本就力不从心了。Scrapy 是 Python 最强大的爬虫框架,具备:
– **高性能**:异步非阻塞,并发抓取
– **组件化**:Spider、Pipeline、Middleware 各司其职
– **内置功能**:去重、延时、重试、数据导出
– **可扩展**:中间件机制支持自定义逻辑
## 二、安装与创建项目
“`bash
# 安装 Scrapy
pip install scrapy
# 创建项目
scrapy startproject myspider
“`
项目结构:
“`
myspider/
├── scrapy.cfg # 配置文件
└── myspider/
├── items.py # 数据结构定义
├── middlewares.py # 中间件
├── pipelines.py # 数据处理管道
├── settings.py # 全局设置
└── spiders/ # 爬虫目录
“`
## 三、定义数据结构
在 items.py 中定义要抓取的数据:
“`python
import scrapy
class ArticleItem(scrapy.Item):
title = scrapy.Field() # 文章标题
author = scrapy.Field() # 作者
publish_time = scrapy.Field() # 发布时间
content = scrapy.Field() # 文章内容
url = scrapy.Field() # 文章链接
“`
## 四、编写爬虫
在 spiders/ 目录创建 article_spider.py:
“`python
import scrapy
from myspider.items import ArticleItem
class ArticleSpider(scrapy.Spider):
name = ‘article’
allowed_domains = [‘example.com’]
start_urls = [‘https://example.com/articles/’]
def parse(self, response):
# 提取文章列表
articles = response.css(‘.article-item’)
for article in articles:
item = ArticleItem()
item[‘title’] = article.css(‘.title::text’).get()
item[‘author’] = article.css(‘.author::text’).get()
item[‘url’] = article.css(‘a::attr(href)’).get()
# 跟进详情页获取完整内容
yield response.follow(
item[‘url’],
callback=self.parse_detail,
meta={‘item’: item}
)
# 翻页处理
next_page = response.css(‘.next-page::attr(href)’).get()
if next_page:
yield response.follow(next_page, callback=self.parse)
def parse_detail(self, response):
item = response.meta[‘item’]
item[‘content’] = response.css(‘.content’).get()
item[‘publish_time’] = response.css(‘.date::text’).get()
yield item
“`
## 五、数据处理管道
在 pipelines.py 中处理抓取的数据,支持保存为 JSON 或数据库:
“`python
import json
import sqlite3
class JsonPipeline:
“””保存为 JSON 文件”””
def open_spider(self, spider):
self.file = open(‘articles.json’, ‘w’, encoding=’utf-8′)
def close_spider(self, spider):
self.file.close()
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + ‘n’
self.file.write(line)
return item
“`
## 六、配置设置
在 settings.py 中启用管道和优化参数:
“`python
# 启用管道
ITEM_PIPELINES = {
‘myspider.pipelines.JsonPipeline’: 300,
}
# 并发设置
CONCURRENT_REQUESTS = 16
DOWNLOAD_DELAY = 0.5
# 用户代理
USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)’
# 遵守 robots.txt
ROBOTSTXT_OBEY = True
“`
## 七、运行爬虫
“`bash
# 运行爬虫
scrapy crawl article
# 导出为 JSON
scrapy crawl article -o articles.json
# 导出为 CSV
scrapy crawl article -o articles.csv
“`
## 八、高级特性
### 8.1 下载中间件
可以添加代理和随机 User-Agent:
“`python
class ProxyMiddleware:
def process_request(self, request, spider):
request.meta[‘proxy’] = ‘http://your-proxy:port’
return None
“`
### 8.2 分布式爬虫
使用 scrapy-redis 实现分布式爬取:
“`bash
pip install scrapy-redis
“`
## 九、总结
Scrapy 是构建生产级爬虫的利器。相比手动脚本:
– 代码结构清晰,易于维护
– 性能优异,适合大规模抓取
– 功能完善,开箱即用
掌握 Scrapy 后,你可以轻松应对 90% 的爬虫需求。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
4爷资源网 » Python爬虫进阶:使用 Scrapy 框架构建高效爬虫