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% 的爬虫需求。

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
4爷资源网 » Python爬虫进阶:使用 Scrapy 框架构建高效爬虫

提供最优质的资源集合

立即查看 了解详情