Scrapy 爬虫框架学习笔记(未完,持续更新)
Scrapy 爬虫框架
Scrapy 是一个用 Python 写的 Crawler Framework 。它使用 Twisted 这个异步网络库来处理网络通信。
Scrapy 框架的主要架构
根据它官网上的设计架构图,一个完整的 Spider 主要分成 7 个部分:Scrapy Engine,Scheduler,Downloader,Spider,Item Pipeline,Downloader middlewares,Spider 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 的工作流程,具体如下:
- 引擎打开一个网站,找到处理该网站的 Spider 并向该 Spider 请求第一个要爬取的 URL 。
- 引擎从 Spider 中获取第一个要爬取的 URL 并通过调度器以 Request 进行调度。
- 引擎向调度器请求下一个要爬取的 URL 。
- 调度器返回下一个要爬取的 URL 给引擎,引擎将 URL 通过下载中间件转发给下载器。
- 一旦页面下载完成,下载器生成一个该页面的 Response ,并将器通过下载中间件发送给引擎。
- 引擎从下载器中接收到 Response 并通过 Spider 中间件发送给 Spider 处理。
- Spider 处理 Response 并返回爬取到的 Item 及新的 Request 给引擎。
- 引擎将爬取到的 Item 给 Item Pipeline ,将 Request 给调度器。
- 重复直到调度器中没有更多的 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 爬虫框架学习笔记(未完,持续更新)的更多相关文章
- scrapy爬虫框架学习笔记(一)
scrapy爬虫框架学习笔记(一) 1.安装scrapy pip install scrapy 2.新建工程: (1)打开命令行模式 (2)进入要新建工程的目录 (3)运行命令: scrapy sta ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- linux学习笔记---未完待续,缓慢更新
做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...
- jQuery 学习笔记(未完待续)
一.jQuery概述 宗旨: Write Less, Do More. 基础知识: 1.符号$代替document.getElementById()函数 2.使 ...
- Scrapy爬虫框架学习
一.Scrapy框架简介 1. 下载页面 2. 解析 3. 并发 4. 深度 二.安装 linux下安装 pip3 install scrapy windows下安装 a.pip3 install w ...
- oracle-绑定变量学习笔记(未完待续)
--定义变量SQL> var a number; --给绑定变量赋值SQL> exec :a :=123; PL/SQL procedure successfully completed. ...
- Java学习笔记(未完待续)
变量的作用域(scope)是指变量可以在程序中引用的范围.在方法中定义的变量称为局部变量(local variable).局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止.局部变量都必 ...
- Greys学习笔记(未完待续)
Greys介绍 greys-anatomy是一个Java线上诊断工具,取名来自美剧<实习医生格雷>,由菜鸟-杜琨同学开发维护.比我们常用的脚本工具btrace提供更多的功能,greys采用 ...
- (阿里巴巴)数据库连接池——Druid (未完持续更新)
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...
随机推荐
- redis 系列,这里转发别人博客, 和常用命令
https://blog.csdn.net/qq_35433716/category_7944890.html 常用命令: https://www.cnblogs.com/mznsndy/p/1395 ...
- 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压
最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...
- 在模仿中精进数据分析与可视化01——颗粒物浓度时空变化趋势(Mann–Kendall Test)
本文是在模仿中精进数据分析与可视化系列的第一期--颗粒物浓度时空变化趋势(Mann–Kendall Test),主要目的是参考其他作品模仿学习进而提高数据分析与可视化的能力,如果有问题和建议,欢迎 ...
- 【模拟7.22】visit(卢卡斯定理&&中国剩余定理)
如此显然的组合数我把它当DP做,我真是.... 因为起点终点已经确定,我们发现如果我们确定了一个方向的步数其他方向也就确定了 组合数做法1: 设向右走了a步,然后向左走了b=a-n步,设向上为c,向下 ...
- CS 面试题目总结(问题+答案)
开源了一个新的github仓库CS 面试题目总结(问题+答案),主要总结一些CS大厂常见的面试问题,所有的问题与答案参考了网络上的许多博客和github仓库,也希望各位读者能够对这个仓库进行补充,毕竟 ...
- 基于 CentOS 8 搭建 openLDAP 服务器
转载请注明原文地址:基于 CentOS 8 搭建 openLDAP 服务器 环境 OS: CentOS 8.4.2105 PHP: 7.4.21 注意 CentOS 7 中可能默认提供了 openLD ...
- CAS你知道吗?底层如何实现?ABA问题又是什么?关于这些你知道答案吗
CAS你知道吗?如何实现? 1. compareAndSet 在volatile当中我们提到,volatile不能保证原子语义,所以当用到变量自增时,如果用到synchronized会太"重 ...
- hdu 4686 Arc of Dream 自己推 矩阵快速幂
A.mat[0][0] = 1, A.mat[0][1] = 1, A.mat[0][2] = 0, A.mat[0][3] = 0, A.mat[0][4] = 0; A.mat[1][0] = 0 ...
- SpringCloud:扩展zuul配置路由访问
继续上次整合SpringCloud的demo进行扩展zuul:https://www.cnblogs.com/nhdlb/p/12555968.html 这里我把zuul划分出一个模块单独启动 创建 ...
- Window server 2016 搭建Java Web环境
系统下载 下载种子(迅雷下载): ed2k://|file|cn_windows_server_2016_updated_feb_2018_x64_dvd_11636703.iso|629426585 ...