运行流程

官网:https://docs.scrapy.org/en/latest/intro/overview.html

流程图如下:

组件

1、引擎(EGINE):负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分;

2、调度器(SCHEDULER):用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址;

3、下载器(DOWLOADER):用于下载网页内容,并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的;

4、爬虫(SPIDERS):SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求;

5、项目管道(ITEM PIPLINES):在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作;

6、下载器中间件(Downloader Middlewares):位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,以及从DOWNLOADER传到EGINE的响应response,可用该中间件做以下几件事:

1、process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);

2、change received response before passing it to a spider;

3、send a new Request instead of passing received response to a spider;

4、pass response to a spider without fetching a web page;

5、silently drop some requests.

7、爬虫中间件(Spider Middlewares):位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

安装

# Linux平台
pip3 install scrapy

命令参数

# 查看帮助
scrapy -h
scrapy <command> -h Global commands: # 全局命令
startproject # 创建项目,会在当前目录下创建项目文件夹 genspider # cd 进入项目目录,创建爬虫程序
scrapy genspider baidu_spider www.baidu.com
# 就会在spider目录下生成 baidu_spider.py 文件 settings # 如果是在项目目录下,则得到的是该项目的配置
> scrapy settings --get=SPIDER_MODULES
['first_crawl.spiders'] runspider # 运行一个独立的python文件,不必创建项目
ROBOTSTXT_OBEY = False
scrapy runspider baidu_spider.py的绝对路径 shell # scrapy shell url地址 在交互式调试,如选择器规则正确与否
scrapy shell https://www.baidu.com/
# 进入交互环境后,可执行命令:
response.text # 文本内容
response.body # 二进制内容
view(response) # 打开浏览器查看响应页面,已下载到本地
response.css('a') # 查找所有a标签
response.xpath('//a') # 查找所有a标签
quit() # 退出交互环境 fetch # 独立于程单纯地爬取一个页面,可以拿到请求头
scrapy fetch https://www.baidu.com/ # 直接获取所有信息,类似shell但没有交互调试 view # 下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求 version # scrapy version 查看scrapy的版本 scrapy version # -v查看scrapy依赖库的版本 Project-only commands: # 必须切到项目文件夹下才能执行
crawl # 运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY=False
scrapy crawl baidu_spider # 此处爬虫名称为name属性对应的爬虫 check # 检测项目中有无语法错误 list # 列出项目中所包含的爬虫名 parse # scrapy parse url地址 --callback 回调函数,以此可以验证我们的回调函数是否正确 bench # scrapy bentch压力测试,检测每分钟能爬取的网页数 # 官网链接
https://docs.scrapy.org/en/latest/topics/commands.html

项目结构

project_name/
scrapy.cfg
project_name/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
爬虫1.py
爬虫2.py
爬虫3.py
  • 文件说明:
  1. scrapy.cfg:项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在·settings.py·文件中;
  2. items.py:设置数据存储模板,用于结构化数据,如:Django的Model;
  3. pipelines:数据处理行为,如:一般结构化的数据持久化
  4. settings.py:配置文件,如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效,正确写法USER_AGENT='xxxx';
  5. spiders:爬虫目录,如:创建文件,编写爬虫规则。

选择器xpath & css

测试网址:https://doc.scrapy.org/en/latest/_static/selectors-sample1.html

目标页面内容:

<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
<a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>

进入交互环境测试选择器使用:

scrapy shell https://doc.scrapy.org/en/latest/_static/selectors-sample1.html
# 进入交互环境
# response.selector.css()或.xpath返回的是selector对象,再调用extract()和extract_first()从selector对象中解析出内容。
获取标签对象 // & /

/仅限于子标签:

# 查找目标页面所有a标签下的img子标签
>>> response.xpath('//a/img').extract()
['<img src="image1_thumb.jpg">', '<img src="image2_thumb.jpg">',
'<img src="image3_thumb.jpg">', '<img src="image4_thumb.jpg">', '<img src="image5_thumb.jpg">'] >>> response.css('a img').extract() # 返回对象列表 >>> response.css('a img').extract_first() # 返回第一个标签对象
'<img src="image1_thumb.jpg">'

//在子孙标签中查找:

