• 欢迎来到本博客,希望可以y一起学习与分享

scrapy进阶(四)–scrapy暂停和重启,及url去重原理,telenet简单使用

Python benz 3年前 (2018-10-20) 149次浏览 0个评论 扫描二维码
文章目录[隐藏]

scrapy暂停与重启

有时候,对正在爬虫的项目进行暂停,过一段时间后,启动爬虫,从上次暂停的位置接着爬取。这样,scrapy为我们提供了暂停与重启的功能。

创建暂停

1、进入到scrapy项目的根目录下。
2、在scrapy项目里创建保存记录信息的文件夹,我命名为:job_info。

  • 要暂停,就要保留一些中间信息,以便重启读取中间信息并从当前位置继续爬取,则需要一个目录存放中间信息

3、cmd输入创建暂停的命令:scrapy crawl 爬虫名称 -s JOBDIR=保存进程的文件夹目录 (-s是-set的意思)。

  • 比如我要运行的spider的name为lagou ,文件夹目录是scrapy目录下的job_info/001
    (001表示这是一次爬取任务,重新新建任务需要重新建立目录,比如002),
    我需要运行的指令为:
    scrapy crawl lagou -s JOBDIR=job_info/001
  • 可以在 settings 和 custome_setting 中设置 :
    JOBDIR= job_info/001

暂停

4、爬虫已经启动,我们可以按键盘上的ctrl+c停止爬虫。
ctrl-c 后就会将暂停信息保存到001 要想重新开始则 再次运行 :
scrapy crawl spider lagou -s JOBDIR= job_info/001 然后会继续爬取没有做完的东西

  • 为什么不能在pycharm中使用能
    因为爬虫暂停接收的是Ctrl+C信号,而pychar暂停时没有使用Ctrl+C信号
  • 一次Ctrl+C
    暂停只能按一次,多次也会直接关闭,并且按下Ctrl+C后spider还是会继续运行,它需要完处理未完成的任务等善后工作
    结束后显示:
    [scrapy.core.engine] INFO: Spider closed (shutdown)

5、停止后我们看一下记录文件夹,会多出3个文件

request.seen是保存的已经访问了的url,spider.state是spider的状态信息,request.queue中有active.json和p0两个文件,p0是还需要继续做的request(跑完该文件就没有了)

重启

6、 再次运行 scrapy crawl spider lagou -s JOBDIR= job_info/001 然后会继续爬取没有做完的东西
7、需要重新爬取就换个文件 002就行了

scrapy去重原理

1、需要将dont_filter设置为False开启去重,默认是True,没有开启去重;
2、对于每一个url的请求,调度器都会根据请求得相关信息加密(request_fingerprint)得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有存在这个加密后的数据,就将这个Request对象放入队列中,等待被调度。
也就是说,scrapy是通过hashlib算法转成长度一致的url,然后再通过set集合去重的,有兴趣看源码

去重的中间件在scrapy 的 dupefilters.py文件中:

  • 去重器
    RFDupeFilter()
  • 有个函数叫
    request_seen()#被scrapy/core/scheduler.py调用
  • 这个是调度器scheduler.py#文件中有个函数叫enqueue_request()的函数
    每来一个url就是通过这个函数来执行的

    • 每次执行之前都会调用到 request_seen(request) 这个方法这个方法就会生成一个指纹,指纹下面的掉用的就比较复杂了,简单的说就是要去执行 hashlib.sha1() 这个算法来生成一个固定长度的哈兮值
  • 再然后就是在那个去重器中的self.fingerprints = set()
    就是通过上句代码执行了set集合来去重了

telnet的简单使用

1.telnet简介:

Scrapy配有内置的telnet控制台,用于检查和控制Scrapy运行过程。telnet控制台只是在Scrapy进程中运行的常规python shell,所以你可以从中做任何事情。

2.windows打开telnet客户端和服务端:

3.telenet连接:

telnet控制台侦听TELNETCONSOLE_PORT设置中定义的TCP端口 ,默认为6023,如下:

telenet localhost 6023

4.telenet简单使用(相当于一个python终端)

变量:


文章 scrapy进阶(四)–scrapy暂停和重启,及url去重原理,telenet简单使用 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!