标签:scrapy

python

超级易懂爬虫系列之使用scrapy框架爬取妹纸图

在前面一节中带领大家了解了scrapy框架的基本架构与使用,且与前面我们自己写的简单的架构进行了比较,让大家能够很容易明白这个框架的数据流的流程。然后带领大家爬取了一个页面的妹纸图让大家更容易上手,接下来就带领大家正式使用scrapy框架爬取全部页面的妹纸图,为了心仪的妹纸一定要学会哦,哈哈哈. 在前面一节中我们说过scrapy框架自动帮我们创建的工程包括一下几个板块: spider:这个是需要我们自定义实现的spider组件,主要是重写其parse函数来解析传进来的Response对象 items:用来定义我们需要解析的数据的字段,如为例爬取妹纸图,我们需要知道妹纸图的下载地址,因此可以定义一个img_src字段用来表示妹纸图的下载地址 pipelines:用来处理数据,不需要继承自scrapy框架类,但需要我们在setting.py中进行配置说明,然后重写其def process_item(self, item, spider)函数,在改函数中对传入的item数据对象进行处理 settings 整个工程的配置文件,如果我们需要使用pipelines模块,需要在改文件中打开pipelines配置代码,即去掉框架自动生成的注释 那么当我们要爬取当前页面相关联的全部页面很显然需要修改的是spider组件中的代码,在parse函数回调时我们不仅需要获取妹纸图的下载地址,同样也需要获取相关联的url,在前面也讲过,我们需要使用Request对象来向scrapy引擎传递下一个请求,同时在Request对象中指定回调函数,代码如下: [crayon-5f03a5165d376347382232/] 代码注释很详细,相信大家都看得懂,主要就是在上一节的spider.py模块中添加了爬取全部页面的代码,即在parse函数中返回Request对象,在该对象中指定下一个带爬取的url和回调函数即可。可以看到和上一节代码不同的是我们使用的不是return语句,而是yield,关于该表达式,简单的说一下其作用就是返回一个表达式,但和return不同的是,包含yield的函数已经不在是一个函数,而是一个可迭代的生成器,因此返回后不会结束该代码,而是类似与操作系统中的中断的作用,yield返回之后,程序的代码中变量的值会在此保存下来,待执行下一次迭代(当包含yield表达式时,该函数就是一个可迭代的生成器)时会从该中断语句处开始执行。关于yield的更多细节及请大家自行百度了解。 另一个需要注意的是,我们同样需要进行url去重,即定义一个集合保存需要爬取的url,然后如果新出现的url已经在该crawed_urls集合中,那么就不需要添加进去,如果不在则需要添加进去,然后返回Request对象。具体细节大家可以仔细的看代码,注释很详细。 当然如果某些网址需要使用设置header,cookies才可以访问的话,我们就不能够使用上述的代码了,因为使用start_urls的方式实质上是框架自动帮助我们发送了Request请求,但是该请求不带headers,cookies等参数,因此我们需要自己处理初始的Reques请求,此时我们只需要重写start_requests(self)函数即可,代码如下: [crayon-5f03a5165d37f852416122/] 首先设置cookies和headers,然后重写start_requests(self)函数,在该函数中返回Request对象时指定cookies或者headers参数。完整的spider模块代码如下: [crayon-5f03a5165d388137324672/] 其余模块的代码不需要改动,然后我们运行程序,可以看到在磁盘的C:\Users\htq\Desktop\girl_目录下已经为我们自动保存好了全部页面的妹纸图哦,如图: 好了,爬取全部页面妹纸图的程序就写好了,细心的小伙伴可以发现下载下来的图片的顺序和我们之前不用框架而是自己写的程序下载下来的顺序不一致,可以明显的感觉到很多页面的图片是交替出现的,这是因为scrapy框架使用了异步多线程的方式,因此图片的下载和爬取不是按照一个页面下载完成再去下载另一个页面的图片,而是爬取页面和图片下载交替进行,因此当前正在下载该页面的第一张妹纸图,下一秒可能就爬取到了另一个url下载该页面的第一张妹纸图,因此可以明显感觉到使用scrapy框架的下载速度要快得多,这也是使用框架的好处之一,可以显著的提高程序运行效率。   更多关于爬虫的干货,请继续关注超级易懂爬虫系列!   注:本文首次发表于huqi.tech,谢绝转载,如需转载,请注明出处:huqi.tech

python

超级易懂爬虫系列之爬虫框架scrapy

