scrapy主动退出爬虫的代码片段(python3)

问题:在运行scrapy的过程中,如果想主动退出该怎么做?

背景:比如说我只要爬取当日的新闻,那么在遍历的时候,如果出现了超过1条不是当日的新闻,那么就不爬取了,就主动退出爬虫,这个时候该怎么做呢?

IDE:pycharm

版本:python3

框架:scrapy

系统:windows10

代码如下:

# -*- coding: utf-8 -*-
import scrapy
from torrentSpider.items.NavigationItem import NavigationItem
from torrentSpider.items.TorrentItem import TorrentItem
import time
import random
import logging
import os

class XxxSpider(scrapy.Spider):
    name = "xxx_spider"
    allowed_domains = [‘www.xxx.com‘]
    start_urls = [‘http://www.xxx.com/1.html‘]

    # 网站前缀
    web_pre_url = ‘http://xxx.com‘
    # 计数
    count = 0

    def parse(self, response):

        # 设置请求也随机延迟
        time.sleep(random.randint(0, 5))

        # 获取导航栏的数量
        navigation_type_number = response.xpath(‘//*[@id="hypoNav"]/div/ul/li/em/a/text()‘).extract()
        for n_k in range(1, len(navigation_type_number)):
            navigation_item = NavigationItem()
            # 网站标题
            navigation_item[‘navigation_title‘] = response.xpath(‘//*[@id="logoSea"]/div[1]/a/img/@alt‘).extract()[0]
            # 导航栏目分类名称
            navigation_item[‘navigation_type‘] = response.xpath(‘//*[@id="hypoNav"]/div/ul/li[‘+str(n_k+1)+‘]/em/a/text()‘).extract()[0]
            # 导航链接
            navigation_item[‘navigation_url‘] = response.xpath(‘//*[@id="hypoNav"]/div/ul/li[‘+str(n_k+1)+‘]/em/a/@href‘).extract()[0]

        # 获取子导航栏的数量
        sub_navigation_type_number = response.xpath(‘//*[@id="nodeNav"]/div/ul/li/em/a/span/text()‘).extract()
        for sub_k in range(1, len(sub_navigation_type_number)):
            sub_navigation_item = NavigationItem()
            # 网站标题
            sub_navigation_item[‘navigation_title‘] = response.xpath(‘//*[@id="logoSea"]/div[1]/a/img/@alt‘).extract()[0]
            # 副导航栏目分类名称
            sub_navigation_item[‘sub_navigation_type‘] = response.xpath(‘//*[@id="nodeNav"]/div/ul/li[‘+str(sub_k)+‘]/em/a/span/text()‘).extract()[0]
            # 副导航栏链接
            sub_navigation_item[‘sub_navigation_url‘] = response.xpath(‘//*[@id="nodeNav"]/div/ul/li[‘+str(sub_k)+‘]/em/a/@href‘).extract()[0]

        # 获取每页电影条目数长度
        movie_name_tr_array = response.xpath(‘/html/body/div[2]/table[1]/tr/td[1]/table[2]/tbody/tr‘).extract()
        for i_k in range(1, len(movie_name_tr_array)):
            # 子链接
            str_sub_url = ‘/html/body/div[2]/table[1]/tr/td[1]/table[2]/tbody/tr[‘+str(i_k)+‘]/td[1]/a/@href‘
            m_link = self.web_pre_url + response.xpath(str_sub_url).extract()[0]
            yield scrapy.Request(url=m_link, callback=self.parse_links, dont_filter=True)

        # 解析下一页
        next_link = response.xpath(‘//*[@class="pagegbk"]/@href‘).extract()
        if next_link:
            if len(next_link) == 1:
                next_link = next_link[0]
            else:
                next_link = next_link[1]
            yield scrapy.Request(self.web_pre_url + next_link, callback=self.parse)

    # 爬取子链接
    def parse_links(self, response):
        torrent_item = TorrentItem()
        # 标题
        torrent_item[‘torrent_title‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[1]/tbody/tr/td/font/text()‘)
        # 影片名称
        torrent_item[‘torrent_name‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[1]/text()‘)
        # 导演
        torrent_item[‘torrent_director‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[2]/text()‘)
        # 影片演员
        torrent_item[‘torrent_actor‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/span/font[2]/text()‘)
        # 语言
        torrent_item[‘torrent_language‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[3]/text()‘)
        # 影片类型
        torrent_item[‘torrent_type‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[4]/text()‘)
        # 影片地区
        torrent_item[‘torrent_region‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[5]/text()‘)
        # 更新时间
        torrent_item[‘torrent_update_time‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[6]/text()‘)
        # 影片状态
        torrent_item[‘torrent_status‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[7]/text()‘)
        # 上映日期
        torrent_item[‘torrent_show_time‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[1]/font[8]/text()‘)
        # 剧情介绍
        torrent_item[‘torrent_introduction‘] = self.check_xpath_value(response, ‘/html/body/div[2]/table[2]/tbody/tr/td/div[2]/text()‘)
        # 影片地址
        torrent_item[‘torrent_url‘] = self.check_xpath_value(response, ‘//*[@id="plist"]/table[2]/tbody/tr[2]/td/ul/li/input/@value‘)

        # 获取当前时间并格式化
        current_date = time.strftime(‘%Y-%m-%d‘, time.localtime())
        print(‘current_date = %s‘ % str(current_date))
        print(‘torrent_update_time = %s‘ % torrent_item[‘torrent_update_time‘])
        # 如果不是当天的就不爬取,并且计数
        if torrent_item[‘torrent_update_time‘] == str(current_date):
            yield torrent_item
        else:
            self.count = self.count + 1
            # 判断计数是否超过50,超过就不爬取了
            if self.count > 1:
                # logging.info("计数超过10,停止爬虫")
                self.crawler.engine.close_spider(self, ‘计数超过10,停止爬虫!‘)
            pass

    # 判断是否为空
    @staticmethod
    def check_xpath_value(response, xpath_url):
        xpath_value = response.xpath(xpath_url).extract()
        if xpath_value:
            if xpath_value[0].strip() != ‘‘:
                return xpath_value[0]
            else:
                return "null"
        else:
            return "null"

注意以上代码中标红的地方:

self.crawler.engine.close_spider(self, ‘计数超过10,停止爬虫!‘)

1,此行代码是写在spider文件中的

2,虽然这一行代码会停止爬虫,但是这一行代码的停止并不是立即停止

原因是因为当我们不更改爬虫的setting.py文件的时候,默认配置是:

# Configure maximum concurrent requests performed by Scrapy (default: 16)
# CONCURRENT_REQUESTS = 32

含义就是:Scrapy downloader 并发请求(concurrent requests)的最大值,默认: 16

那么这个时候的问题来了,按照以上的写法,在队列里就已经有十几个请求了,你停止之后,这十几个请求依旧会执行下去,所以并不是立即停止,如果想改变的话,就必须改变此项配置,设为:

CONCURRENT_REQUESTS = 1

具体scrapy爬虫原理请自行百度,并请自行调试,谢谢~

原文地址:https://www.cnblogs.com/huangtao1927/p/10278501.html

时间: 2024-10-29 18:15:15

scrapy主动退出爬虫的代码片段(python3)的相关文章

scrapy按顺序启动多个爬虫代码片段(python3)

问题:在运行scrapy的过程中,如果想按顺序启动爬虫怎么做? 背景:爬虫A爬取动态代理ip,爬虫B使用A爬取的动态代理ip来伪装自己,爬取目标,那么A一定要在B之前运行该怎么做? IDE:pycharm 版本:python3 框架:scrapy 系统:windows10 代码如下:(请自行修改) # !/usr/bin/env python3 # -*- coding:utf-8 -*- from scrapy import cmdline from twisted.internet impo

scrapy 主动停止爬虫

"""CloseSpider is an extension that forces spiders to be closed after certain conditions are met. See documentation in docs/topics/extensions.rst """ class CloseSpider(object): def __init__(self, crawler): self.crawler = craw

python爬虫实战:利用scrapy,短短50行代码下载整站短视频

近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题. 因为这个事儿,勾起了我另一个念头,这不最近一直想把python爬虫方面的知识梳理梳理吗,干脆借机行事,正凑着短视频火热的势头,做一个短视频的爬虫好了,中间用到什么知识就理一理. 我喜欢把事情说得很直白,如果恰好有初入门的朋友想了解爬虫的技术,可以将就看看,或许对你的认识会有提升.如果有高手路过,

第7章 Scrapy突破反爬虫的限制

7-1 爬虫和反爬的对抗过程以及策略 Ⅰ.爬虫和反爬虫基本概念 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法. 误伤:反爬虫技术将普通用户识别为爬虫,如果误伤过高,效果再高也不能用. 成本:反爬虫需要的人力和机器成本. 拦截:成功拦截爬虫,一般拦截率越高,误伤率越高. Ⅱ.反爬虫的目的 初级爬虫----简单粗暴,不管服务器压力,容易弄挂网站. 数据保护 失控的爬虫----由于某些情况下,忘记或者无法关闭的爬虫. 商业竞争对手 Ⅲ.爬虫和反爬虫对抗过程

C#程序员经常用到的10个实用代码片段 - 操作系统

原文地址  如果你是一个C#程序员,那么本文介绍的10个C#常用代码片段一定会给你带来帮助,从底层的资源操作,到上层的UI应用,这些代码也许能给你的开发节省不少时间.以下是原文: 1 读取操作系统和CLR的版本 1 OperatingSystem os = System.Environment.OSVersion; 2 Console.WriteLine("Platform: {0}", os.Platform); 3 Console.WriteLine("Service P

Android--新手必备的常用代码片段整理(二)

收集设备信息用于信息统计分析 是否有SD卡 动态隐藏软键盘 动态显示软键盘 动态显示或者是隐藏软键盘 主动回到Home后台运行 获取状态栏高度 获取状态栏高度标题栏ActionBar高度 获取MCCMNC代码 SIM卡运营商国家代码和运营商网络代码 返回移动网络运营商的名字 返回移动终端类型 判断手机连接的网络类型2G3G4G 判断当前手机的网络类型WIFI还是234G 收集设备信息,用于信息统计分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

python scrapy 简单的爬虫

1 scrapy的文档 比较简单 http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html 我假定你已经安装了Scrapy.假如你没有安装,你可以参考这篇文章. 在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容 1. 创建一个新的Scrapy Project scrapy creatproject "project-name" 2. 定义你需要从网页中提取的元素Item 3.实现一

【干货】Xcode 6 技巧: 矢量图像,代码片段以及其他

原文:Xcode 6 Tips: Vector Images, Code Snippets and Many More,译者:yuewang 目录: 一.Creating a Sample Project 二.更换Themes 三.添加自定义字体 四.代码片段 五.自定义调色板 六.使用矢量图 七.管理你的源代码 八.总结 作为一名开发者,无论你是职业的还是为了兴趣,毫无疑问的是你肯定会花无数的时间坐在显示器前等待你的工程完毕.感觉你正在使用的编程工具得心应手非常重要,因为它们是你的虚拟工作空间

Python scrapy 实现网页爬虫

Python scrapy 安装和网页爬虫功能实现 现在组内有个工作就是维护恶意URL库,然后这个维护工作,主要是通过从几个会发布恶意URL地址的网站获取恶意网址,每次都得花费半天,很乏味的事情.所以就想到能否用个爬虫搞定. 这两天研究了下python scrapy,发现利用scrapy的确很容易实现网址爬取功能. 一.scrapy安装 简单的说明一下scrapy的安装过程 window安装 先安装python,要提醒一下是环境变量的配置,只有环境变量配置对了,才能在命令行执行窗口找到pytho