Scrapy 爬虫框架

Scrapy 是一个用 Python 写的 Crawler Framework 。它使用 Twisted 这个异步网络库来处理网络通信。

Scrapy 框架的主要架构

根据它官网上的设计架构图,一个完整的 Spider 主要分成 7 个部分:Scrapy EngineSchedulerDownloaderSpiderItem PipelineDownloader middlewaresSpider middlewares

Scrapy 引擎( Engine ):负责控制数据流在系统种所有组件中流动,并在相应动作时触发事件。

调度器( Scheduler ) :调度器从引擎中接收 Request 并将它们入队,以便之后引擎请求 Request 时提供给引擎。

下载器( Downloader ):下载器负责获取页面数据并提供给引擎。

Spider :是 Scrapy 用户用于分析 Response 并提取 Item 或者额外跟进 URL 的类。每个 Spider 负责处理特定(或一些)网站。

Item Pipeline :负责处理被 Spider 提取出来的 Item 。例如数据持久化。

Downloader middlewares 下载中间件:是引擎与下载器之间特定的钩子,处理 Downloader 传递给引擎的 Response 。

Spider 中间件( Spider middlewares ):是引擎和 Spider 之间的特定钩子,处理 Spider 的输入( Response )和输出( Items 和 Response )。

这些模块的之间的数据流向可以清楚地反应 Scrapy 的工作流程,具体如下:

  1. 引擎打开一个网站,找到处理该网站的 Spider 并向该 Spider 请求第一个要爬取的 URL 。
  2. 引擎从 Spider 中获取第一个要爬取的 URL 并通过调度器以 Request 进行调度。
  3. 引擎向调度器请求下一个要爬取的 URL 。
  4. 调度器返回下一个要爬取的 URL 给引擎,引擎将 URL 通过下载中间件转发给下载器。
  5. 一旦页面下载完成,下载器生成一个该页面的 Response ,并将器通过下载中间件发送给引擎。
  6. 引擎从下载器中接收到 Response 并通过 Spider 中间件发送给 Spider 处理。
  7. Spider 处理 Response 并返回爬取到的 Item 及新的 Request 给引擎。
  8. 引擎将爬取到的 Item 给 Item Pipeline ,将 Request 给调度器。
  9. 重复直到调度器中没有更多的 Request ,引擎关闭该网站。

这和之前学习的普通的爬虫思路架构是很像的。

安装 Scrapy 框架

我用的 WSL2 ,直接安装即可。

pip install scrapy

Scrapy, Hello World!

创建一个新的文件夹做项目的根路径。然后运行命令创建项目:

scrapy startproject cnblogsSpider

然后他就会生成如下的项目目录。

.
└── cnblogSpider
├── cnblogSpider => 该项目的 python 模块
│ ├── __init__.py
│ ├── items.py => Item 文件
│ ├── middlewares.py => 中间件
│ ├── pipelines.py => Pipeline 文件
│ ├── settings.py => 配置文件
│ └── spiders => 放置 Spider 文件的文件夹
│ └── __init__.py
└── scrapy.cfg => 项目部署文件

在 Spiders 文件夹下创建一个文件 cnblogs_spider.py 然后编写如下代码:

import scrapy

class CnblogsSpider(scrapy.Spider):

    # * 爬虫的名字,必须唯一
name = "cnblogs"
allowed_domains = ["cnblogs.com"] # * 爬取入口 URL 列表,将会首先爬取这里面的 URL
start_urls = [
"http://www.cnblogs.com/qiyeboy/default.html?page=1"
] # * 用来解析返回的 Response 数据的方法
# * 每个 URL 相应后的 Response 都会传递给这个方法
# * 进行提取 item 以及 URL Request 对象
def parse(self, response):
pass

在 cnBlogsSpider 文件夹下执行:

scrapy crawl cnblogs

第一个爬虫就成功完成了。

Scrapy 命令行工具

scrapy shell 分为两种类型的命令,一种是必须在 Scrapy 项目下运行的,一种是全局命令。

startproject 命令:

语法scrapy startproject myproject

功能就是创建项目。

settings 命令:

语法scrapy settings [options]

在项目运行时,运行这个命令将会输出项目的设定值,否则就输出 Scrapy 的默认设定。

scrapy settings --get BOT_NAME
# cnblogSpider
scrapy settings --get DOWNLOAD_DELAY
# 0

runspider 命令:

语法scrapy runspider <spider_file.py>

在没有创建项目的情况下,运行一个编写好的 Spider 模块。

shell 命令:

语法scrapy shell [url]

用于启动 Scrapy shell , URL 可选。

scrapy shell "http://www.cnblogs.com/qiyeboy/default.html?page=1"

fetch 命令:

语法scrapy fetch <url>

使用 Scrapy 下载器下载给定的 URL ,并将内容送到终端。

如果是在项目内运行,会用项目内下载器的配置,如果不是就会用默认的 Scrapy Downloader 配置。

scrapy fetch --nolog "http://www.cnblogs.com/qiyeboy/default.html?page=1"
scrapy fetch --nolog --headers "http://www.cnblogs.com/qiyeboy/default.html?page=1"

view 命令:

语法scrapy view <url>

在浏览器中打开给定的 URL ,并以 Scrapy spider 获取到的形式展现。

scrapy view "http://www.cnblogs.com/qiyeboy/default.html?page=1"

bench 命令:

语法scrapy bench

测试 Scrapy 在硬件上的效率。

Spider 模块

Spider 模块最重要的一个功能就是从 Downloader 中处理好的 Response 数据提取出想要的 Item 或者是新的 URL 。 Scrapy 框架提供了 Selector 来帮助我们提取数据。