# 查找目标页面所有的div标签内容的所有img标签
>>> response.xpath('//div//img').extract()
['<img src="image1_thumb.jpg">', '<img src="image2_thumb.jpg">', '<img src="image3_thumb.jpg">', '<img src="image4_thumb.jpg">', '<img src="image5_thumb.jpg">']
获取标签中的文本text
>>> response.css('a::text').extract()
['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ', 'Name: My image 4 ', 'Name: My image 5 '] >>> response.xpath('//div/a/text()').extract()
['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ',
'Name: My image 4 ', 'Name: My image 5 ']
获取标签属性
# xpath获取a标签内的所有img的src属性
>>> response.xpath('//a//img/@src').extract()
['image1_thumb.jpg', 'image2_thumb.jpg', 'image3_thumb.jpg', 'image4_thumb.jpg', 'image5_thumb.jpg'] ## css获取属性
>>> response.css('img::attr(src)').extract()
['image1_thumb.jpg', 'image2_thumb.jpg', 'image3_thumb.jpg', 'image4_thumb.jpg', 'image5_thumb.jpg']
嵌套查找
>>> response.xpath('//div').css('a').xpath('@href').extract_first()
'image1.html'
设置默认值
>>> response.xpath("//div[@id='asas']").extract_first(default='not found')
'not found'
按照属性查找
# 查找所有包含[href='image2.html']的标签
>>> response.xpath("//*[@href='image2.html']").extract_first()
'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>' >>> response.css('#images [href="image2.html"]').extract_first()
'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>'
模糊匹配
>>> response.css('#images [href*="image2"]').extract_first()
'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>' >>> response.xpath('//a[contains(@href,"image1")]').extract_first()
'<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>'
>>> response.xpath('//*[contains(@href,"image1")]').extract_first()
'<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>'
正则表达式
# 先找到所有a标签的文本selecor对象,然后逐个用re进行匹配,直到找到匹配的
>>> response.xpath('//a').re(".*My image 1 ")[0]
'<a href="image1.html">Name: My image 1 '

scrapy 框架入门的更多相关文章

  1. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据

    为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...

  2. Scrapy 框架入门简介

    一.Scrapy框架简介 Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. ...

  3. Python爬虫Scrapy框架入门(2)

    本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...

  4. Python爬虫Scrapy框架入门(1)

    也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...

  5. Python爬虫Scrapy框架入门(0)

    想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...

  6. Scrapy 框架 入门教程

    Scrapy入门教程 在本篇教程中,我已经安装好Scrapy 本篇教程中将带您完成下列任务: 创建一个Scrapy项目 定义提取的Item 编写爬取网站的 spider 并提取 Item 编写 Ite ...

  7. scrapy框架入门

    scrapy迄今为止依然是世界上最好用,最稳定的爬虫框架,相比于其他直接由函数定义的程序, scrapy使用了面向对象并对网页请求的过程分成了很多个模块和阶段,实现跨模块和包的使用,大大提升了代码的稳 ...

  8. Python爬虫Scrapy框架入门(3)

    往往需要爬取的网页是呈一个树状结构.比如,需要先爬取一个目录,然后再在目录中选择具体的爬取目标.而目录和具体目标之间,网页结构不同,使得我们不能使用相同的爬取策略. 从之前的经验来看,我们对scrap ...

  9. 【python】Scrapy爬虫框架入门

    说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...

随机推荐

  1. Spring注解方式配置Redis

    @Configuration public class RedisConfiguraion { @Bean public JedisConnectionFactory redisConnectionF ...

  2. java实现两个不同list对象合并后并排序

    工作上遇到一个要求两个不同list对象合并后并排序1.问题描述从数据库中查询两张表的当天数据,并对这两张表的数据,进行合并,然后根据时间排序.2.思路从数据库中查询到的数据放到各自list中,先遍历两 ...

  3. Java学习笔记(十七):构造器和setter方法选用

  4. each遍历

    <script> $(function () { $.each([52, 97], function(index, value) { alert(index + ': ' + value) ...

  5. Java第四次实验

    实验一: Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 参考ht ...

  6. 20175316盛茂淞 2018-2019-2《Java程序设计》第4周学习总结

    20175316盛茂淞 2018-2019-2<Java程序设计>第4周学习总结 教材学习内容总结 第五章 子类与继承 一.继承 1.继承定义:避免多个类间重复定义共同行为 2.子类与父类 ...

  7. selenium中动作链的使用

    一.问题 我们有时候在使用selenium的时候,会遇到悬停后点击元素的操作,因此需要一个动作链来完成这个功能. 二.解决 从selenium的包中导入actionchains函数,利用xpath找到 ...

  8. sqlserver数据库创建快照发布遇到的错误:对路径“XXXX”访问被拒绝

    在创建了一个sqlserver数据库的发布后,显示创建成功,但当查看快照代理状态时,显示“对路径‘XXXX’访问被拒绝”,这一错误导致订阅无法实现.然后网上有一方案帮忙解决了,主要有以下操作: 1)在 ...

  9. STARTTLS is required but host does not support STARTTLS

    Spring boot 邮件系统的错误,需要修改配置的文件yml.如果是企业邮箱的话就需要进行这个配置: spring: mail: host: mail.ccds.com username: inf ...

  10. Shell脚本-基本运算符

    跟着RUNOOB网站的教程学习的笔记 shell和其他编程语言一样,支持多种运算符,包括: 算术运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 expr是一款表达式计算公式,使用它能完成 ...