如何写第一个scrapy
目录
结构
第一个scrapy的思路
代码实现:
核心代码解读
小结
结构
scrapy是一个框架,要想写出第一个scrapy程序,那么就得先了解这个框架是由哪些组件构成的,这些组件又有什么作用。
看一下这些组件详细的工作流程图
这些组件是如何配合的可以参考一下组件结构,我就不费笔墨了。
那么了解了scrapy的大致工作流程之后,如何开始写好第一个scrapy程序呢???
第一个scrapy的思路
既然是第一个,那就写得简单点。不考虑太多,通过回答下面三个问题开始理清思路。
- 爬虫从哪个或者哪些页面开始爬取?
- 对于一个已经下载的页面,需要提取其中哪些数据?
- 爬取完当前页面后,接下来爬取哪些页面?
目标页面:http://books.toscrape.com/
爬取目标:爬取该网站所有书本的信息(具体是哪些信息自己决定,这里选取书名和库存量)。
代码实现:
首先创建一个scrapy项目,
输入命令:scrapy startproject books
在spiders文件中新建一个爬虫文件,spider.py
spiders.py
import scrapyclass BooksSpider(scrapy.Spider):name = "start"start_urls = ["http://books.toscrape.com/"]# 解析函数def parse(self, response):for book in response.css('article.product_pod'):# 解析出书名name = book.xpath('./h3/a/@title').extract_first()yield{'name':name,}# 解析出下一页的urlnext_url = response.css('ul.pager li.next a::attr(href)').extract_first()# 如果还有下一页,则用Request请求发出if next_url:next_url = response.urljoin(next_url)yield scrapy.Request(next_url , callback=self.parse)
如果将
yield{
'name':name,
}
改成
yield name
则会出现错误
也就是yield 只能返回Request请求,Item,dict数据,或者返回None。 返回Request会被引擎发送给Downloader组件,返回Item或者dict会被引擎发送给Item pipeline组件。
核心代码解读
name = 'start'
在一个scrapy中可以实现多个Spider,每个Spider需要被区分,于是Spider类的属性name起到了标识的作用,执行scrapy crawl name时,name就告诉了scrapy用哪个Spider去实现。
start_urls = ["http://books.toscrape.com/"]
start_urls是Spider类里面的属性,定义起始爬取点,它通常被实现成一个列表,其中放入所有起始爬取点的url。
可是我们都没有发送Request请求,为什么仅仅在start_urls里面放入url就能运行呢???看一下Spider的源码我们就明白了,
#该方法将读取start_urls内的地址,并为每一个地址生成一个Request对象, 并返回这些对象的迭代器#该方法金调用一次def start_requests(self):for url in self.start_urls:yield self.make_requests_from_url(url)#start_requests()中调用,实际生成Request的函数。#Request对象默认的回调函数为parse(),提交的方式为getdef make_requests_from_url(self, url):return Request(url, dont_filter=True)#默认的Request对象回调函数,处理返回的response。#生成Item或者Request对象。用户必须实现这个类def parse(self, response):raise NotImplementedError
scrapy会自动地调用一次start_requests,仅仅只调用一次。
如果我们想为Request请求添加特定的HTTP头部,或者指定解析函数,则可以重写start_requests方法。
小结
name属性:是用来标识scrapy项目中的Spider,因为一个scrapy中可能有多个Spider
start_urls属性:是用来存放爬取起始点的url,如果使用start_urls,则不需要重写start_requests方法。如果有特定的需求,可重 写start_requests方法
parse函数:起解析response作用,可手动实现其他解析函数。解析函数需要完成两项任务,一是提取页面数据,以item或者字典的形式提交给scrapy引擎;二是使用选择器或者LinkExtractor提取页面中的url,用提取出来的url构造新的Request并提交给引擎。
如何写第一个scrapy相关推荐
- 我的第一个Scrapy 程序 - 爬取当当网信息
前面已经安装了Scrapy,下面来实现第一个测试程序. 概述 Scrapy是一个爬虫框架,他的基本流程如下所示(下面截图来自互联网) 简单的说,我们需要写一个item文件,定义返回的数据结构:写一个s ...
- python每天定时9点执行_[求助]关于twisted框架,如何每天定时执行一个scrapy爬虫...
RT,最近在学scrapy,写了一个简单的爬取网页数据的爬虫,利用CrawlProcess单次调用执行的时候没有问题,脚本如下,就是清空数据表然后爬取数据: class updateBoardData ...
- 安装scrapy模块,创建一个Scrapy爬虫项目,并运行
创建一个Scrapy项目,首先需要所需要的模块 一丶安装scrapy框架所有模块 1.第一个安装的依赖库是lxml ,命令是: pip install lxml 2.第二个依赖库是pyOpenSSL, ...
- 【python实现网络爬虫(5)】第一个Scrapy爬虫实例项目(Scrapy原理及Scrapy爬取名言名句网站信息)
Scrapy介绍 总共有五部分组成的:具体的流程可看图示 引擎.调度器.下载器.蜘蛛和项目管道 爬取流程 针对于每个URL, Scheduler -> Downloader -> Spid ...
- java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏
根据网上视频教程,用JAVA写的一个飞机程序.先看效果先: 改程序主要应用了面向对象的方法构建,使用了AWT技术和一些双缓冲技术 关键有几个点: 一.双缓冲技术,防止重画造成的屏幕闪烁,可以直接用 p ...
- 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...
- 怎样写出一个较好的高速排序程序
写出一个较好的高速排序程序 高速排序是经常使用的排序算法之中的一个,但要想写出一个又快又准的使用程序,就不是那么简单了 须要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此假设 ...
- linux mysql 不稳定_linux,mysql:今天写出一个十分弱智的bug!
今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫: select record.a, y.c ...
- 分享下自己写的一个微信小程序请求远程数据加载到页面的代码
分享下自己写的一个微信小程序请求远程数据加载到页面的代码 1 思路整理 就是页面加载完毕的时候 请求远程接口,然后把数据赋值给页面的变量 ,然后列表循环 2 js相关代码 我是改的 onload ...
最新文章
- 多少行数_经验丰富的程序员和其每日代码行数
- Matplotlib学习---用matplotlib画误差线(errorbar)
- 简单暴力到dp的优化(中级篇)
- C++ 同步/异步与阻塞/非阻塞的区别
- python:filter用法
- oracle set ansi_nulls off,sqlserver存储过程转换成oracle存储过程
- 软件需求工程与UML建模——第九组第六周工作总结
- Linux服务-搭建NFS
- Atitit postgresql data type 数据类型与mysql对应表 数据库常用数据类型 	Postgre	Mysql	 整数	intgreter	Int	 小数	numeric	FL
- 递归算法的基本理解以及基本算法,多行注释详解,适合编程小白,刚接触递归的编程新手
- java 记住密码的实现,JAVA记住密码功能的实现代码
- 毕业论文排版(六)-三线表
- python定义变量不赋值_python定义变量
- Windows 之 win SMB(smb) 功能的开启设置和使用的简单说明
- Cloudera是个什么东西
- Django 学习 之ORM简介与单表操作
- 职言 | 校招面试有感,一个面试官的几点建议
- CVE-2018-8120漏洞复现(提权)
- SQL 多表联合查询,收藏直接起飞!
- 3.图解排序算法(三)之堆排序