【scrapy】爬虫框架从了解到运行

Scrapy简介

Scrapy 是用 Python编写而成用以爬取网站数据、提取结构性数据而编写的应用框架。通过使用Scrapy框架,我们能够简单的爬取指定网站的内容或图片。

Scrapy运行机制

  1. 引擎从调度器中取出一个URL,用于接下来的抓取。

  2. 引擎把URL封装成请求(Request)传给下载器,下载器把资源下载后封装后封装成应答包(Response)。

  3. 爬虫解析Response。

  4. 若解析出实体(Item),则交给实体管道进行进一步的处理。

  5. 若解析出的是URL,则把URL交给Scheduler等待抓取。

Scrapy框架文件结构

首先我们创建一个Scrapy项目,目录结构如下所示。

cnblog/
    scrapy.cfg # 项目的配置文件
    
    cnblog/
         __init__.py
         
        items.py # 定义你所要抓取的字段
        
        pipelines.py # 管道文件,当spider抓取到内容(item)以后,会被送到这里,这些信息(item)在这里会被清洗,去重,保存到文件或者数据库。
        
        middlewares.py # 中间件,主要是对功能的拓展,你可以添加一些自定义的功能,比如添加随机user-agent, 添加proxy。
        
        settings.py # 设置文件,用来设置爬虫的默认信息,相关功能开启与否,比如是否遵循robots协议,设置默认的headers,设置文件的路径,中间件的执行顺序等等。
        
        spiders/ # 在这个文件夹下编写自己的spider
            __init__.py

Scrapy爬取博客园

1.进入项目文件夹,创建自己的爬虫文件,如下的命令在终端运行。

cd cnblog
scrapy genspider cnblog_spider cnblogs.com

2.进入我们刚才创建的爬虫文件cnblog_spider,发现框架已经自动生成了爬虫主要代码,只要补充自己想要爬取的项目即可,我希望爬取博客园的文章链接以及题目,所以我补充了如下代码,顺便进行输出,可以直观的看到项目是否运行成功。

        title = response.xpath('//a[@class="post-item-title"]/text()').extract()
        url = response.xpath('//a[@class="post-item-title"]/@href').extract()
        print(title)
        print(url)

3.在终端运行爬虫项目。

scrapy crawl cnblog_spider

得到如下运行结果,至此一个简单的爬虫项目就运行成功了。

Scrapy实现文件存储

如果希望存储我们爬取的信息,则需要在items.py文件中定义它们,item是保存爬取到的数据的容器,其使用方法和dict字典类似,对于items中定义信息,只需要根据提示补充代码即可。

class CnblogItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()

接下来需要在爬虫文件中导入我们刚才在items中定义的CnblogItem类,使用字典的方法就可以给items进行赋值。最后yield生成器,将items传递给管道pipeline进行后续操作。

    def parse(self, response):
        items = CnblogItem()
        # extract()使得使提取内容转换为Unicode字符串,返回数据类型为list
        items['title'] = response.xpath('//a[@class="post-item-title"]/text()').extract()
        items['url'] = response.xpath('//a[@class="post-item-title"]/@href').extract()
        yield items # 生成器相当于用后销毁,节省内存。

修改管道pipelines.py文件,这里本来有一个自定义的CnblogPipeline类,为了更好的介绍Scrapy框架的使用,我这里又定义了一个PrintPipeline类。管道pipelines.py文件的作用就是实现数据的输出处理,也可以完成存储的工作。

class CnblogPipeline:
    def process_item(self, item, spider):
        with open('cnblogs.txt','a',encoding='utf8') as f:
            title = item['title']
            url = item['url']
            # print(title)
            # print(url)
            for i,j in zip(title,url):
                f.write(i+':'+j+'\n')
        return item

class PrintPipeline:
    def process_item(self, item, spider):
        print('Printitem::'+item['title'])
        return item

最后需要在Seeting.py文件中打开ITEM_PIPELINES,同时添加在管道中新定义类PrintPipeline,并且标注优先级。

ITEM_PIPELINES = {
   'cnblog.pipelines.CnblogPipeline': 300, # 数字代表优先级
   'cnblog.pipelines.PrintPipeline': 500
}

至此,就可以运行Scrapy框架了!

运行完成!!!恭喜你,程序无Bug!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值