在前面的文章中,我带领大家一步一步从学习了爬虫的理论知识,相信大家为了心仪的妹纸都已经学会了,最后也动手写了一个简单的爬虫架构,之所以抽象出一个简单的架构就是为了让大家能够更好的理解爬虫框架,正所谓‘不要重复造轮子’,一个成熟框架是经过很多场景使用的考验的,其稳定性和功能的强大性远比我们自己写一个爬虫程序要好的多,因此本节就带领大家玩一下常见的爬虫框架scrapy。 python常见的爬虫架构一般包括pyspider和scrapy,前者是国人搞的,容易上手,但是在对windows的支持性不是很好,在win下很容易出现一些奇怪的bug,如很容易出现‘python已停止运行’这样的错误,因此本节以scrapy框架为例向大家讲解。 首先需要安装scrapy,因为本人使用的是windows操作系统,因此以windows为例,打开cmd,然后输入如下命令 pip install Scrapy 输入该命令后就可以看到会自动下载scrapy相关组件,如图: 出现如上图所示即表示正在下载相关组件,我们只需要等待即可,当命令行窗口出现Successfully installed字样就表示安装成功,如图 如图即表示安装成功,我们还可以验证下,命令行输入scrapy,出现如下内容就表示确实安装成功。 这是官方文档:https://doc.scrapy.org/en/latest/index.html 既然是学习框架的使用,那么我们首先来看一下官方给出的架构图了解下整个框架的执行流程大概是怎样的。 整个架构最核心的是当中的ENGINE,即执行引擎,主要用来负责控制系统所有组件之间的数据流,这些组件主要包括: scheduler主要用来接收来自引擎的requests请求,然后将其入队,等到需要的时候在将队列中的Requests对象传递给引擎,这就类似于我们自己写的爬虫架构的url管理器的部分角色。只不过我们的那个架构较为简单,只是把url放到集合中,而此处是把Request对象放到队列中 downloader负责抓取网页,然后将抓取到的结果Response对象传递给引擎,然后引擎将其传递给spider处理,这和我们自己写的爬虫架构中的网页下载器功能类似 spider 该组件是用户自定义的类,通常继承于scrapy.Spider。用来解析Response对象,然后从中提取出item(scrapy中的组件,实质上是用来保存数据),这和我们自定义组件中的spider_main功能类似 item pipelines:用来处理spider组件获取的items,如去重,持久化等,主要用来保存数据。这个和我们前面自定义架构中提到的output_data模块类似。 通过对这些组件的介绍,我们可以看到这和我们前面自定义的爬虫架构基本类似,只不过我们那个很简单而已,这也是为何前面要总结一下爬虫架构的原因,因为这样能够帮助我们更容易去理解复杂的框架。 介绍完了该框架的核心组件,接下来看下这些组件之间是如何协同工作的,即数据流是如何传递的。我们仔细看上面的架构图,会发现上面标注着一下数字和箭头,这就是整个框架的数据流的流程图。因此整个框架的工作原理如下: 引擎从spider组件中获取一个初始Request请求 引擎调度Request将其入队到Scheduler组件中,同时获取下一个待爬取的请求 Scheduler组件返回下一个带爬取的Request请求给引擎 引擎将获取到的Request请求传递给downloader组件 downloader组件获取到请求之后会下载该页面,下载完成之后会生成一个Response对象,然后将其返回给引擎 引擎从downloader组件中接收返回的Response对象,然后将其传递给Spider组件处理 Spider组件处理接收到的Response对象,从中解析出item和新的Request请求,然后将其返回给引擎 引擎将Spider组件解析的item传递给item pipelines组件,同时将解析的Request请求传递给Scheduler组件入队,然后从Scheduler组件中获取下一个待爬取的Request请求。 重复上述过程,直至Scheduler组件中无Request请求为止 从这个执行过程可以看到,引擎起到调度作用,整个执行流程和我们自定义爬虫架构的执行流程几乎一模一样,只不过没这个复杂而已。 更多详细内容大家可以去官网看:https://doc.scrapy.org/en/latest/topics/architecture.html scrapy框架介绍的差不多了,接下来看看如何使用,首先打开cmd,切换到我们想创建工程的目录下,执行如下命令: [crayon-5f03a5165d7f1601282416/] 该命令会在project_dir目录下自动创建一个名为myproject的scrapy工程,如果不指定project_dir则project_dir会和myproject一样,通常我们不需要指定该参数。如图 然后我们在对应的工程下会看到scrapy为我们自动创建了如下文件: 这些文件和我们前面提到的scrapy组件基本一一对应。我们只需要在spiders中自定义spider组件重写scrapy为我们自动生成的parse函数的逻辑即可,注意settings.py是整个scrapy为我们的工程生成的配置文件,如果是自动生成的,里头很多配置属性都注释起来了,其中的ITEM_PIPELINES如果我们要在pipelines.py中处理我们的item的话需要我们将注释去掉,不然框架是不会执行我们在pipelines.py中写的代码的。这一点需要注意。 好了现在我们就开始用scrapy框架来改写前面我们写的爬取妹纸图的程序,为了让大家超级易懂,还是先易后难,一步一步扩充其功能。   好了整个工程就用scrapy框架改写好了,是不是so easy,因为很多事情框架都为我们做好了,接下来运行下程序,可以看到在磁盘的C:\Users\htq\Desktop\girl_目录下已经自动为我们下载好了妹纸图,和之前不使用框架的效果一样。如图: 是不是很简单,而且可以明显的感觉到使用框架速度比之前我们自己写的爬取妹纸图的程序速度更快。基本上几秒搞定。 这样我们就基本学会了scrapy框架如何使用,其它更多复杂功能将会以超级易懂爬虫系列的形式讲解,更多关于爬虫的干货,请继续关注超级易懂爬虫系列!   注:本文首次发表于huqi.tech,谢绝转载,如需转载,请注明出处:huqi.tech