Scrapy快速入手
# 安装
- Python3
- Scrapy 2.4.1
pip install scrapy
1
# 初始化 Scrapy 项目
scrapy startproject mrcdh_scrapy
1
# 目录结构
.
|—— mrcdh_scrapy
| |—— __init__.py ## 包定义
| |—— items.py ## 模型定义
| |—— pipelines.py ## 管道定义
| |—— settings.py ## 配置文件
| |__ spiders ## 蜘蛛文件夹
| |__ __init__.py ## 默认的蜘蛛代码文件
|__ scrapy.cfg ## Scrapy 的运行配置文件,改文件存放的目录被认为是项目的根目录
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 创建蜘蛛
cd mrcdh ## 进入创建的项目
scrapy genspider mrcdh mrcdh.cn
1
2
2
scrapy genspider
命令的第一个参数是蜘蛛的名称,第二个参数是指定 Scrapy
爬网的起始位置。
当genspider
命令执行成功后,会在项目spiders
目录下生成一个mrcdh.py
的代码文件,内容如下所示:
import scrapy
class MrcdhSpider(scrapy.Spider):
name = 'mrcdh'
allowed_domains = ['mrcdh.cn']
start_urls = ['http://mrcdh.cn/']
def parse(self, response):
pass
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
这个蜘蛛只会向http://mrcdh.cn
发送请求,没有其他操作。
# 启动爬虫
使用名称为mrcdh
的蜘蛛进行爬网
scrapy crawl mrcdh
1
# 数据模型Item
Item
是一种数据容器,是作为蜘蛛与管道之剑的数据载体,蜘蛛对收集的数据结构进行分析后提取出具体的数据结构并生成对应的Item
实例,然后由Scrapy
引擎传递给对应的管道
进行后处理。
# 声明Item
Item
使用简单的 class
定义语法和 Field
对象来进行声明,只要将Item
继承scrapy.Item
,每个属性的默认值都构造一个scrapy.Field()
实例既可以。
Field
对象指明了每个字段的元数据。
打开items.py
发现创建项目是自动生成了一个模型类。
import scrapy
class MrcdhScrapyItem(scrapy.Item):
pass
1
2
3
4
2
3
4
只需要在类中定义字段即可:
import scrapy
class MrcdhScrapyItem(scrapy.Item):
title = scrapy.Field() # 标题
link = scrapy.Field() # 链接
author = scrapy.Field() # 作者
time = scrapy.Field() # 时间
category = scrapy.Field() # 分类
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Item
继承自DictItem
这个与字典类用法相似的类,所以当Item
被实例化后直接当做字典来使用。
# 设置字段的值
mrcdh_item = MrcdhScrapyItem()
mrcdh_item['title'] = 'Scrapy的基本使用'
mrcdh_item['link'] = 'http://mrcdh.cn'
1
2
3
2
3
# 获取字段的值
>>> mrcdh_item['title']
Scrapy的基本使用
>>> mrcdh_item['link']
http://mrcdh.cn
1
2
3
4
2
3
4
# 枚举字段的键-值
>>> mrcdh_item.keys()
['title', 'link', ...]
>>> mrcdh_item.items()
[('title', 'Scrapy的基本使用'), ('link', 'http://mrcdh.cn'), ...]
1
2
3
4
2
3
4
# 其他操作
# 复制 Item
mrcdh_item2 = mrcdh_item.copy()
1
# 根据Item
创建字典
dict(mrcdh_item)
1
# 根据字典创建Item
mrcdh_item = MrcdhScrapyItem({
'title': 'Scrapy的基本使用',
'link': 'http://mrcdh.cn',
...
})
1
2
3
4
5
2
3
4
5
# 扩展(继承)Item
# 通过继承原始 Item 来扩展 Item
class NewMrcdhItem(MrcdhScrapyItem){
tag = scrapy.Field() # 标签
}
1
2
3
4
2
3
4
上次更新: 2024/01/12, 11:30:32