龙空技术网

Python两大利器Scrapy框架中Spiders和ItemPipeline用法(附源码)

Python乐园 1181

前言:

目前大家对“scrapy post请求”可能比较讲究,看官们都想要剖析一些“scrapy post请求”的相关资讯。那么小编同时在网摘上收集了一些对于“scrapy post请求””的相关内容,希望大家能喜欢,姐妹们快快来学习一下吧!

作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用。使用Python这样的简单编程语言,你可以使用少量编程技能就可以爬取复杂的网站。

如果手机上显示代码错乱,请分享到QQ或者其他地方,用电脑查看!!!

python能干的东西有很多,这里不再过多叙述,直接重点干货。

Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页

工作流程分析

以初始的URL初始化Request,并设置回调函数,当该request下载完毕并返回时,将生成response,并作为参数传给回调函数.

spider中初始的requesst是通过start_requests()来获取的。start_requests()获取

start_urls中的URL,并以parse以回调函数生成Request

在回调函数内分析返回的网页内容,可以返回Item对象,或者Dict,或者Request,以及是一个包含三者的可迭代的容器,返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数

在回调函数内,可以通过lxml,bs4,xpath,css等方法获取我们想要的内容生成item

最后将item传递给Pipeline处理

我们以通过简单的分析源码来理解

我通常在写spiders下写爬虫的时候,我们并没有写start_requests来处理start_urls中的url,这是因为我们在继承的scrapy.Spider中已经写过了,我们可以点开scrapy.Spider查看分析

通过上述代码我们可以看到在父类里这里实现了start_requests方法,通过make_requests_from_url做了Request请求

如下图所示的一个例子,parse回调函数中的response就是父类列start_requests方法调用make_requests_from_url返回的结果,并且在parse回调函数中我们可以继续返回Request,如下属代码中yield Request()并设置回调函数。

spider内的一些常用属性

我们所有自己写的爬虫都是继承与spider.Spider这个类

name

定义爬虫名字,我们通过命令启动的时候用的就是这个名字,这个名字必须是唯一的

allowed_domains

包含了spider允许爬取的域名列表。当offsiteMiddleware启用时,域名不在列表中URL不会被访问

所以在爬虫文件中,每次生成Request请求时都会进行和这里的域名进行判断

start_urls

起始的url列表

这里会通过spider.Spider方法中会调用start_request循环请求这个列表中每个地址。

custom_settings

自定义配置,可以覆盖settings的配置,主要用于当我们对爬虫有特定需求设置的时候

设置的是以字典的方式设置:custom_settings = {}

from_crawler

这是一个类方法,我们定义这样一个类方法,可以通过crawler.settings.get()这种方式获取settings配置文件中的信息,同时这个也可以在pipeline中使用

start_requests()

这个方法必须返回一个可迭代对象,该对象包含了spider用于爬取的第一个Request请求

这个方法是在被继承的父类中spider.Spider中写的,默认是通过get请求,如果我们需要修改最开始的这个请求,可以重写这个方法,如我们想通过post请求

make_requests_from_url(url)

这个也是在父类中start_requests调用的,当然这个方法我们也可以重写

parse(response)

这个其实默认的回调函数

负责处理response并返回处理的数据以及跟进的url

该方法以及其他的Request回调函数必须返回一个包含Request或Item的可迭代对象。

当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理

每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或者被丢弃而不再进行处理

item pipeline的主要作用:

清理html数据

验证爬取的数据

去重并丢弃

讲爬取的结果保存到数据库中或文件中

编写自己的item pipeline

process_item(self,item,spider)

每个item piple组件是一个独立的pyhton类,必须实现以process_item(self,item,spider)方法

每个item pipeline组件都需要调用该方法,这个方法必须返回一个具有数据的dict,或者item对象,或者抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理

下面的方法也可以选择实现

open_spider(self,spider)

表示当spider被开启的时候调用这个方法

close_spider(self,spider)

当spider挂去年比时候这个方法被调用

from_crawler(cls,crawler)

这个和我们在前面说spider的时候的用法是一样的,可以用于获取settings配置文件中的信息,需要注意的这个是一个类方法,用法例子如下:

一些item pipeline的使用例子(官网说明)

例子1

这个例子实现的是判断item中是否包含price以及price_excludes_vat,如果存在则调整了price属性,都让item['price'] = item['price'] * self.vat_factor,如果不存在则返回DropItem

from scrapy.exceptions import DropItemclass PricePipeline(object): vat_factor = 1.15 def process_item(self, item, spider): if item['price']: if item['price_excludes_vat']: item['price'] = item['price'] * self.vat_factor return item else: raise DropItem("Missing price in %s" % item)

例子2

这个例子是将item写入到json文件中

import jsonclass JsonWriterPipeline(object): def __init__(self): self.file = open('items.jl', 'wb') def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n" self.file.write(line) return item

例子3

将item写入到MongoDB,同时这里演示了from_crawler的用法

import pymongoclass MongoPipeline(object): collection_name = 'scrapy_items' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db[self.collection_name].insert(dict(item)) return item

例子4:去重

一个用于去重的过滤器,丢弃那些已经被处理过的item,假设item有一个唯一的id,但是我们spider返回的多个item中包含了相同的id,去重方法如下:这里初始化了一个集合,每次判断id是否在集合中已经存在,从而做到去重的功能

from scrapy.exceptions import DropItemclass DuplicatesPipeline(object): def __init__(self): self.ids_seen = set() def process_item(self, item, spider): if item['id'] in self.ids_seen: raise DropItem("Duplicate item found: %s" % item) else: self.ids_seen.add(item['id']) return item

启用一个item Pipeline组件

在settings配置文件中y9ou一个ITEM_PIPELINES的配置参数,例子如下:

ITEM_PIPELINES = { 'myproject.pipelines.PricePipeline': 300, 'myproject.pipelines.JsonWriterPipeline': 800,}

每个pipeline后面有一个数值,这个数组的范围是0-1000,这个数值确定了他们的运行顺序,数字越优先。

以上是全部内容,只是善于分享,不足之处请包涵!爬虫基本的原理就是,获取源码,进而获取网页内容。一般来说,只要你给一个入口,通过分析,可以找到无限个其他相关的你需要的资源,进而进行爬取。

我也写了很多其他的非常简单的入门级的爬虫详细教程,关注后,点击我的头像,就可以查看到。

欢迎大家一起留言讨论和交流,谢谢!

标签: #scrapy post请求