scrapy框架

<!doctype html>

scrapy框架

scrapy框架

简介:

所谓的框架其实就是一个被集成了很多功能且具有很强通用性的一个项目模板。 - 学习:学习是框架中集成好的各种功能的特性是作用。 - 进阶:逐步的探索框架的底层。 - scrapy:是一个专门用于异步爬虫的框架。 - 高性能的数据解析、请求发送,持久化存储,全站数据爬取,中间件,分布式...... - 环境的安装: - mac、linum:pip install scrapy - windows: - a. pip3 install wheel

- b. 下载twisted文件,下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

- c. 进入下载目录,执行 pip install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl - Twisted:就是一个异步的架构。被作用在了scrapy中。 - 安装报错:需要更换另一个版本的twisted文件进行安装即可。

- d. pip install pywin32

- e. pip install scrapy - 测试:cmd中scrapy按下回车,如果没有报错说明安装成功。

scrapy的基本使用: - 创建一个工程: - scrapy startproject ProName - 目录结构: - spiders:爬虫文件夹 - 必须要存放一个爬虫源文件 settings:工程的配置文件 - cd ProName - 创建爬虫源文件: - scrapy genspider spiderName imgwww.xxx.com - 编写对应的代码在爬虫文件中 - 执行工程 - scrapy crawl spiderName - 执行工程后,默认会输出工程所有的日志信息。 - 指定类型日志的输出: settings.py: - LOG_LEVEL = 'ERROR'

scrapy框架基本总结

创建scrapy框架命令:scrapy startproject 工程名

在进入第二个工程名下创建爬虫源文件命令scrapy genspider 源文件名称 允许请求的域名

执行爬虫工程命令:scrapy crawl 源文件名称

爬虫文件spiderName内容阐述: - name:爬虫文件名称,该文件的唯一表示 - start_urls:起始url列表,存储的都是url,url可以被自动进行get请求的发送 - parse方法:请求后的数据解析操作 settings.py: - 1.禁止robots - 2.指定日志类型:LOG_LEVEL = 'ERROR' - 3.UA伪装

scrapy数据解析

使用:response.xpath('xpath表达式')

scrapy封装的xpath和etree的xpath区别:

scrapy中的xpath直接将定位到的标签存储的值或者属性值取出,返回的是Selector对象,且相关的数据值是存储在Selector对象的data属性中,需要调用extract,exctract_first()取出字符串数据

持久化存储

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

    要求:该种方法只可以将parse方法的返回值存储到本地指定后缀的文本文件中

    执行命令:scrapy crawl 源文件名称 -o filepath

  • 基于管道的持久化存储(重点)

    在爬虫文件中进行数据解析

    • 步骤一解析出几个字段的数据,再次就定义几个属性

    在items.py中定义相关属性

    在爬虫文件中将解析到的数据封装到Item类型对象中

    将Item类型的对象提交给管道

    在管道文件(piplines.py)中,接收爬虫文件提交过来的Item类型对象,且对其进行任意形式的持久化存储

    在配置文件中开启管道机制

基于换到实现数据的备份

  • 将爬取到的数据分别存储到不同的载体

  • 实现:将数据一份存储到mysql,一分存储到redis

  • 问题:管道文件中的一个管道类表示怎样的一组操作呢?

    • 一个管道类对应一种形式的持久化存储操作。如果将数据存储到不同的载体中需要使用多个管道类
  • 已经定义好的三个管道类,将数据写入到三个载体中进行存储:

    • item会不会依次提交给三个管道类

      • 不会,爬虫文件中的item只会提交给优先级最高的管道类
      • 优先级高的管道类需要在process_item实现return item,将数据返回给管道类
  • 手动请求发送

    • yield scrapy.Request(url,callback):GET
    • callback指定解析函数,用于解析数据
  • 为什么start_urls列表中的url会被自动进行get请求的发送?

    • 因为列表中的url其实是被start_request这个方法实现的get请求发送

      def start_requests(self):
          for u in self.start_urls:
              yield scrapy.Request(url=u,callback=self.parse)
      
  • 如何将start_urls中的url默认进行post请求发送?

    • 重写start_requests方法即可

      def start_requests(self):
          for u in self.start_urls:
              yield scrapy.FormRequest(url=u,callback=self.parse)
      

