美文网首页
scrapy学习记录

scrapy学习记录

作者: 奇楠之后 | 来源:发表于2020-05-03 14:18 被阅读0次

    scrapy源码

    scrapy架构

    • Engine 引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心
    • Item 项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item 对象
    • Scheduler 调度器,接受引擎发过来的请求,并将其列中在引擎再次请求的时候将请求提供给引擎
    • Downloader 下载器,下载网页内容,并将网页内容返回给spider
    • Spiders 爬虫,其内定义了爬取的逻辑和网页解析规则,它主要负责解析响应并生成提取结果和新的请求
    • Item Pipeline 项目管道,负责处理由spider从网页中抽取的项目,它的主要任务是清洗、验证和存储数据
    • Downloader Middlewares 下载器中间件,位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求及响应
    • Spide Middlewares 爬虫中间件,位于引擎和爬虫之间的钩子框架,主要处理爬虫输入的响应和输出的结果及新的请求

    命令

    1. 创建项目
      scrapy startproject 项目名称
    2. 创建一个spider
      scrapy genspider 爬虫名称 项目域名
      在创建一个spider时,后面跟的是参数 域名,不要多写其它
    3. 启动爬虫

    scrapy.spiders.Spider 类的基础属性和方法

    属性
    • name:爬虫名称,
    • allowed_domain:允许爬取的域名,是可选配置,不在此域名下的链接,不会被跟进爬取
    • start_urls:起始url列表,当spider开始时,如果没有实现start_requests()方法,默认会从该列表开始抓取
    • crawler:它是由 from_crawler()方法设置的,代表的是本 pider 类对应的 crawler 对象Crawler对象包含了很多项目组件,利用它我们可以获取项目的一些配置信息,如最常见的获取项目的设置信息,即 Setting
    • custom_settings:是一个字典,专属于本 spider 的配置。它会覆盖项目全局的设置。此设置必须在初始化前被更新,必须定义成类变量
    • settings:可以通过该属性获取setting文件中的全局变量
    方法
    • start_requests:该方法用于生成初始请求,返回一个可迭代对象。该方法默认使用start_urls列表中的url构造request,默认request是get请求方式,如果我们想在启动时以 POST 方式访问某个站点,可以直接重写这个方法,发送 POST 请求时使用 FormRequest
      即可
    • parse:当 没有指定回调函数时,该方法会默认被调用。对response进行处理,解析出新的url或数据。
    • closed:当spider关闭时,该方法会被调用。在这里一般会定义释放资源的一些操作或其他收尾操作。

    Downloader Middleware

    通常在下载中间件进行,修改UserAgent,设置Proxy,处理重定向,失败重试,设置Cookies等操作。

    1. process_request(request,spider)
      Request Scrapy 引擎调度给 Downloader 之前, process_request ()方法就会被调用,也就是在Request 从队列里调度出来到 Down loader 下载执行之前,我们都可以用 process_request ()方法对Request 进行处。方法的返回值必须为 None、Response对象、request对象之一 ,或者抛出 IgnoreRequest 。

      • 当返回None时,
    2. process_response(request,response,spider)

    3. process_exception(request,exception,spider)

    常用示例代码

    • selector的独立使用
    from scrapy import Selector
    
    body = '<html>......</html>'
    selector = Selector(text=body)
    title = selector.xpath('//title/text()').extract_first()
    
    • pipeline存储mongo
    import pymongo
    class MongoPipeline(object):
        def __init__(self,mongo_url,mongo_db):
            self.mongo_url = mongo_url
            self.mongo_db = mongo_db
        # 从settings获取变量
        @classmethod
        def from_crawler(cls,crawler):
            return cls(
            crawler.settings.get('MONGO_URL'),
            crawler.settings.get('MONGO_DB')
            )
        def open_spider(self,spider):
            self.client = pymongo.MongoClient(self.mongo_url)
            self.db = self.client[self.mongo_db]
    
        def process_item(self,item,spider):
            name = item.class.name
            self.db[name].insert(dict(item))
            return item
    
        def close_spider(self,spider):
            self.client.close() 
    
    • 修改user-agent
      有两种方法可以修改请求时的user-agent。
      一是修改settings中的USER-AGENT变量
      二是通过downloader middleware的process-request方法修改

    参考书籍:
    《python3网络爬虫开发实战》【崔庆才】·1

    相关文章

      网友评论

          本文标题:scrapy学习记录

          本文链接:https://www.haomeiwen.com/subject/twarghtx.html