目录

结构

第一个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相关推荐

  1. 我的第一个Scrapy 程序 - 爬取当当网信息

    前面已经安装了Scrapy,下面来实现第一个测试程序. 概述 Scrapy是一个爬虫框架,他的基本流程如下所示(下面截图来自互联网) 简单的说,我们需要写一个item文件,定义返回的数据结构:写一个s ...

  2. python每天定时9点执行_[求助]关于twisted框架,如何每天定时执行一个scrapy爬虫...

    RT,最近在学scrapy,写了一个简单的爬取网页数据的爬虫,利用CrawlProcess单次调用执行的时候没有问题,脚本如下,就是清空数据表然后爬取数据: class updateBoardData ...

  3. 安装scrapy模块,创建一个Scrapy爬虫项目,并运行

    创建一个Scrapy项目,首先需要所需要的模块 一丶安装scrapy框架所有模块 1.第一个安装的依赖库是lxml ,命令是: pip install lxml 2.第二个依赖库是pyOpenSSL, ...

  4. 【python实现网络爬虫(5)】第一个Scrapy爬虫实例项目(Scrapy原理及Scrapy爬取名言名句网站信息)

    Scrapy介绍 总共有五部分组成的:具体的流程可看图示 引擎.调度器.下载器.蜘蛛和项目管道 爬取流程 针对于每个URL, Scheduler -> Downloader -> Spid ...

  5. java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏

    根据网上视频教程,用JAVA写的一个飞机程序.先看效果先: 改程序主要应用了面向对象的方法构建,使用了AWT技术和一些双缓冲技术 关键有几个点: 一.双缓冲技术,防止重画造成的屏幕闪烁,可以直接用 p ...

  6. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx

    PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...

  7. 怎样写出一个较好的高速排序程序

    写出一个较好的高速排序程序 高速排序是经常使用的排序算法之中的一个,但要想写出一个又快又准的使用程序,就不是那么简单了 须要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此假设 ...

  8. linux mysql 不稳定_linux,mysql:今天写出一个十分弱智的bug!

    今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫: select record.a, y.c ...

  9. 分享下自己写的一个微信小程序请求远程数据加载到页面的代码

    分享下自己写的一个微信小程序请求远程数据加载到页面的代码 1  思路整理 就是页面加载完毕的时候  请求远程接口,然后把数据赋值给页面的变量 ,然后列表循环 2 js相关代码  我是改的 onload ...

最新文章

  1. 多少行数_经验丰富的程序员和其每日代码行数
  2. Matplotlib学习---用matplotlib画误差线(errorbar)
  3. 简单暴力到dp的优化(中级篇)
  4. C++ 同步/异步与阻塞/非阻塞的区别
  5. python:filter用法
  6. oracle set ansi_nulls off,sqlserver存储过程转换成oracle存储过程
  7. 软件需求工程与UML建模——第九组第六周工作总结
  8. Linux服务-搭建NFS
  9. Atitit postgresql data type 数据类型与mysql对应表 数据库常用数据类型 Postgre Mysql 整数 intgreter Int 小数 numeric FL
  10. 递归算法的基本理解以及基本算法,多行注释详解,适合编程小白,刚接触递归的编程新手
  11. java 记住密码的实现,JAVA记住密码功能的实现代码
  12. 毕业论文排版(六)-三线表
  13. python定义变量不赋值_python定义变量
  14. Windows 之 win SMB(smb) 功能的开启设置和使用的简单说明
  15. Cloudera是个什么东西
  16. Django 学习 之ORM简介与单表操作
  17. 职言 | 校招面试有感,一个面试官的几点建议
  18. CVE-2018-8120漏洞复现(提权)
  19. SQL 多表联合查询,收藏直接起飞!
  20. 3.图解排序算法(三)之堆排序

热门文章

  1. png文件头_文件上传总结
  2. 【MM模块】 Goods Receipt 收货 4
  3. 直接用SM30的维护表创建事务代码
  4. ORACLE如何删除归档日志文件
  5. SAP系统中设备管理模块的主要增强出口
  6. SAP ABAP OLE 输出数据到 Excel 无法自动保存的解决
  7. SAP BW数据源增强管理
  8. 疫情过后,2020年各省市GDP排行榜top10新鲜出炉,你的家乡排在第几?
  9. 云计算被视为继计算机,8+第八章+计算机网络技术分析.ppt
  10. php管理用户名和密码,管理员用户名/密码不适用于PHP