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