爬虫——2020.10.08 scrapy框架基本使用

本文介绍了Scrapy框架的基本概念、环境配置、创建工程的方法以及数据解析和持久化存储的操作。在Scrapy中,可以通过genspider命令创建爬虫文件,并在settings.py中配置相关参数。数据解析时,需要设置USER_AGENT,提取数据并存储。持久化存储可以通过Scrapy终端指令直接输出到不同格式的文本文件,或者通过管道实现更通用的数据存储方式。面试题中提到,可以通过多个管道分别实现本地和数据库存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scrapy框架基本概念:

  1. 框架:就是一个集成了很多功能并且具有很强通用性的的一个项目模板。
  2. 学习:学习其中封装好的各种功能的用法。
  3. scrapy:爬虫中封装好的一个明星框架。具有高性能的持久化存储,异步数据下载,高性能的数据解析,分布式。
  4. 环境配置:pip install scrapy。过程会安装一些依赖项。测试:在终端输入scrapy指令,没有报错即表示安装成功。

scrapy框架基本使用:

  1. 创建一个工程:scrapy startproject xxpro,在终端输入,执行后会在你指定的目录下生成与你创建的工程名称相同的一个文件夹,文件夹下包含了一个spiders包,必须要存放一个爬虫的源文件。
    在这里插入图片描述
    在这里插入图片描述
    settings.py是对应的工程配置文件:其中,可以做以下修改,robots协议,显示指定类型的日志信息。
    在这里插入图片描述

  2. 在spides子目录中创建一个爬虫文件:首先要cd到 当前的工程目录中,即 xxxpro。在这里插入图片描述
    然后创建爬虫文件:
    scrapy genspider spiderName www.xxx.com(爬虫的名字,起始的url)在这里插入图片描述
    在这里插入图片描述
    其中,first.py文件含义如下:

import scrapy


class FirstSpider(scrapy.Spider):
    #name:爬虫文件的名称,就是爬虫源文件的唯一标识
    name = 'first'
    #allowed_domains允许的域名:允许访问的url,用来限定urls列表中哪些可以请求发送,一般不使用allowed_domains
    allowed_domains = ['www.xxx.com']
    #start_urls起始的url列表:该列表中的URL会被scrapy自动进行请求发送
    start_urls = ['http://www.xxx.com/']
    
    #parse用作数据解析:response参数表示的就是请求成功后返回的响应对象,每一个url都会调用一次parse
    def parse(self, response):
        pass

  1. 执行工程:scrapy crawl spiderName

scrapy数据解析操作:

注意:在创建好爬虫文件后,首先要在配置文件中修改:USER_AGENT=‘伪装的UA’,ROBOTSTXT_OBEY = False,LOG_LEVEL = ‘ERROR’。

获取字符串数据 :

import scrapy

class FirstSpider(scrapy.Spider):
    name = 'first'
    #start_urls起始的url列表:该列表中的URL会被scrapy自动进行请求发送
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        #解析作者的名称和段子内容
        div_list = response.xpath('//div[@class="article block untagged mb15 typs_long"]')
        #xpath返回的是列表,但是列表元素一定是selector类型的对象
        author = div_list.xpath('./div[1]/a[2]/h2/text()')[0].extract()
        #列表调用了extract之后,表示将列表中每一个selector对象中data对应的字符串提取了出来
        content = div_list.xpath('./a/div//text()').extract() #将字符串提取出来后,存进的仍一个列表
        #将列表转字符串
        content = ''.join(content)
        print(author,content)

未使用extract()之前,返回的是selector对象。使用之后之后返回的是data中的值的列表,需要用join转成字符串。
在这里插入图片描述

scrapy持久化存储:

  1. 基于终端指令:
    要求:只可以将parse方法的返回值存储到本地文本文件中。
    持久化存储对应的文本类型只可以为:‘json’,‘jsonlines’,‘csv’,‘xml’,‘marshal’,‘pickle’
    指令:scrapy crawl spiderName -o filepath
    优点:简介,便捷
    缺点:数据只可以存储指定后缀的文本文件中
  2. 基于管道
    (1)编码流程:
    a.数据解析
import scrapy
from ..items import FirstproItem

class FirstSpider(scrapy.Spider):
    #name:爬虫文件的名称,就是爬虫源文件的唯一标识
    name = 'first'
    #start_urls起始的url列表:该列表中的URL会被scrapy自动进行请求发送
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        #解析作者的名称和段子内容
        div_list = response.xpath('//div[@class="article block untagged mb15 typs_long"]')
        #xpath返回的是列表,但是列表元素一定是selector类型的对象
        author = div_list.xpath('./div[1]/a[2]/h2/text()')[0].extract()
        #列表调用了extract之后,表示将列表中每一个selector对象中data对应的字符串提取了出来
        content = div_list.xpath('./a/div//text()').extract() #将字符串提取出来后,存进的仍一个列表
        #将列表转字符串
        content = ''.join(content)

        item = FirstproItem()
        item['author'] = author
        item['content'] = content

        yield item #将item提交给了管道

b.在item类中定义相关的属性


import scrapy


class FirstproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    author = scrapy.Field()
    content= scrapy.Field()
    pass

c.将解析的数据封装存储到item类型的对象中
d.将item类型的对象提交给管道进行持久化存储
e.在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作

class FirstproPipeline:
    #专门用来处理item类型的对象
    #该方法可以接收爬虫文件提交过来的的item对象
    #该方法每接收到一个item就会被调用一次
    fp = None
    #重写父类的一个方法:该方法只在开始爬虫时执行一次
    def open_spider(self,spider):
        print('start spider!!!')
        self.fp = open('./first.txt','w',encoding='utf-8')

    def process_item(self, item, spider):
        author = item['author']
        content = item['content']
        self.fp.write(author + ':' + content + '\n')
        return item

    def close_spider(self,spider):
        print('End spider!!!')
        self.fp.close()

f.在配置文件中开启管道
在这里插入图片描述
(2)好处:通用性强。编码稍繁琐。

(3)面试题:将爬取的数据一份存储到本地一份存储到数据库,如何实现?
a.管道文件中一个管道类对应的是将数据存储到一种平台
b.爬虫文件提交的item只会给管道文件中第一个被执行的管道类接受
c.process_item中的return item 表示将item传递给下一个即将被执行的管道类。也就是说return item可以将item交给下一个管道类,在编码时要注意这一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值