Scrapy小谈

1,145 阅读4分钟

有补充的可以联系我

如果有更好的技巧或者是一些心得也可以分享给我~

  • Author: Leo
  • Wechat: Leo-sunhailin
  • E-mail: 379978424@qq.com
  • 会一直维护下去,待补充...

直入主题

Scrapy是一个基于Twisted的异步多线程的爬虫框架

核心爬虫的步骤就是: parse -> yield item -> pipeline

其余就是不同的中间件的问题了,还有一些根据业务需求开发的模块
只要再完整周期中实现就好,Scrapy都会帮你解决的.

基本的Scrapy的爬虫就不讲了,自己体会百度的各种案例就好.
接下来将几种特别的,也是我自己轻身试验过的.

1、 动态JS爬虫
    这种爬虫一般就是页面上的数据并不在源代码中生成。

    这里划分两种:
    1.1、 有json的在后台返回,且能直接访问json的链接获取数据
          解决办法: 这种直接用最简单的请求就好了.

    1.2、 没有json在后台返回,或者有json,但不能访问(服务器做了访问限制的)
          解决办法: 也是两种.
          1.2.1、 Scrapy + selenium + webdriver(做过项目)
          1.2.2、 Scrapy-splash(准备实验)

          一般来说两种都差不多.而且我觉得selenium的也是最简单的,模拟人工操作
          浏览器,只要知道相对应操作的标签位置就能开发代码,而且官方文档和社区
          都很强大,所以懂得使用selenuim + webdriver的基本上都可以结合用
          Scrapy写一个多线程的爬虫.

          那至于splash为啥不那么简单呢,其实实际上是差不多的,也是需要学习一些
          别的东西例如代码里要写一些新的写法,而且splash的部署是用docker的,对
          于没接触过docker的同学来说是一件挑战.毕竟,官方文档很无情的没有给出
          Windows下的docker安装.这和splash本身是应对于分布式部署来说也是有他
          的道理所在。至于docker的安装就需要自行百度.

          Ps: 有空我会完善自己试验的一篇Scrapy-Splash的爬虫文章出来,敬请期待~

2、 "多线程"爬虫
    这种爬虫,也算是自己对于自己爬虫方面的一个补充吧,毕竟以前写的都是线程池的单
    爬虫多链接的一种形式.

    话不多说,直接说为啥叫"多线程".实际上并没有多进程这种概念在Scrapy里面.因为
    Scrapy是基于Twisted这种基于事件驱动的网络引擎框架,虽然提高了效率和IO进程
    的利用效率,但是实际上还是单个线程而已.Twisted在一定程度的提高线程的利用率
    ,能够在有限的时间通过对一个线程的调度,完成多个线程的任务(见下模型图)

    回到Scrapy项目本身.在spiders文件夹中可以创建多个爬虫,可以分开执行,Scrapy
    会自动识别的.那么问题来了,怎么同时启动呢?
    回归官方文档中,就能找到这么个东西叫commands.当改写这个东西以后可以创建一个
    py文件,里面调用CrawlProcess这个方法即可。大致如下:

    # 获得项目的基本配置
    settings = get_project_settings()
    # 爬虫线程
    process = CrawlerProcess(settings)
    # 多爬虫
    process.crawl(<A爬虫>)
    process.crawl(<B爬虫>)
    # 启动
    process.start()

    至于process.crawl里面的就是项目对应的不同爬虫类的名字.

    接下来有人会问,启动了不用关闭嘛?
    很显然这个问题可以回答需要,但是不是在这里.
    关闭的逻辑很明显肯定是在你的爬虫逻辑里面实现的。假设你有多个不同时间结束的
    爬虫,那么如果你统一关闭了,那么在爬取过程中有的爬虫跑完就又继续跑,会造成数
    据重复或者一直无意义的请求。
    至于在爬虫里面的逻辑怎么写,就得看具体的逻辑了,这里只给出关键代码: 

    # 关闭爬虫
    scrapy.Spider.close(<爬虫类名>, reason=<可自定义,不可缺的变量,随便写写就好>)

    下面给出个简单的例子: 链接见下面

Scrapy多线程并发爬虫: Github地址

Twisted的模型:

image
image


问题区

还有其他什么的好的东西,希望各位可以分享分享~

1. Scrapy监控是一个短板.目前只能想到的是用一个中间表去维护爬虫项目.用flask-restful + vue-admin进行管理

2. Scrapy的多线程爬虫虽好,但是。。日志流用的却是同一个(貌似并不能分离.需要待我研究下).

3. item到pipeline的地方,在多线程爬虫的时候process_item需要写很多个if-elif.如果什么时候Scrapy能够通过配置
文件去指定某个爬虫对应某个pipeline就好了,这样就可以"分而治之"