• python | 爬虫笔记


    一、简介

    Scrapy是一个基于Twisted 的异步处理框架,是针对爬虫过程中的网站数据爬取、结构性数据提取而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

    1.1 安装

    pip3 install Scrapy

    1.2 框架介绍

    组成:
      · Engine 引擎,处理整个系统的数据流处理、触发事务
      · Item 项目,定义爬取结果的数据结构
      · Scheduler 调度器
      · Downloader 下载器
      · Spider 定义爬取逻辑和网页解析规则
      · Item Pipeline 项目管道,清洗、验证和存储数据
      · Downloader Middlewares 下载器中间件
      · Spider Middlewares 蜘蛛中间件

    1.3 部分详解

    1.3.1 spider
    · 定义爬取网站的动作
    · 分析爬取下来的网页
     
    爬取循环过程如下:
    初始的url初始化request-> Response作为参数返回回调函数 -> 回调函数分析网页内容 1)返回字典或item,可用pipelin处理 2)返回request 回调函数循环请求,直到生成item
     
    1.3.2 Downloader Middleware
    Request和Response之间的处理模块,可以完成修改 User-Agent、 处理重定向 、设置代理、失败重试、 设置 Cookies等功能。此模块非常重要
    核心方法
    process_request(request, spider)
    process_response(request, response, spider)
    process_exception(request, exception, spider)
     
    1.3.3 Spider Middleware
    spider处理机制的子框架
    核心方法:
    process_spider_input(response, spider)
    process_spider_output(response, result, spider)
    process_spider_exception(response, exception, spider)
    process_start_requests(start_requests, spider)
     
    1.3.4 Item Pipeline
    open_spider(spider)
    close_spider(spider)
    from_crawler(cls, crawler)

    1.4 selector

    1)直接使用
    from scrapy import selector
     
    body = '...'
    selector = Selector(text=body)
    title = selector.xpath('//title/text()').extract_first() #提取title标签里的内容
    print(title)

    构建时传入text参数,生成selector对象,通过xpath(), css()等方法提取

     
    2)shell文件
    scrapy shell 网址
    之后在shell中可以用不同选择器进行操作。selector主要操作Response这个变量来进行解析
    · result结果得到selectorlist类型列表变量;
    · 可使用xpath()、css() 和正则表达式的方法选择
    · extract()/ extract_first() 获取内容
    e.g.
    result = response.selector.xpath('//a')
    result
    result.xpath('.//a[@href="image1.html"]/text()')extract_first() #xpath
    result.css('a[@href="image1.html"]::text]).extract_first() #css
    #备注:css中获取文本和属性需要用::text和::attr()的写法

    二、上手项目

    流程框架:抓取第一页-获取内容和下一页连接-翻页爬取-保存爬取结果

    2.1 创建项目

    通过命令行来创建项目
    scrapy startproject tutorial
    创建目录如下

    tutorial/
        scrapy.cfg
        tutorial/
            __init__.py
            items.py
            pipelines.py
            settings.py
            spiders/
                __init__.py
                ...

    2.2 编写一个Spider

    Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。
     
    为了创建一个Spider,必须继承 scrapy.Spider 类, 且定义以下三个属性:
      · name
      · start_urls
      · parse: 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
    scrapy genspider quotes quotes.toscrape.com

    2.3 创建Item

    Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
    在item中定义相应的字段。编辑 tutorial 目录中的 items.py 文件
    import scrapy
    
    class QuoteItem(scrapy.Item):
        title = scrapy.Field()
        link = scrapy.Field()
        desc = scrapy.Field()
    字段field() 指明了每个字段的元数据

    2.4 解析Response

    parse()方法的参数 resposne 是 start_urls 里面的链接爬取后的结果 。 所以在 parse()方法中,我们可以直接对 response 变量包含的内容进行解析,比如浏览请求结果的网页源代码,或者进一步分析源代码内容,或者找出结果中的链接而得到下一个请求 。
     
    分析网页结构
    进入项目的根目录,执行下列命令启动spider:
    scrapy crawl quotes

    2.5 使用item

    Item可以理解为一个字典,不过在声明的时候需要实例化。 然后依次用刚才解析的结果赋值 Item的每一个字段, 最后将 Item返回即可。
    quotes = response.css('.quote')   #选择quote的区块
            for quote in quotes:
                item = QuoteItem()
                item['text'] = quote.css('.text::text').extract_first()
                item['author'] = quote.css('.author::text').extract_first()
                item['tags'] = quote.css('.tags .tag::text').extract()
        yield item
    首页的所有内容被解析出来 ,并被赋值成了一个个 QuoteItem。
    scrapy shell quotes.toscrape.com #可以在命令行交互

    2.6 后续Request-多页抓取

    找到next按钮,查看源代码,可以根据链接构建下一个请求。
    通过递归调用,回调函数调用自己,实现翻页循环
    next = response.css('.pager .next a::attr(href)').extract_first()
            url = response.urljoin(next)
            yield scrapy.Request(url=url, callback=self.parse) 

    2.7 保存到文件

    scrapy crawl quotes -o quotes.json #也可以保存成csv,xml等不同文件格式

    2.8 使用Item Pipeline

    通过item Pipeline可以实现更复杂的操作,比如将数据保存到MongoDB,或者筛选某些有用的item
    Pipeline功能主要包括:
    - 清理 HTML数据。
    - 验证爬取数据,检查爬取字段
    - 查重井丢弃重复内容。
    - 将爬取结果保存到数据库。
     
    定义一个类并实现process_item()方法
    两个参数item和spider实例
    from scrapy.exceptions import DropItem
    
    class TextPipeline(object):
        def __init__(self):
            self.limit = 50
    
        def process_item(self, item, spider):
            if item['text']:
                if len(item['text']) > self.limit:
                    item['text'] = item['text'][0:self.limit].rstrip() + '...'  #设置长度50截断字符串
                return item
            else:
                return DropItem('Missing Text')
    处理后的item即可存入MongoDB,其中涉及另外几个方法
    - from_crawler 类方法@class,通过crawler可以拿到全局配置的信息,在setting.py中。比如在其中设置MongoDB的名称和地址,然后通过这个方法获取
    - openspider
    - closespider
    通过process_item方法执行数据插入操作
    执行后可在数据库中查看对应表格
     
    本节对应代码请见:

    ##本系列内容为《python3爬虫开发实战》学习笔记。本系列博客列表如下:

    (零)学习路线

    (一)开发环境配置

    (二)爬虫基础

    (三)基本库使用

    (四)解析库使用

    (五)数据存储

    (六)Ajax数据爬取

    (七)动态渲染页面爬取Selenium

    持续更新...

  • 相关阅读:
    算法导论————KMP
    KMP算法
    几个很好的OJ网站
    查找(二分、hash、桶)
    动态规划
    贪心(未完待续)
    搜索的题
    codeVS 1031 质数环
    《将博客搬至CSDN》
    HDU1717小数化分数2
  • 原文地址:https://www.cnblogs.com/geo-will/p/9727020.html
Copyright © 2020-2023  润新知