scrapy篇(2)scrapy中的spider部分

 

1、spider中的属性和方法

在Scrapy框架中的spider创建类时,强制了三个属性和一个方法。

1.1、spider属性

  • name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
  • allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
  • start_urls = []:爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

如何使用start_requests(self)定义启动开始的url,会对start_urls = []影响

1.2、spider的方法

1、start_requests(self)方法

start_requests(self)方法循环的生成需要爬取的地址

 def start_requests(self): 
        urls = [ 
            'http://www.baidu.com',
            'http://www.qq.com',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse) 

Spider源码中start_requests()方法

 通过上面Spider源码我们可以发现以下几点:

(1)对于起始爬虫点的下载请求是由Scrapy引擎调用Spider对象的start_requests()方法提交的,

(2)而在start_requests()方法中,self.start_urls便是我们自己定义的其实爬取点的列表(通过实例访问类属性的方式),对其进行迭代,用迭代出的每个url作为参数调用make_requests_from_url()方法;

(3)make_requests_from_url()方法中,我们找到真正构建Request对象的代码,仅适用url和dont_filter参数构建Request对象;

(4)由于构造Request对象时并没有传递callback参来指定页面解析函数,因此默认将parse方法作为页面解析函数。

(5)起始爬取点可能有多个,start_requests方法需要返回一个可迭代对象(列表、生成器等),其中每一个元素是一个Request对象。这里start_requests方法被实现成一个生成器函数,每次有yield语句返回一个Request对象。

2、parse(self, response)方法

     parse(self, response)是解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:

  • 负责解析返回的网页数据(response.body),提取结构化数据(生成item);
  • 生成需要下一页的URL请求。
 def parse(self, response):        
        #处理start_url地址的响应
        print("*"*100)
        li_list = response.xpath("//div[@class='tea_con']//li")
        print(len(li_list))
        print("&"*100)
        content_list=[]
        for li in li_list:
            item={}
            item["name"] = li.xpath(".//h3/text()").extract_first()
            item["title"] = li.xpath(".//h4/text()").extract_first()
            logger.warning(item)
            # print(item)
            #注意yield不能列表,必须是Requet、BaseItem、dict或者Nnoe四种类型
            # 最后yield item生成器,scrapy会将item传递给pipeline进行后续的处理,当然,前提是你打开了settings设置里面的设置项
            yield item

2、Request和Response

Request->Response:获取下载数据;
Response->爬虫:数据;

 

2.1、Request

    一般Request对象在爬虫程序中生成并传递到系统,直到它们到达下载程序,后者执行请求并返回一个Response对象,该对象返回到发出请求的爬虫程序。

【Request类的源码部分】

下面对Request的参数说明:

(1)url参数:str类型,要请求的网址;

(2)callback:将使用此请求的响应(一旦下载)作为其第一个参数调用的函数;如果请求没有指定回调,parse()将使用spider的默认方法。需要我们注意的是,如果在处理期间出现异常,则会调用errback

(3)method参数:请求http的方法,默认GET。

(4)meta参数:字典类型;属性的初始值Request.meta,如果给定了此参数中传递的dict类型将被浅复制或浅拷贝。

(5)body参数,str类型;请求体。如果unicode传递了a,那么它被编码为 str使用传递的编码(默认为utf-8)。如果 body没有给出,则存储一个空字符串。不管这个参数的类型,存储的最终值将是一个str(不会是unicode或None)

(6)headers参数:字典类型,是请求头。dict值可以是字符串(对于单值标头)或列表(对于多值标头)。如果 None作为值传递,则不会发送HTTP头。

(7)cookie参数:字典类型或列表类型,请求cookie。

(8)dont_filter(boolean) 参数:表名这个请求是否被调度器进行过滤。 当你想对一个请求请求多次的时候,不理会去重过滤器。小心使用它,不然你可能陷入抓取循环当中。默认是False即dont_filter=False。对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤掉避免重复下载。如果该参数设置为True则可以使请求避免过滤掉,强制下载。如果在多次爬取一个内容页面随时间二变化的页面时(每次使用相同url)可以将该参数设置为True。

(9)errback参数:表示请求出现异常的回调函数。

 

【FormRequest类源码部分】

FormRequest类是Request的子类,FormRequest类扩展了Request具有处理HTML表单的功能的基础。它使用lxml.html表单 从Response对象的表单数据预填充表单字段。参数说明如下:

(1)formdata参数,这个蚕食是元组的dict或者iterable。 是一个包含HTML Form数据的字典(或(key,value)元组的迭代),它将被url编码并分配给请求的主体

(2)

(3)

2.2、Response

Response对象是一个基类,根据响应内容不同有如下三个子类:
(1)TextResponse
(2)HtmlResponse:而HtmlResponse又是TextResponse的子类;
(3)XmlResponse:而XmlResponse又是TextResponse的子类;

当一个页面下载完成时,下载器依据HTTP响应头部中Content-Type信息创建某个Response的子类。

   response的引用是from scrapy.http.response.html import HtmlResponse里面。

(1)url参数:响应的url;

(2)status参数:int类型,响应的状态码;

(3)headers参数:字典类型,响应头;

(4)body参数:str类型,响应体,不是unicode。除非使用一个编码感知响应子类,如 TextResponse。

(5)flags参数:列表类型,是包含属性初始值的 Response.flags列表。如果给定,列表将被浅复制。

(6)request参数:Requestobject属性的初始值Response.request。这代表Request生成此响应。

(7)encoding:http响应正文的编码,是从http响应头部或者正文中解析出来的。

(8)meta:也就是response.request.meta,在构建Request对象时,可以将要传递给响应处理函数的信息通过meta参数传入:响应处理函数处理响应时,通过response.meta将信息取出。

 

3、spider常用的方法

3.1、get()/getall()/extract()/extract_first()/re.first()/re()使用

我们可以通过scrapy.selector.unified.SelectorList对象来查找get()/getall()/extract()/extract_first()/re.first()的如何使用。

(1)extract()方法:获取的是一个列表内容;

(2)extract_first()方法:返回列表的第一个内容,也就是extract()列表的第一个元素;

(3)getall()方法:返回所有的元素

(4)get()方法:返回第一个元素,是str类型数据

(5)re()方法:正则的使用。返回所以的满足条件,结果是列表类型

(6)re.first()方法:正则使用,返回的是满足条件第一个元素。

3.3、response.url()/response.urljoin()/response.body()/response.body.decode()等方法

 

(1)response.url()方法:返回请求地址;

(2)response.urljoin()方法:拼凑完整的url;

(3)response.body()方法:返回请求内容,是str字符串类型;

(4)response.body.decode("utf-8")方法:内容的编码类型;
(4)response.encoding是response的编码

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值