全新关机后,Scrapy SitemapSpider无法继续运行

时间:2019-03-14 14:43:34

标签: python web-scraping scrapy

我正在使用https://docs.scrapy.org/en/latest/topics/jobs.html中的文档,使用JOBSDIR运行可抓取的站点地图蜘蛛。

但是,我将执行干净关机ctrl + c(我已经多次检查这是一次干净关机,并且我没有两次发送ctrl + c),并且蜘蛛程序将无法继续。输出将显示“过滤的重复请求:example.com/sitemap.xml” 但JOBSDIR文件夹中仍然会存在大量看不见的请求和非常大的request.queue文件。

为什么要抓紧筛选出起点站点地图,而不是使用request.queue?显然,如果它过滤掉我提供的唯一网址,即站点地图,它将永远无法到达任何地方。有什么想法吗?

编辑:我正在做的一件事是从python脚本而不是从scrapy命令行启动我的蜘蛛。这样,也许我没有通过-s参数scrapy建议。 “ -s”是做什么的?该变量的文档在哪里?

    process = CrawlerProcess({'JOBDIR': '.jobs/alexa_site_' + str(alexa_site_id)})

    MySpider.set_settings(alexa_site)
    MySpider.custom_settings[
        'USER_AGENT'] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"

    process.crawl(MySpider, alexa_site_id=alexa_site_id)
    process.start()

这是蜘蛛代码:

class MySpider(SitemapSpider):
    custom_settings = {
        'RANDOMIZE_DOWNLOAD_DELAY': True,
        'MEMUSAGE_ENABLED': True,
        'DOWNLOAD_TIMEOUT': 20,
        'DEPTH_LIMIT': 100000,
        'LOG_LEVEL': 'CRITICAL',
        'DOWNLOADER_MIDDLEWARES': {
            'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
            'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
        },
        'ROTATING_PROXY_BAN_POLICY': 'spiders.classes.proxies.policy.MyPolicy',
        'ROTATING_PROXY_PAGE_RETRY_TIMES': 20,
        'ROTATING_PROXY_LOGSTATS_INTERVAL': 5,
        'ROTATING_PROXY_CLOSE_SPIDER': True,
        'RETRY_HTTP_CODES': [500, 502, 503, 504, 522, 524, 408, 403],
        'DEPTH_PRIORITY': 1,
        'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue',
        'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue',
        'TELNETCONSOLE_USERNAME': 'scrapy',
        'TELNETCONSOLE_PASSWORD': 'scrapy',
        'DUPEFILTER_DEBUG': True
    }

    name = None
    allowed_domains = []
    sitemap_urls = ['https://www.example.com/sitemap.xml']

    def parse(self, response):
        le = LinkExtractor()
        links = le.extract_links(response)
        for link in links:
            yield response.follow(link.ur, self.parse)

0 个答案:

没有答案