zoukankan      html  css  js  c++  java
  • 十九、通过Scrapy提供的API在程序中启动爬虫

    Scrapy在Twisted异步网络库上构建,所以如果程序必须在Twisted reactor里运行

    1、方式一:使用CrawlerProcess类

      CrawlerProcess类(scrapy.crawler.CrawlerProcess)内部将会开启Twisted reactor、配置log和设置Twisted reactor自动关闭。

      可以在CrawlerProcess初始化时传入设置的参数,使用crawl方式运行指定的爬虫类

      ```

      if __name__=="__main__":

        process = CrawlerProcess(

          {

            "USER_AGENT":"Mozilla/5.0 ....",

          }

        )

        process.crawl(爬虫类)

        process.start()

      ```

      也可以在CrawlerProcess初始化时传入项目的settings信息,在crawl方法中传入爬虫的名字

      ```

      if __name__=="__main__":

        process = CrawlerProcess(

          project_settings()

        )

        process.crawl(爬虫名)

        process.start()

      ```

    2、方式二:使用CrawlerRunner

      使用CrawlerRunner时,在spider运行结束后,必须自行关闭Twisted reactor,需要在CrawlerRunner.crawl所返回的对象中添加回调函数。

      ```

      if __name__=="__main__":

        configure_logging({"LOG_FORMAT":"%(levelname)s:%(message)s"})  # 使用configure_logging配置了日志信息的打印格式

        runner = CrawlerRunner()

        d = runner.crawl(爬虫类)  # 通过CrawlerRunner的crawl方法添加爬虫

        d.addBoth(lambda _:reactor.stop())  # 通过addBoth添加关闭Twisted reactor的回调函数

        reactor.run()

      ```

    3、在一个进程中启动多个爬虫

      1、CrawlerProcess方式实现

        ```

        import scrapy

        from scrapy.crawler import CrawlerProcess

        class Myspider_1(scrapy.Spider):

          ...

        class Myspider_2(scrapy.Spider):

          ...

        process = CrawlerProcess()

        process.crawl(Myspider_1)

        process.crawl(Myspider_2)

        process.start()

        ```

      2、CrawlerRunner方式实现

        1、第一种方式

          ```

          import scrapy

          from twisted.internet import reactor

          from scrapy.crawler import CrawlerRunner

          from scrapy.utils.log import configure_logging

          

          class Myspider_1(scrapy.Spider):

            ...

          class Myspider_2(scrapy.Spider):

            ...

          configure_logging()

          runner = CralwerRunner()

          runner.crawl(Myspider_1)

          runner.crawl(Myspider_2)

          d = runner.join()

          d.addBoth(lambda _: reactor.stop())

          reactor.run()

          ```

        2、第二种方式

          ```

          from twisted.internet import reactor,defer

          from scrapy.crawler import CrawlerRunner

          from scrapy.utils.log import configure_logging

          class Myspider_1(scrapy.Spider):

            ...

          class Myspider_2(scrapy.Spider):

            ...

          configure_logging()

          runner = CrawlerRunner()

          @defer.inlineCallbacks

          def crawl():

            yield runner.crawl(Myspider_1)

            yield runner.crawl(Myspider_2)

            reactor.stop()

          crawl()

          reactor.run()

          ```

  • 相关阅读:
    c++继承中的内存布局
    函数调用的原理4点:函数产生名不同,压栈顺序不同,不应由客户清理,客户清理则可执行文件大小更大(许多参考文章,有汇编解释)
    黑马程序员:Java基础总结----JavaBean 内省
    汇编语言理解指针(指针就是汇编的间接寻址,其实就是一个简单方便的运算指令,计算完毕直接就赋值,不是从内存中去取值后赋值)
    设计项目时候的几个小标记
    SendTextMessage如何打开记事本并显示指定内容
    汇编语言---call和ret指令
    汇编语言转移指令规则汇总
    SharePoint Access Service-PowerShell
    对所有CPU寄存器的简述(16位CPU14个,32位CPU16个)
  • 原文地址:https://www.cnblogs.com/nuochengze/p/13151485.html
Copyright © 2011-2022 走看看