• scrapy基本知识


    1. Scrapy使用了Twisted异步网络库来处理网络通讯,整体架构:

    • Scrapy爬虫框架主要由5个部分组成,分别是:Scrapy Engine(Scrapy引擎),Scheduler(调度器),Downloader(下载器),Spiders(蜘蛛),Item Pipeline(项目管道)。爬取过程是Scrapy引擎发送请求,之后调度器把初始URL交给下载器,然后下载器向服务器发送服务请求,得到响应后将下载的网页内容交与蜘蛛来处理,尔后蜘蛛会对网页进行详细的解析。
    • 蜘蛛分析的结果有两种:一种是得到新的URL,之后再次请求调度器,开始进行新一轮的爬取,不断的重复上述过程;另一种是得到所需的数据,之后会转交给项目管道继续处理。项目管道负责数据的清洗、验证、过滤、去重和存储等后期处理,最后由Pipeline输出到文件中,或者存入数据库等。

     scrapy startproject XXX可以产生一个项目,其中:

      items.py是定义储对象的文件,决定爬取哪些项目;middlewares.py文件是中间件,一般不用进行修改,主要负责相关组件之间的请求与响应;pipelines.py是管道文件,决定爬取后的数据如何进行处理和存储;settings.py是项目的设置文件,设置项目管道数据的处理方法、爬虫频率、表名等;spiders文件夹中放置的是爬虫主体文件(用于实现爬虫逻辑)和一个__init__.py空文件。

    python classmethod是用来指定一个类的方法为类方法,可以基于类直接调用方法class.get(),没有此参数指定的类的方法为实例方法。

    2. 对spider来说,爬取的循环类似下文:

      (1) 以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。

      (2) spider中初始的request是通过调用 start_requests() 来获取的。 start_requests() 读取 start_urls 中的URL, 并以 parse 为回调函数生成 Request 。

      (3) 在回调函数内分析返回的(网页)内容,返回 Item 对象或者 Request 或者一个包括二者的可迭代容器。 返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。

      (4) 在回调函数内,可以使用 选择器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。

      (5) 最后,由spider返回的item将被存到数据库(由某些 Item Pipeline 处理)或使用 Feed exports 存入到文件中。

    3. 选择器 

      Xpath是一门用来在XML文件中选择节点的语言,也可以用在HTML上。Scrapy选择器构建于 lxml库之上.

      response 是 HtmlResponse 或 XmlResponse 的一个对象,将被用来选择和提取数据。如response.xpath("//div[@class='book-mid-info']")

      // 表示相对路径 @后面接属性

    4. Items 

      爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy提供 Item 类来满足这样的需求。

    class Product(scrapy.Item):
        name = scrapy.Field()
        price = scrapy.Field()
        stock = scrapy.Field()
    在spider调用item实例,予以赋值
      

      item pipeline的一些典型应用:

    • 清理HTML数据
    • 验证爬取的数据(检查item包含某些字段)
    • 查重(并丢弃)
    • 将爬取结果保存到数据库中

    正则表达式:re.search()并不要求必须从字符串的开头进行匹配,也就是说,正则表达式可以是字符串的一部分。

    5. Rule

    rules = (
    Rule(LinkExtractor(allow=r'info/d+'), callback='parse_item'),
    )

    1.rules内规定了对响应中url的爬取规则,爬取得到的url会被再次进行请求,并根据callback函数和follow属性的设置进行解析或跟进。
    这里强调两点:一是会对所有返回的response进行url提取,包括首次url请求得来的response;二是rules列表中规定的所有Rule都会被执行。

    2.allow参数没有必要写出要提取的url完整的正则表达式,部分即可,只要能够区别开来。且最重要的是,即使原网页中写的是相对url,通过LinkExtractor这个类也可以提取中绝对的url。

    link = LinkExtractor(allow='d{6}.html',restrict_xpaths='//div//table//a')

    links = link.extract_links(response)

    6. 异步加载爬虫

      之前爬取的网站,可以用直接利用Xpath去提取数据,因为所有的数据在一次请求后会全部被加载出来。然而,现在有一些网站使用了异步加载的技术,就是让一部分网页信息先加载出来,然后剩下的东西在满足某种条件下才会被加载,这样做的好处是可以提高网页的加载速度。

    7. 正则表达式

      s  匹配任何空白字符,包括空格、制表符、换页符等等

      S  匹配任何非空白字符。

      $  匹配结尾位置

      *  匹配前面字符0或多次

      +  匹配前面字符1或多次

      ?  匹配前面字符0或1次

      {m,n}  至少匹配m次至多n次

      d  数字

      w  字母,数字,下划线

      W  非字母数字下划线

  • 相关阅读:
    清理计算机硬盘
    DIY-组装
    go函数类型的使用
    go同步互斥锁
    Go读写文件
    go mod
    go html
    channel
    arp和rarp协议
    自己实现的反射
  • 原文地址:https://www.cnblogs.com/kongrui/p/13193790.html
Copyright © 2020-2023  润新知