Scrapy基于终端指令的持久化存储

保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作。

scrapy使用流程:
创建工程:
scrapy startproject ProName
进入工程目录:
cd ProName
创建爬虫文件:
scrapy genspider spiderName www.xxx.com
编写相关操作代码
执行工程:
scrapy crawl spiderName
执行指令:
执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储
scrapy crawl 爬虫名称 -o xxx.json
scrapy crawl 爬虫名称 -o xxx.xml
scrapy crawl 爬虫名称 -o xxx.csv

将糗事百科作者和段子内容数据进行爬取切持久化存储

创建工程和爬虫文件
scrapy startproject QiuBai

scrapy genspider QiuBaiSpider https://www.qiushibaike.com/

代码

class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'  # 应用名称(唯一标识)
    # 允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
    allowed_domains = ['https://www.qiushibaike.com/']
    # 起始爬取的url
    start_urls = ['https://www.qiushibaike.com/text']

    # 访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll
    def parse(self, response):
        # print(response.text)  # 获取字符串类型的响应内容
        # 获取作者名称和内容
        # print(response.body)  # 获取字节类型的相应内容
        # xpath为response中的方法,可以将xpath表达式直接作用于该函数中
        odiv = response.xpath('//div[@class="col1 old-style-col1"]/div')
        print(len(odiv))
        content_list = []  # 用于存储解析到的数据
        for div_item in odiv:
            # xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。
            # 我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
            author = div_item.xpath('.//div[1]/a[2]/h2/text()')[0].extract()
            content = div_item.xpath('.//div[@class="content"]/span/text()').extract()
            content = ''.join(content)  # 列表转换为字符串
            # 打印展示爬取到的数据
            # print(author, content)

            dic = {
                'author':author.strip(),
                'content':content.strip()
            }

            content_list.append(dic)  # 内容列表
        return content_list

执行

scrapy crawl qiubai -o qiubai1.json -s FEED_EXPORT_ENCODING=utf-8

其中 -s FEED_EXPORT_ENCODING=utf-8
为解决中文乱码

结果

 

posted @ 2020-03-31 20:29  一只小小的寄居蟹  阅读(475)  评论(0编辑  收藏  举报