【6.0】爬虫之scrapy框架
【一】Scrapy框架基本介绍
【1】Scrapy一个开源和协作的框架
- 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,
- 使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。
- 但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
- Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。
- 因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。
- Scrapy框架类似于Django框架
【2】整体架构大致如下
Components:
- 1、引擎(EGINE)
- 引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。
- 2、调度器(SCHEDULER)
- 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.
- 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
- 3、下载器(DOWLOADER)
- 用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
- 4、爬虫(SPIDERS)
- SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求
- 5、项目管道(ITEM PIPLINES)
- 在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
- 下载器中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
- 6、爬虫中间件(Spider Middlewares)
- 位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)
【3】官网链接
【二】安装
【1】Windows平台
(1)安装wheel文件
- 在 Windows 平台上安装 Scrapy 之前
- 首先需要安装
wheel
文件。wheel
文件是一种 Python 包的分发格式,可以方便地进行安装。 - 可以通过以下命令来安装
wheel
:
- 首先需要安装
pip3 install wheel
(2)安装 lxml 解析器
- Scrapy 使用
lxml
解析器来进行 HTML 和 XML 的解析工作。 - 要安装
lxml
,可以执行以下命令:
pip3 install lxml
(3)安装 pyopenssl
- Scrapy 在进行 HTTPS 请求时,需要使用
pyopenssl
模块来提供 SSL/TLS 支持。 - 安装
pyopenssl
可以使用以下命令:
pip3 install pyopenssl
(4)下载并安装pywin32
-
下载并安装
pywin32
可以从其官网下载最适合您的版本:https://sourceforge.net/projects/pywin32/files/pywin32/ -
请根据您的操作系统和Python版本选择正确的安装文件进行下载。
-
下载完成后,按照安装向导进行安装。
(5)下载twisted的wheel文件
- 要安装 Scrapy,需要先下载
twisted
的wheel
文件。 - 可以从官方网站下载
twisted
的wheel
文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted - 请注意选择与您的Python环境相匹配的
wheel
文件进行下载。
(6)安装twisted
- 下载完成
twisted
的wheel
文件后,可以使用以下命令安装twisted
:
pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd**.whl
- 将
下载目录
替换为您实际下载twisted
wheel
文件所在的目录- 并根据您的 Python 环境选择正确的文件名进行替换。
(7)安装scrapy(可以优先尝试这个命令,报错再按照上述安装对应的依赖)
- 当上述依赖项都安装完成后,可以使用以下命令来安装 Scrapy:
pip3 install scrapy
【2】Linux平台
- 在 Linux 平台上安装 Scrapy,可以通过以下命令进行安装:
pip3 install scrapy
【三】命令行工具
【1】查看帮助
scrapy -h
scrapy <command> -h
- 第一个命令用于查看全部可用命令的帮助信息
- 第二个命令用于查看特定命令的帮助信息
【2】全局命令(Global commands)和项目命令(Project-only commands)
- 其中Project-only必须切到项目文件夹下才能执行,而Global的命令则不需要
Global commands:
startproject #创建项目
genspider #创建爬虫程序
settings #如果是在项目目录下,则得到的是该项目的配置
runspider #运行一个独立的python文件,不必创建项目
shell #scrapy shell url地址 在交互式调试,如选择器规则正确与否
fetch #独立于程单纯地爬取一个页面,可以拿到请求头
view #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
version #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依赖库的版本
Project-only commands:
crawl #运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY = False
check #检测项目中有无语法错误
list #列出项目中所包含的爬虫名
parse #scrapy parse url地址 --callback 回调函数 #以此可以验证我们的回调函数是否正确
bench #scrapy bentch压力测试
全局命令(Global commands):
startproject
:创建一个新的 Scrapy 项目。genspider
:创建一个新的爬虫程序。settings
:显示一个 Scrapy 项目的配置信息。runspider
:运行一个独立的 Python 文件作为爬虫,不需要创建项目。shell
:进入 Scrapy 的交互式调试环境,可以检查选择器规则是否正确。fetch
:单独请求一个页面,并获取响应结果。view
:下载指定页面并在浏览器中打开,用于检查通过哪些请求获取数据。version
:查看当前安装的 Scrapy 版本号。项目命令(Project-only commands):
crawl
:运行一个 Scrapy 爬虫,必须在项目目录下执行且确保配置文件中的ROBOTSTXT_OBEY
设置为False
。check
:检查项目中是否存在语法错误。list
:列出项目中包含的所有爬虫名称。parse
:使用回调函数解析给定的 URL,用于验证回调函数是否正确。bench
:用于对 Scrapy 进行压力测试。
【3】官网链接
- 如果需要更详细的命令信息,可以参考 Scrapy 官方文档的命令行工具部分
- https://docs.scrapy.org/en/latest/topics/commands.html
【四】创建项目
【1】创建步骤
- 创建项目命令:
scrapy startproject 项目名
- 进入爬虫项目文件
cd NewsPro
- 创建spider项目
scrapy genspider wangyi news.163.com
scrapy genspider huanqiu huanqiu.com
【2】目录结构
├── NewsPro # 项目名
│ ├── __init__.py
│ ├── items.py # 类似于django的 models表模型,一个个模型类
│ ├── middlewares.py # 中间件
│ ├── pipelines.py # 管道---》写持久化
│ ├── settings.py # 项目配置文件
│ └── spiders # 里面放了自定义的爬虫,类似于app
│ ├── __init__.py
│ ├── huanqiu.py # 自定义爬虫
│ └── wangyi.py # 自定义爬虫
└── scrapy.cfg # 项目上线配置
- 文件说明:
- scrapy.cfg
- 项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
- items.py
- 设置数据存储模板,用于结构化数据
- 如:Django的Model
- pipelines
- 数据处理行为
- 如:一般结构化的数据持久化
- settings.py
- 配置文件
- 如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效,正确写法USER_AGENT='xxxx'
- spiders
- 爬虫目录
- 如:创建文件,编写爬虫规则
【3】简单使用
wangyi.py
import scrapy
class WangyiSpider(scrapy.Spider):
name = "wangyi"
allowed_domains = ["news.163.com"]
start_urls = ["http://news.163.com/"]
def parse(self, response):
print("response:::", response.text)
【4】启动爬虫程序
scrapy crawl wangyi
【5】优化启动程序
- 每一次终端启动和麻烦,我们可以在项目根目录下新建启动文件
- bin.py:
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'wangyi', "--nolog"])
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17647614.html