
大家好,干货我是份详菜鸟哥!
之前分享了很多 requests 、实的收藏selenium 的爬虫 Python 爬虫文章,本文将从原理到实战带领大家入门另一个强大的教程框架 Scrapy。如果对Scrapy感兴趣的干货话,不妨跟随本文动手做一遍!份详

Scrapy是爬虫:由Python语言开发的一个快速、高层次的教程屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的干货数据,只需要实现少量的份详代码,就能够快速的实的收藏抓取。
Scrapy框架的教程运行原理看下面一张图就够了(事实上原理是比较复杂的,也不是三言两语能够说清楚的,免费信息发布网因此感兴趣的读者可以进一步阅读更多的相关文章来了解,本文不做过多讲解)

Scrapy主要包括了以下组件:
引擎(Scrapy Engine) Item 项目 调度器(Scheduler) 下载器(Downloader) 爬虫(Spiders) 项目管道(Pipeline) 下载器中间件(Downloader Middlewares) 爬虫中间件(Spider Middlewares) 调度中间件(Scheduler Middewares)第一种:在命令行模式下使用pip命令即可安装:
$ pip install scrapy
第二种:首先下载,然后再安装:
$ pip download scrapy -d ./
# 通过指定国内镜像源下载
$pip download -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy -d ./
进入下载目录后执行下面命令安装:
$ pip install Scrapy-1.5.0-py2.py3-none-any.whl
1.)使用大概分为下面四步 1 创建一个scrapy项目
scrapy startproject mySpider
2.) 生成一个爬虫
scrapy genspider demo "demo.cn"
3.) 提取数据
完善spider 使用xpath等
4.) 保存数据
pipeline中保存数据
在命令中运行爬虫
scrapy crawl qb # qb爬虫的名字
在pycharm中运行爬虫
from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())
Scrapy 爬虫框架的具体使用步骤如下:
“
选择目标网站
定义要抓取的数据(通过Scrapy Items来完成的)
编写提取数据的spider
执行spider,获取数据
数据存储
”
当我们创建了一个scrapy项目后,继续创建了一个spider,目录结构是这样的:

下面来简单介绍一下各个主要文件的作用:
“
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
”
项目配置文件。这个是文件的内容:
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html
[settings]
default = mySpider.settings
[deploy]
#url = http://localhost:6800/
project = mySpider
项目的Python模块,将会从这里引用代码
项目的目标文件
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
定义scrapy items的模块,示例: name = scrapy.Field()
5.4 mySpider/pipelines.py项目的管道文件
# Define your item pipelines here
#
# Dont forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class MyspiderPipeline:
def process_item(self, item, spider):
return item
这个文件也就是我们说的管道,当Item在Spider中被收集之后,它将会被传递到Item Pipeline(管道),这些Item Pipeline组件按定义的云南idc服务商顺序处理Item。每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用:
验证爬取的数据(检查item包含某些字段,比如说name字段) 查重(并丢弃) 将爬取结果保存到文件或者数据库中项目的设置文件
# Scrapy settings for mySpider project
...
BOT_NAME = mySpider # scrapy项目名
SPIDER_MODULES = [mySpider.spiders]
NEWSPIDER_MODULE = mySpider.spiders
.......
# Obey robots.txt rules
ROBOTSTXT_OBEY = False # 是否遵守协议,一般给位false,但是创建完项目是是True,我们把它改为False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32 # 最大并发量 默认16
......
#DOWNLOAD_DELAY = 3 # 下载延迟 3秒
# Override the default request headers: # 请求报头,我们打开
DEFAULT_REQUEST_HEADERS = {
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,
Accept-Language: en,
}
# 爬虫中间件
#SPIDER_MIDDLEWARES = {
# mySpider.middlewares.MyspiderSpiderMiddleware: 543,
#}
# 下载中间件
#DOWNLOADER_MIDDLEWARES = {
# mySpider.middlewares.MyspiderDownloaderMiddleware: 543,
#}
......
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
# mySpider.pipelines.MyspiderPipeline: 300, # 管道
#}
.......
省略号省略代码,一般重要点,给了注释
import scrapy
class DbSpider(scrapy.Spider):
name = db
allowed_domains = [douban.com] # 可以修改
start_urls = [http://douban.com/] # 开始的url也可以修改
def parse(self, response):
# pass
Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据,但是一般使用的不多。感兴趣的查看官方文档:
官方文档
http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html
Scrapy Shell根据下载的页面会自动创建一些方便使用的对象,例如 Response 对象,服务器托管以及 Selector 对象 (对HTML及XML内容)。
当shell载入后,将得到一个包含response数据的本地 response 变量,输入 response.body将输出response的包体,输出 response.headers 可以看到response的包头。 输入 response.selector 时, 将获取到一个response 初始化的类 Selector 的对象,此时可以通过使用 response.selector.xpath()或response.selector.css() 来对 response 进行查询。 Scrapy也提供了一些快捷方式, 例如 response.xpath()或response.css()同样可以生效(如之前的案例)。 Selectors选择器“
Scrapy Selectors 内置 XPath 和 CSS Selector 表达式机制
”
Selector有四个基本的方法,最常用的还是xpath:
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 extract(): 序列化该节点为字符串并返回list css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4 re(): 根据传入的正则表达式对数据进行提取,返回字符串list列表本节,我将使用Scrapy爬取站酷数据作为示例

既然已经初步了解了scrapy的工作流程以及原理,我们来做一个入门的小案例,爬取站酷首页推荐的item信息。如下图所示,一个小方框就是一个item信息。我们要提取每一个item的六个组成部分:
imgLink(封面图片链接); title(标题); types(类型); vistor(人气); comment(评论数); likes(推荐人数)
然后只是一个页面的item,我们还要通过翻页实现批量数据采集。
在上一篇中我们说明了新建scrapy项目(zcool)和spider项目(zc),这里不再赘述,然后得到我们的目录结构如下图所示:

然后为了方便运行,在zcool目录下新建start文件。并进行初始化设置。
from scrapy import cmdline
cmdline.execute(scrapy crawl zc.split())
settings.py文件在这个文件里我们需要做几样设置