scrapy的五大核心组件

组件的作用:

引擎(scrapy):用来处理整个系统的数据流处理,触发事务(框架核心)

调度器(Scheduler):用来接收引擎发过来的请求对象,压入队列中,并在引擎再次请求的时候返回请求对象,例子:可以想象成一个url(抓取网页的网址或者是链接)的有限队列,由它决定下一个要抓取的网址是什么,同时去除重复的网址

下载器(Downloader):用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器时间里在twisted这个搞笑的异步模型上的)

爬虫(Spiders):爬虫主要是干活的,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

项目管道(PipeLine):负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清楚不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据

请求实现深度爬取

深度爬取:爬取的数据没有在同一张页面中(首页数据+详情页数据)

在scrapy中如果没有请求传参我们是无法持久化存储数据

实现方式:

scrapy.Request(url, callback, meta)

mate是一个字典,可以将meta传递给callback

callback取出meta:

request.meta

请求传参实现的深度爬取

深度爬取:爬取的数据没有在同一张页面中(首页数据+详情业数据)

在scrapy中如果没有请求传参我们是无法持久化储存数据

实现方式:scrapy.Response(url, callback=parse_reponse, meta={"item": item})

callback取出meta参数

中间件机制

爬虫中间件

介于引擎和爬虫中间件

下载中间件

介于引擎和下载器中间

下载中间件的代码:


class MiddleproDownloaderMiddleware(object):

# 拦截所有(正常&amp;异常)的请求
#参数:request就是拦截到的请求,spider就是爬虫类实例化的对象
def process_request(self, request, spider):
    print(&#39;process_request()&#39;)
    request.headers[&#39;User-Agent&#39;] = &#39;xxx&#39;
    # request.headers[&#39;Cookie&#39;] = &#39;xxxxx&#39;
    return None #or request
#拦截所有的响应对象
#参数:response拦截到的响应对象,request响应对象对应的请求对象
def process_response(self, request, response, spider):
    print(&#39;process_response()&#39;)
    return response
#拦截异常的请求
#参数:request就是拦截到的发生异常的请求
#作用:想要将异常的请求进行修正,将其变成正常的请求,然后对其进行重新发送
def process_exception(self, request, exception, spider):
    #请求的ip被禁掉,该请求就会变成一个异常的请求
    request.meta[&#39;proxy&#39;] = &#39;http://ip:port&#39; #设置代理
    print(&#39;process_exception()&#39;)
    return request #将异常的请求修正后将其进行重新发送

拦截请求:

篡改请求url

伪装请求头信息

  • UA
  • cookie

设置请求代理

代理操作必须使用中间件才可以实现

拦截响应

篡改响应数据

大文件下载:是在管道中发送请求

下属管道类是scrapy封装好的我们直接用即可:

from scrapy.pipelines.imges import ImagesPipeline #提供了下载功能

重写该管道类的三个方法:

get_medis_requests 对图片地址发起请求

file_path

返回图片名称即可

item_completed

返回item,将其返回给下一个即将被执行的管道类

在配置文件中添加:

IMG_STORE = 'dirName'

settings常用配置

增加并发

默认开启并发的线程为32个,可以适当进行增加。在settings配置配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。

禁止cookie

如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬去的效率。在配置文件中编写的:COOKIES_ENABLED = False

禁止重试

对失败的HTTP进行重新请求(重试)会减慢爬去的速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False

减少下载超市:

如果对一个非常慢的链接进行爬取,减少下载超市可以能让卡主的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s

CrawlSpider

其实Spider的一个子类。Spider爬虫文件中爬取爬虫类的父类

  • 子类的功能一定是多余父类

  • 作用:被用做专业实现全栈数据爬取

    • 将一个页面的所有页码对应的数据进行爬取

基本使用:

  • 创建一个工程

  • cd 工程

  • 创建一个基于CrawlSpiderder的爬虫文件

  • 注意:

    1. 一个连接提取器对应一个规则解析器(多个连接提取器和多个规则解析器)
    2. 在实现深度爬取的过程中需要和scrapy.Response()结合使用

分布式

增量式

原文地址:https://www.cnblogs.com/g15009428458/p/12587387.html