爬虫-Scrapy框架

Scrapy 是 Python 领域专业的爬虫开发框架,已经完成爬虫程序的大部分通用工具,因此 Scrapy 开发爬虫项目既简单又方便。

简介

异步处理框架,可配置和可扩展程度非常高,Python中使用最广泛的爬虫框架

安装

Ubuntu

传统方式

  1. 安装依赖库

    1
    sudo apt-get install python-dev build-essential libssl-dev libffi-dev liblxml2 libxml2-dev libxslt1-dev zlib1g-dev
  2. 升级pyasn1模块(可选)

    1
    sudo pip3 install pyasn1==0.4.4
  3. 安装Scrapy

    1
    sudo pip3 install Scrapy
  4. 验证安装完成

    1
    scrapy version

conda方式

见下面的Windows安装方式

Windows Or Mac

1
conda install Scrapy

框架的组成

组件 英文名 功能
引擎 Engine 整个框架的核心
调度器 Scheduler 接收从引擎发过来的URL,入队列
下载器 Downloader 下载网页源码,返回爬虫程序
项目管道 Item Pipeline 数据处理
下载器中间件 Downloader Middlewares 处理引擎与下载器直接按的请求和响应
蜘蛛中间件 Spider Middlewares 处理爬虫程序和输入的响应和输出结果以及新的请求
Item 定义爬取结果的数据结构,爬取的数据会被数值为Item对象

爬取流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sequenceDiagram
participant 爬虫程序
participant 引擎
participant 调度器
participant 下载器
participant 管道文件
爬虫程序->>引擎: 发送Urls
引擎->>调度器: Urls入队列
loop 多线程任务
调度器-->>引擎: Url
引擎->>下载器: Url(经过下载器中间件)
下载器->>下载器: 网络请求
下载器-->>引擎: reponse
引擎-->>爬虫程序: response(经过蜘蛛中间件)
爬虫程序->>爬虫程序: xpath解析
爬虫程序->>引擎: 解析后的数据+(新的Url)
引擎->>管道文件: 解析后的数据
管道文件->>管道文件: 持久化
引擎->>调度器: 新的Urls进队列
end

制作Scrapy爬虫项目的步骤

  1. 新建项目

    1
    scrapy startproject Lianjia
  2. 明确目标(item.py)

    1
    2
    3
    class LianjiaItem(scrapy.Item):
    houseName = scrapy.Field()
    housePrice = scrapy.Field()
  3. 制作爬虫程序

    1
    cd Lianjia
    1
    scrapy startproject LianjiaSpider lianjia.com
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class LianjiaSpider(scrapy.Spider):
    # 爬虫名
    name = 'lianjia'
    # 允许域
    allowed_domains = ['lianjia.com']
    # 起始URL
    start_urls = ['']

    def parse(self,response):
    pass
  4. 处理数据pipeline

    1
    2
    3
    class LianjiaPipeline(object):
    def process_item(self,item,spider):
    return item
  5. 配置setting.py
    下面专门提到

  6. 运行爬虫项目

    1
    scrapy crawl 蜘蛛名

项目目录文件详解

1
2
3
4
5
6
7
8
9
10
├── test
│   ├── __init__.py
│   ├── items.py # 定义爬取数据的结构
│   ├── middlewares.py # 下载器中间件和蜘蛛中间件的实现
│   ├── pipelines.py # 管道文件,处理数据
│   ├── settings.py # 项目全局配置
│   └── spiders # 存放爬虫程序的目录
│   ├── __init__.py
│   └── test_spider.py # 爬虫
└── scrapy.cfg # 项目基本配置文件,不用改

settings.py 详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 项目名称
BOT_NAME = 'moca'

# 爬虫程序(蜘蛛)的位置
SPIDER_MODULES = ['moca.spiders']
NEWSPIDER_MODULE = 'moca.spiders'

# robots协议开关;一般都写False
ROBOTSTXT_OBEY = True

# 配置最大并发量;默认16个
CONCURRENT_REQUESTS = 32

# 下载延迟时间,控制速度;默认3s
DOWNLOAD_DELAY = 3

# Cookie;默认开启 > 如果写成False,就不会验证FormRequest里面的cookie,会走下面DEFAULT_REQUEST_HEADERS里面的cookie
COOKIES_ENABLED = False

# 日志等级 默认DEBUG
# CRITICAL - 严重错误(critical)
# ERROR - 一般错误(regular errors)
# WARNING - 警告信息(warning messages)
# INFO - 一般信息(informational messages)
# DEBUG - 调试信息(debugging messages)
LOG_LEVEL = 'WARNING'

# 默认网络请求的请求头
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilia/5.0'
}

# 蜘蛛中间件
SPIDER_MIDDLEWARES = {
'moca.middlewares.MocaSpiderMiddleware': 543,
}

# 下载器中间件
DOWNLOADER_MIDDLEWARES = {
'moca.middlewares.MocaDownloaderMiddleware': 543,
}

# 管道文件;处理数据;后面数字是优先级,数字越小,优先级越高
ITEM_PIPELINES = {
'moca.pipelines.MocaPipeline': 300,
}




PyCharm运行Scrapy

  1. 创建启动脚本
    创建一个名字为run的py文件 和 scrapy.cfg同目录

  2. 编辑脚本

    1
    2
    from scrapy import cmdline
    cmdline.execute("scrapy crawl LianjiSpider".split())
  3. PyCharm配置
    Run -> Editconfigurations -> + -> python
    name:spider
    Script:选择刚才的Run脚本
    working directory: 改为项目路径

  4. 打开Run.py, 右键运行