scrapy框架

前言

scrapy简介

  • 框架就是一个集成了很多功能并且具有很强通用性的一个项目模板

  • 专门学习框架封装的各种功能的详细用法

  • scrapy就是爬虫中封装好的一个明星框架。功能:高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式

scrapy框架的基本使用

  • 创建一个工程:scrapy startproject xxxPro

  • cd xxxPro

  • 在spiders子目录中创建一个爬虫文件

  • 执行工程:

    • scrapy crawl spiderName

scrapy数据解析

scrapy持久化存储

  • 基于终端指令:

    • 要求:只可以将parse方法的返回值存储到本地的文本文件中

    • 注意:持久化存储对应的文本文件的类型只可以为:'json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle

    • 指令:scrapy crawl xxx -o filePath

    • 好处:简介高效便捷

    • 缺点:局限性比较强(数据只可以存储到指定后缀的文本文件中)

  • 基于管道:

    • 编码流程:

      • 数据解析

      • 在item类中定义相关的属性

      • 将解析的数据封装存储到item类型的对象

      • 将item类型的对象提交给管道进行持久化存储的操作

      • 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作

      • 在配置文件中开启管道

    • 好处:

      • 通用性强。

案例实现

需求:爬取网站风景图片的图片名

先通过终端指令scrapy startproject fengjiingPro新建文件,再通过scrapy genspider fengjing www.xxx.com建立spider文件。

在spider文件中,注释掉allow_domains,输入start_url。

为了获取每一页图片名称,需要生成每一页对应的url,因此设置要设置一个通用的url模板。

 class MeinvSpider(scrapy.Spider):
     name = 'meinv'
     #allowed_domains = ['www.xxx.com']
     start_urls = ['https://pic.netbian.com/4kfengjing/']
     #生成一个通用的url模板
     url='https://pic.netbian.com/4kfengjing/index_%d.html'
     page_num=2

定义prase函数。获取每个图片对应的li标签,再从li标签中获取图片名称,为了使page_num与之对应的url变化,用格式化format。最后使用生成器函数回调parse,实现递归。

 def parse(self, response):
     li_list=response.xpath('//*[@id="main"]/div[3]/ul/li')
     for li in li_list:
         img_name=li.xpath('./a/b/text() | ./a/text() ').extract_first()#./a/b/text() | ./a/text()  防止a标签下不存在b标签产生None
         print(img_name)
     if self.page_num<=10:
         new_url=format(self.url%self.page_num)
         self.page_num+=1
         #手动请求发送:callback调函数是专门用于数据解析的,callback再次调用parse实现递归,再次执行parse函数
         yield scrapy.Request( url=new_url,callback=self.parse)

在setting文件中取消UA注释进行UA伪装,君子协定为False,并输入LOG_LEVEL='ERROR'表示仅输出错误的日志信息。

因为并没有进行持久化存储,直接将结果打印出来,所以items未用到。


版权声明:本文为qq_44247831原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。