在不使用框架的时候,我们使用的是 BeautifulSoup 或者是 XPath 完成网页数据的提取。而在 Scrapy 的框架下,内置了这些数据提取的工具,让我们可以直接使用内置的选择器来完成数据的提取。

Selector 的用法

四个基本用法

xpath(query) :传入 XPath 表达式,返回表达式对应的所有节点的 selector list 列表。

css(query) :传入 CSS 表达式,返回表达式对应的所有节点的 selector list 列表。

extract() :序列化节点为 Unicode 字符串。

re(regex) :根据传入的正则表达式对数据进行提取

这个是 Scrapy 里面的 Selector 最常用的 4 个方法。在 Spider 文件里的 parse(self, response) 方法里,只要将传入的 Response 传入 Selector 里,就能构建一个 Selector 。

selector = Selector(response)

由于 XPath 和 CSS 查询非常普遍, Scrapy 在 Request 里内置了两个可以直接调用的方法: xpath(query) -> SelectorList ,和 css(query) -> SeletorList 。它们返回的都是选择器列表。于是我们可以使用这种简写方式跳过构造 Selector 。

我们尝试从 HTML 页面上提取信息,改写一下 parse(response) 方法:

def parse(self, response):
papers = response.xpath(".//*[@class='day']")
for paper in papers:
url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
title = paper.xpath(".//*[@class='postTitle']/a/span/text()").extract()[0]
time = paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
content = paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
print(url, title, time, content)

运行 scrapy crawl cnblogs 然后就可以发现成功获取了数据:

Scrapy 爬虫框架学习笔记(未完,持续更新)的更多相关文章

  1. scrapy爬虫框架学习笔记(一)

    scrapy爬虫框架学习笔记(一) 1.安装scrapy pip install scrapy 2.新建工程: (1)打开命令行模式 (2)进入要新建工程的目录 (3)运行命令: scrapy sta ...

  2. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  3. linux学习笔记---未完待续,缓慢更新

    做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...

  4. jQuery 学习笔记(未完待续)

    一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById()函数        2.使 ...

  5. Scrapy爬虫框架学习

    一.Scrapy框架简介 1. 下载页面 2. 解析 3. 并发 4. 深度 二.安装 linux下安装 pip3 install scrapy windows下安装 a.pip3 install w ...

  6. oracle-绑定变量学习笔记(未完待续)

    --定义变量SQL> var a number; --给绑定变量赋值SQL> exec :a :=123; PL/SQL procedure successfully completed. ...

  7. Java学习笔记(未完待续)

    变量的作用域(scope)是指变量可以在程序中引用的范围.在方法中定义的变量称为局部变量(local variable).局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止.局部变量都必 ...

  8. Greys学习笔记(未完待续)

    Greys介绍 greys-anatomy是一个Java线上诊断工具,取名来自美剧<实习医生格雷>,由菜鸟-杜琨同学开发维护.比我们常用的脚本工具btrace提供更多的功能,greys采用 ...

  9. (阿里巴巴)数据库连接池——Druid (未完持续更新)

    Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...

随机推荐

  1. runtime系统的Cello

    runtime系统的Cello 通过充当一个现代的.功能强大的runtime系统,Cello使许多以前在C中不切实际或笨拙的事情变得简单,例如: 通用数据结构 多态函数 接口/类型类 构造函数/析构函 ...

  2. CentOS 30分钟部署 .net core 在线客服系统

    前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程.期间有一些朋友希望能够给出 Linux 环境的安装部署指导,本文基于 CentOS 8.3 来安装部署.在本文中我 ...

  3. 【NX二次开发】Block UI 线性尺寸

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  4. Java中,一个存在十几年的bug...

    今天,分享一个JDK中令人惊讶的BUG,这个BUG的神奇之处在于,复现它的用例太简单了,人肉眼就能回答的问题,JDK中却存在了十几年.经过测试,我们发现从JDK8到14都存在这个问题. 大家可以在自己 ...

  5. 进程与线程 .Net Core系列-多线程

    进程与线程 进程: 狭义定义:进程是正在运行的程序的实例 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分 ...

  6. Tkinter 吐槽之一:多线程与 UI 交互

    背景 最近想简单粗暴的用 Python 写一个 GUI 的小程序.因为 Tkinter 是 Python 自带的 GUI 解决方案,为了部署方便,就直接选择了 Tkinter. 本来觉得 GUI 发展 ...

  7. base64的实现原理

    base64是处理二进制数据的一种编码方式,可用于把二进制数据编码成64个可打印的字符. 学习base64之前,先了解一下什么是字节与编码 什么是字节 互联网中的数据都是用字节来表示的,一个字节有8位 ...

  8. C++调用Libreoffice接口

    由于部分原因,只提供cpp文件,其中代码还需要优化 其中主要涉及了Excel的创建 Sheet页的增加.删除.重命名 表格的合并 表格背景.边框部分属性的设置 表格内字体部分属性设置 表格内容的读取和 ...

  9. 38、mysql数据库(pymysql及事务)

    38.1.python之pymysql模块: 1.说明: pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 2.模块安装: pip install pym ...

  10. iOS如何提升,首先得知自己的处境!(欢迎评论留言)

    聊聊行情?为什么总有人在乎旁人的看法而忽略自己的初衷?虽然iOS开发市场说不上好但也绝不算坏,想没想过那些煽风点火说iOS不行的人在做什么?真的转行从头开始?错.大错特错!在劝退你的同时他们会默默的学 ...