1. Scrapy介绍
1.1. 什么是Scrapy
Scrapy是通用型的爬虫框架。所谓”通用”,就是用Scrapy做任何爬虫项目,都是适合的
1.2. Scrapy与urllib对比
- urlib只是一个库,Scrapy是一个框架
- urlib适合写单个爬虫文件,Scrapy适合写中大型爬虫项目
- urllib写简单爬虫文件,比较方便,但是不稳定,要亲自处理很多异常
1.3. Scrapy架构

- Engine引擎从爬虫文件Spider读取Request,交给Scheduler调度
- Scheduler让Downloader向目标URL发起请求
- 发起请求后,通过Request预先定义好的callback,将得到的Response作为callback的参数,交给Spider去处理
- Spider根据响应结果,解析HTML,将爬到的数据封装成item
- item交给一个个pipeline去完成后续处理,如存入数据库
2. 安装Scrapy
2.2. Windows 安装
安装Scrapy会遇到不少错误,建议按照以下步骤安装。
先升级pip1
python -m pip install --upgrade pip
Scrapy依赖Twisted,但是pip无法直接安装Twisted,需要以wheel的方式安装,所以先安装wheel1
pip install wheel
安装lxml。Scrapy依赖lxml解析HTML和XML。如果发现用pip无法安装lxml,则像后面安装Twisted一样,进入python lfd网站,下载对应的二进制wheel包进行安装1
pip install lxml
安装Twisted,如果直接通过pip install Twisted安装,会发现出错:1
2building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools":
解决方法是通过wheel安装。进入https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载对应的Twisted版本。我的环境是python37的64位版本,所以下载 Twisted-18.9.0-cp37-cp37m-win_amd64.whl。其中cp37对应python37,win_amd64对应64位版本。注意32/64位不是看当前系统的版本,而是以python的版本为准,版本信息可以通过python命令查看。1
2
3$ python
# [MSC v.1914 64 bit (AMD64)] 说明是64位
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
下载完之后,通过wheel安装Twisted:1
pip install Twisted-18.9.0-cp37-cp37m-win_amd64.whl
最后用pip安装scrapy1
pip install scrapy
查看是否安装成功1
scrapy version
2.3. Linux 安装
升级pip1
python -m pip install --upgrade pip
安装wheel和lxml1
2pip install wheel
pip install lxml
安装Twisted,若不成功,则用wheel安装1
pip install Twisted
安装scrapy1
pip install scrapy
查看scrapy是否安装成功,报以下错误1
2$ scrapy verion
AttributeError: module 'lib' has no attribute 'Cryptography_HAS_SSL_ST'
3. Scrapy环境搭建
3.1. 创建Scrapy工程
scrapy startproject <工程名> 创建Scrapy工程1
scrapy startproject myspider
在当前目录下生成一个<工程名>目录,内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15> tree /F /A myspider
| scrapy.cfg # 项目配置文件
|
\---myspider # 核心目录,与工程目录名称一致
| items.py # 定义爬虫数据实体类
| middlewares.py # 爬虫中间件文件。如设置IP代理池、
| pipelines.py # 对爬取得到的实体对象进行处理,如输出、写入数据库等
| settings.py # 爬虫配置文件
| __init__.py
|
+---spiders # 存放你的爬虫文件
| | __init__.py
| |
| \---__pycache__
\---__pycache__
4. Scrapy指令
Scrapy指令根据作用域可分为两类:
- 全局指令: 在任何路径下都能执行
- 项目指令: 只能在Scrapy项目中才能执行
4.1. 全局指令
4.1.1. 查看全局指令
在Scrapy项目外,输入scrapy1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20> scrapy
Scrapy 1.6.0 - no active project
Usage:
scrapy <command> [options] [args]
# 以下都是全局指令
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
[ more ] More commands available when run from project directory
Use "scrapy <command> -h" to see more info about a command
4.1.2. fetch 获取某个网页
scrapy fetch <url> 通过Scrapy downloader获取某个网页1
scrapy fetch https://www.baidu.com
4.1.3. runspider 脱离Scrapy项目运行爬虫文件
一般爬虫文件是在Scrapy项目中运行的。有时创建Scrapy项目觉得麻烦,想直接运行下个爬虫文件,可以通过runspider指令
编写一个爬虫文件 spider_demo.py1
2
3
4
5
6
7
8
9
10
11import scrapy
class SpiderDemo(scrapy.Spider):
# 给spider取个name
name = 'baidu'
# 要爬的域名
allowed_domains = ['baidu.com']
# 起始爬取的URL
start_urls = ['https://www.baidu.com/']
def parse(self, response):
btn = response.css('#su').get()
print(btn)
scrapy runspider <爬虫文件> 运行指定的爬虫1
scrapy runspider spider_demo.py
4.1.4. settings 查看全局或者项目的settings.py配置
在全局执行,就是或者全局配置。在Scrapy项目中执行,就是当前项目settings.py的配置1
scrapy settings --get BOT_NAME
4.1.5. shell 交互式爬取
scrapy shell <要爬取的URL> 开启交互式python终端,用来调试爬虫代码1
scrapy shell http://www.baidu.com
4.1.6. version 查看版本
1 | scrapy version |
4.1.7. view 下载到本地爬取
scrapy view
4.2. 项目指令
4.2.1. 查看项目指令
在Scrapy项目中,输入scrapy,去掉全局指令,剩下的就是项目指令1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21> scrapy
Scrapy 1.6.0 - project: myspider
Usage:
scrapy <command> [options] [args]
Available commands:
bench Run quick benchmark test
check Check spider contracts
crawl Run a spider
edit Edit spider
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
list List available spiders
parse Parse URL (using its spider) and print the results
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
4.2.2. check
4.2.3. crawl 运行某个爬虫文件
scrapy crawl <爬虫名> 运行爬虫文件
4.2.4. edit 编辑某个某虫文件
4.2.5. list 列出当前项目可使用的爬虫文件
1 | scrapy list |
5. Scrapy部署流程
5.1. 服务器安装scrapyd
安装scrapyd1
pip install scrapyd
5.2. 客户端安装scrapyd-client
安装scrapyd-client1
pip install scrapyd-client
5.3. 服务器启动scrapyd服务
再修改scrapyd的配置文件 /usr/local/lib/python3.5/dist-packages/scrapyd/default_scrapyd.conf1
2# 修改监听的IP,默认是localhost
bind_address = 0.0.0.0
再重启scrapyd服务
直接运行scrapyd命令,会监听localhost:68001
scrapyd
5.4. 客户端部署爬虫到服务器
进入Scrapy项目的目录,编辑scrapy.cfg1
2
3
4
5# ===================== 以下是原本的内容
[deploy]
#url = http://localhost:6800/
project = myproject
# ===================== 以下是修改之后的内容
6. scrapyd命令使用
6.1. 查看帮助
1 | scrapyd --help |
7. Linux Scrapy
后台运行Scrapy1
2