Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用CrawlerProcess时,open_spider方法运行两次_Python_Scrapy_Pymongo - Fatal编程技术网

Python 使用CrawlerProcess时,open_spider方法运行两次

Python 使用CrawlerProcess时,open_spider方法运行两次,python,scrapy,pymongo,Python,Scrapy,Pymongo,我想运行多个爬行器,所以我尝试使用CrawlerProcess。但是我发现方法open\u spider将在process\u item方法的开头和结尾运行两次 这导致当爬行器打开时,我删除我的集合并将数据保存到mongodb中。它最终会再次删除我的收藏 如何解决此问题,以及为什么方法open\u spider运行两次 I tyepscrapy crawl movies运行项目: 这是我的电影。py: # -*- coding: utf-8 -*- import scrapy from scra

我想运行多个爬行器,所以我尝试使用
CrawlerProcess
。但是我发现方法
open\u spider
将在
process\u item
方法的开头和结尾运行两次

这导致当爬行器打开时,我删除我的集合并将数据保存到mongodb中。它最终会再次删除我的收藏

如何解决此问题,以及为什么方法
open\u spider
运行两次

I tyep
scrapy crawl movies
运行项目:

这是我的电影。py:

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
import time

# scrapy api imports
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

from Tainan.FirstSpider import FirstSpider

class MoviesSpider(scrapy.Spider):
    name = 'movies'
    allowed_domains = ['tw.movies.yahoo.com', 'movies.yahoo.com.tw']
    start_urls = ['http://tw.movies.yahoo.com/movie_thisweek.html/']

process = CrawlerProcess(get_project_settings())

process.crawl(FirstSpider)
process.start()
这是我的第一只蜘蛛

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request


class FirstSpider(scrapy.Spider):
    name = 'first'
    allowed_domains = ['tw.movies.yahoo.com', 'movies.yahoo.com.tw']
    start_urls = ['http://tw.movies.yahoo.com/movie_thisweek.html/']

    def parse(self, response):
        movieHrefs = response.xpath('//*[@class="release_movie_name"]/a/@href').extract()       
        for movieHref in movieHrefs:
            yield Request(movieHref, callback=self.parse_page)

    def parse_page(self, response):
        print 'FirstSpider => parse_page'
        movieImage = response.xpath('//*[@class="foto"]/img/@src').extract()
        cnName = response.xpath('//*[@class="movie_intro_info_r"]/h1/text()').extract()
        enName = response.xpath('//*[@class="movie_intro_info_r"]/h3/text()').extract()
        movieDate = response.xpath('//*[@class="movie_intro_info_r"]/span/text()')[0].extract()
        movieTime = response.xpath('//*[@class="movie_intro_info_r"]/span/text()')[1].extract()
        imdbScore = response.xpath('//*[@class="movie_intro_info_r"]/span/text()')[3].extract()
        movieContent = response.xpath('//*[@class="gray_infobox_inner"]/span/text()').extract_first().strip()
        yield {'image': movieImage, 'cnName': cnName, 'enName': enName, 'movieDate': movieDate, 'movieTime': movieTime, 'imdbScore': imdbScore, 'movieContent': movieContent}
这是我的管道。py:

from pymongo import MongoClient
from scrapy.conf import settings

class MongoDBPipeline(object):

    global open_count
    open_count = 1
    global process_count
    process_count = 1

    def __init__(self):
        connection = MongoClient(
            settings['MONGODB_SERVER'],
            settings['MONGODB_PORT'])
        db = connection[settings['MONGODB_DB']]
        self.collection = db[settings['MONGODB_COLLECTION']]
    # My issue is here it will print open_spider count = 2 finally.
    def open_spider(self, spider):
        global open_count
        print 'Pipelines => open_spider count =>'
        print open_count
        open_count += 1
        self.collection.remove({})
    # open_spider method call first time and process_item save data to my mongodb.
    # but when process_item completed, open_spider method run again...it cause my data that i have saved it has been removed.
    def process_item(self, item, spider):
        global process_count
        print 'Pipelines => process_item count =>'
        print process_count
        process_count += 1
        self.collection.insert(dict(item))
        return item
我想不出来,有人能帮我,我会很感激的。提前谢谢

如何解决此问题,以及为什么方法
open\u spider
运行两次

open\u spider
方法对每个spider运行一次,您将运行两个spider

我点击
scrapy crawl movies
运行项目

crawl
命令将运行名为
movies
MoviesSpider
)的爬行器。
为此,它必须导入
movies
模块,这将导致它也运行
FirstSpider

现在,如何解决这一问题取决于您想做什么。
也许您应该只运行一个spider,或者每个spider都有单独的设置,或者完全不同的设置

如何解决此问题,以及为什么方法
open\u spider
运行两次

open\u spider
方法对每个spider运行一次,您将运行两个spider

我点击
scrapy crawl movies
运行项目

crawl
命令将运行名为
movies
MoviesSpider
)的爬行器。
为此,它必须导入
movies
模块,这将导致它也运行
FirstSpider

现在,如何解决这一问题取决于您想做什么。

也许你应该只运行一个spider,或者每个spider有单独的设置,或者完全不同的设置。

但是我在movies.py中没有
yield
任何数据,我只是在FirstSpider.py中
yield
它。我认为它应该运行一次
open\u spider
方法。生成数据并不重要
open_spider
在spider启动时调用,然后scrapy才知道它是否会返回任何项目。如果你不想让电影蜘蛛做任何事情,为什么要运行它呢?所以我运行了两个蜘蛛make
open\u spider
运行两次,我现在就得到了它!非常感谢你!但是我不会在movies.py中产生任何数据,我只是在FirstSpider.py中产生数据。我认为它应该运行一次
open\u spider
方法。生成数据并不重要
open_spider
在spider启动时调用,然后scrapy才知道它是否会返回任何项目。如果你不想让电影蜘蛛做任何事情,为什么要运行它呢?所以我运行了两个蜘蛛make
open\u spider
运行两次,我现在就得到了它!非常感谢你!