2019 7.12学习笔记

1.response是一个"scrapy.http.response.html.HtmlResponse"对象,可以执行"xpath"和"css"语法来提取数据。

2.提取出来的数据,是一个"Selector"或者是一个"SelectorList"对象。如果想要获取其中的字符串,那么应该执行"getall"或者"get"方法。

3.getall方法:获取"Selector"中的多有文本,返回的是一个列表。

4.get方法:获取的是"Selector"中的第一个文本,返回的是一个str类型

5.如果数据解析回来,要传给piplines处理,那么可以使用"yield"来返回,或者是收集所有的item,最后统一使用return返回。

6.item:建议在"items.py"中定义好模型,以后就不要使用字典。

7.pipeline:这个是专门用来保存数据的。其中有三个方法是会经常用的。

 

“open_spider(self,spider)”:当爬虫被打开的时候执行

"process_item(self,spider)":当爬虫有item穿过来的时候会被调用

"close_spider(self,spider)":当爬虫关闭的时候会被调用

要激活pipline,应该在"settings.py"中设置“ITEM_PIPELINES”。

 

代码优化

Exporter优化  pipelines.py代码如下:

# from scrapy.exporters import JsonItemExporter
# class QsbkPipeline(object):
#     def __init__(self):
#         self.fp=open("duanzi.json",'wb')
#         self.exporter=JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')
#         self.exporter.start_exporting()
#     def open_spider(self,spider):
#         print("爬虫开始了...")
#
#     def process_item(self, item, spider):
#         self.exporter.export_item(item)
#         return item
#     def close_spider(self,spider):
#         self.exporter.finish_exporting()
#         self.fp.close()
#         print("爬虫结束了...")
from scrapy.exporters import JsonLinesItemExporter
class QsbkPipeline(object):
    def __init__(self):
        self.fp=open("duanzi.json",'wb')
        self.exporter=JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')
    def open_spider(self,spider):
        print("爬虫开始了...")

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item
    def close_spider(self,spider):
        self.fp.close()
        print("爬虫结束了...")

JsonItemExporter和JsonLinesItemExporter:

保存json数据的时候,可以使用这两个类,让操作变得更简单

1.“JsonItemExporter”:这个是每次把数据添加到内存中,最后统一写入到磁盘中。好处是,存储的数据是一个满足json规则的数据。坏处是,如果数据量比较大,那么比较耗内存。

2.“JsonLinesItemExporter”:这个是每次调用"export_item"的时候就把这个item存储到硬盘中。坏处是每一个字典是一行,整个文件不是一个满足json格式的文件。好处是每次处理数据的时候就直接存储到了硬盘中,这样不会耗内存,数据也比较安全。

 

抓取多个页面

qsbk_spider.py代码优化

import scrapy
from qsbk.items import QsbkItem
from scrapy.http.response.html import HtmlResponse
from scrapy.selector.unified import SelectorList

class QsbkSpiderSpider(scrapy.Spider):
    name = 'qsbk_spider'
    allowed_domains = ['qiushibaike.com']
    start_urls = ['https://www.qiushibaike.com/text/page/1/']
    base_domain="https://www.qiushibaike.com"

    def parse(self, response):
        #SelectorList
        duanzidivs=response.xpath("//div[@id='content-left']/div")
        for duanzidiv in duanzidivs:
            author=duanzidiv.xpath(".//h2/text()").get().strip()
            article=duanzidiv.xpath(".//div[@class='content']//text()").getall()
            article="".join(article).strip()
            item=QsbkItem(author=author,article=article) #固定传的参数 多了少了会报错
            yield item
        next_url=response.xpath("//ul[@class='pagination']/li[last()]/a/@href").get()
        if not next_url:
            return
        else:
            yield  scrapy.Request(self.base_domain+next_url,callback=self.parse)

在settings.py中设置延迟

DOWNLOAD_DELAY = 1

 

创建CrawlSpider

通过 scrapy genspider -t crawl 爬虫名字 域名 创建

 

linkExtractors链接提取器的主要参数讲解:

allow:允许的url。所有满足这个正则表达式的url都会被提取。

deny:禁止的url。所有满足这个正则表达式的url都不会被提取。

allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。

deny_domains:禁止的域名。所有在这个里面指定的域名的Url都不会被提取。

restrict_xpath:严格的xpath,和allow共同过滤链接。

 

Rule规则类:定义爬虫的规则类

link_extractor:一个linkextractor对象,用于定义爬取规则。

callback:满足这个规则的url,应该要执行哪个回调函数,因为crawlspider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。(如果只要获取该页面里更多的url不需要里面的数据,那么可以不指定callback)

follow:指定根据该规则从response中提取的链接是否需要跟进。需要则设置为True。

process_link:从link_extractor中获取链接后会传送给这个函数,用来过滤不需要爬取的链接。

 

scrapy shell:

打开cmd终端,进入到Scrapy项目所在的目录,然后到scrapy框架所在的虚拟环境中,输入命令 scrapy shell 链接      即可进入

1.可以方便我们做一些数据提取的测试代码

2.如果想要执行scrapy命令,那么毫无疑问,肯定是要先进入到scrapy所在的环境中。

3.如果想要读取某个项目的配置信息,那么应该先进入到这个项目中,再执行“scrapy shell命令”

 

Request对象在我们写爬虫,爬取一页的数据需要重新发送一个请求的时候调用。这个类需要传递一些参数,其中比较常用的参数有:

1.url:这个request对象发送请求的url

2.callback:在下载器下载完成相应的数据后执行的回调函数。

3.method:请求的方法。默认为get方法,可以设置为其他方法。

4.headers:请求头,对于一些固定的设置,放在settings.py中指定就可以了。对于那些非固定的,可以在发送请求的时候指定。

5.meta:比较常用,用于不同的请求之间的传递数据。

6.encoding:编码。默认为utf-8。

7.dot_filter:表示不由调度器过滤。执行多次重复的请求的时候用的比较多。

8.errback:在发生错误的时候执行的函数。

 

Response对象一般都是由Scrapy给你自动构建的。因此开发者不需要关心如何创建Response对象,而是如何使用。Response对象有很多属性,可以用来提取数据的。主要有以下属性:

1.meta:从其他请求传过来的meta属性,可以用来保持多个请求之间的数据连接。

2.encoding:返回当前字符串编码和解码的格式。

3.text:将返回来的数据作为unicode字符串返回。

4.body:将返回来的数据作为bytes字符串返回。

5.xpath:xpath选择器。

6.css:css选择器。

 

posted on 2019-07-12 01:11  Joker乔柯  阅读(253)  评论(0编辑  收藏  举报

导航